Я использую KVM (на самом деле через libvirt) для исследовательского проекта. Мы переносим виртуальную машину между разными подсетями в реальном времени, поэтому после миграции необходимо обновить IP-адрес и таблицы маршрутизации, иначе виртуальная машина будет недоступна в новой подсети. Наша цель - сделать это как можно быстрее.
В настоящее время я использую ssh через локальный IPv6-адрес для подключения к виртуальной машине после динамической миграции. Затем он запускает сценарий, который назначает новый IP-адрес и шлюз. Но это добавляет много ненужных накладных расходов.
Я бы хотел, чтобы демон на виртуальной машине обнаружил, что живая миграция только что завершилась. Могу ли я использовать какие-нибудь крючки?
Если я правильно помню, по завершении миграции виртуальная машина должна отправить бесплатный пакет, объявляя о себе. В любом случае, пока не обновятся таблицы arp, всегда будет небольшая задержка, а не виртуальная машина -> сеть, а сеть -> виртуальная машина
Что вы можете сделать, так это поймать "прибывающую" виртуальную машину с помощью опроса virsh dominfo
Виртуальная машина, мигрирующая на хост, сначала будет отображаться как «приостановленная», и как только она будет «запущена», вы поймете, что миграция завершена. на цели вы должны получить событие запуска домена с подробностями о том, что он был перенесен, а в источнике вы должны получить остановленное / перенесенное событие
Лучшим способом было бы использовать что-то вроде http://libvirt.org/git/?p=libvirt.git;a=blob;f=examples/domain-events/events-python/event-test.py на цели вы должны получить событие запуска домена с подробностями о том, что он был перенесен, а в источнике вы должны получить остановленное / перенесенное событие
Это лучший вариант для обнаружения события миграции libvirt с использованием подходящего API.
Поймать миграции изнутри виртуальной машины невозможно, потому что вся идея живой миграции заключается в том, что виртуальная машина не знает об этом и не должна ощущать миграцию.
Если бы вы выполняли разметку гостевой влан-сети, вы бы увидели это изменение и могли бы написать такой сценарий. В качестве альтернативы вы можете использовать DHCP-сервер с высокой степенью назначения портов для обеих / всех VLAN с одним и тем же MAC-адресом, указанным в нескольких областях, после чего вы можете просто запустить обновление при изменении vlan.
Я думаю, что во время такой миграции вы увидите что-то в dmesg. Можете ли вы проверить и увидеть, сделаете ли вы? Если так, то это довольно легко запустить, либо написав быстрый и грязный модуль ядра, либо просто выбрав оперативный путь написания демона сценария оболочки для наблюдения за dmesg.