Я решил написать эту статью, потому что так и не сумел найти ничего более менее внятного на эту тему в интернет, а уж тем более на великом и могучем. Итак задача: настроить систему миграции виртуальной машины с одного сервера KVM на другой, без выключения виртуального сервера (тоесть live migration), и без общего хранилища (non-shared storage), это значит, что вместе с виртуальной машиной будет передан и образ ее жесткого диска с одного сервера на другой. Звучит здорово, поэтому приступаем. Мы имеем 2 сервера с Ubuntu 10.04 LTS (установка minimal), ибо LTS, а всякий мусор на сервере нам ни к чему. В качестве жестких дисков для виртуальных машин будут выступать LVM разделы, это обеспечивает лучшую скорость работы и большую гибкость. Наверняка в качестве дисков можно использовать и файлы, разница я думаю не велика, но у меня под рукой именно LVM. Для удобства именования, первый сервер назовем vm1 второй соответственно vm2, LVM на обоих серверах имеет Volume Group с именем «vg», и это важно, что бы имя было одинаковым. Итак приступим. Сразу скажу что миграция виртуальной машины в qemu-kvm доступна с версии 0.12.1, а libvirt поддерживает миграцию без общего хранилища с версии 0.8.3, тем не менее до сих пор такая востребованная функция как живая миграция без общего хранилища kvm с машины на машину нигде толком не описана, поэтому исправляю эту ошибку. Так как Ubuntu у нас имеет версию 10.04, то сооствественно она имеет старые версии и qemu-kvm и libvirt, которые не позволят нам сделать все что нужно, но не отчаивайтесь. Просто подключаем вот этот репозиторий https://launchpad.net/~nutznboltz/+archive/kvm-libvirt-lts после чего устанавливаем свежие версии libvirt и kvm
# echo «deb http://ppa.launchpad.net/nutznboltz/kvm-libvirt-lts/ubuntu lucid main» >> /etc/apt/sources.list.d/libvirt.list # echo «deb-src http://ppa.launchpad.net/nutznboltz/kvm-libvirt-lts/ubuntu» >> /etc/apt/sources.list.d/libvirt.list # aptitude update # aptitude install kvm libvirt-bin
Теперь мы имеем все необходимое что бы побаловать себя живой миграцией. Я не буду тут описывать как создается и настраивается виртуальная машина. Лучше сразу предположим, что она у нас есть. Пусть это будет Debian 6.0.1a, размещенный на Logical Volume с именем «debian», соответственно путь до данного раздела у нас /dev/vg/debian, хотя это итак понятно. Итак на vm1 у нас виртуальная машина с именем «debian6» и мы ее сейчас будет мигрировать. Живая миграция требовательна к нюансам. Окружение вирутальной машины должно полностью совпадать у источника и приемника данной машины. Например, если виртуалкой используется раздел /dev/vg/debian, но на целевой системе этот раздел должен присутствовать. Если к машине подключены ISO образы, то и на целевой машине они так же должны быть, и по тому же самому пути, а лучше ISO образы вообще отключить на время миграции. Тоже самое и с сетевыми настройками: названия бриджа в который подключена виртуалка должны совпадать на источнике и приемнике. Вообщем капризная эта KVM, но если вы хотите живую миграцию — будьте так любезны. Допустим мы отключили все ISO и бридж приемника у нас имеет тоже самое название, теперь сделаем так, что бы root одной машины мог безприпятственно заходить по SSH в качестве root другой машины. Это вообщем то не обязательно, тем не менее желательно. По умолчанию пароль root в Ubuntu отсутствует, поэтому будем использовать ключи SSH. Для этого делаем следующее.
[vm1]# ssh-keygen [vm1]# ssh-copy-id user@vm2 [vm2]# tail -1 /home/user/.ssh/authorized_keys >> /root/.ssh/authorized_keys
Обращаю пристальное внимание на то, что команды выполняются НА РАЗНЫХ машинах vm1 и vm2, если объяснить по простому, то мы просто генерируем SSH RSA ключ для пользователя root на машине vm1, после чего инсталируем его пользователю «user» машины vm2, а дальше на машине vm2 переносим последний добавленный ключ пользователя user, пользователю root. После этой процедуры пользователь root с vm1 будет входить по SSH как root@vm2 без запроса пароля. Такую же операцию проделываем и в обратную сторону. Теперь смотрим на нашу запущенную виртуалку на vm1
[vm1]# virsh list ID Имя Статус ———————————- 1 Debian6 выполнение
Значит машина запущена и работает, создаем на vm2 раздел того же размера что ни на vm1 и называем его так же, тоесть «debian», пусть у нас образ будет 8 Gb, на обеих хостах vm1 и vm2. Важно что бы раздел в который мигрирует виртаульная машина не был МЕНЬШЕ исходного.
[vm2]# lvcreate vg -ndebian -L8G
После чего можно начать миграцию
[vm1]# virsh migrate —live Debian6 qemu+ssh://root@vm2/system —copy-storage-all
Сразу скажу что переносимая виртуалка в процессе миграции резко теряет свою отзывчивость, и сеть между двумя хостами серьезно загружается. Так что имейте это в виду. Данная команда говорит о том что необходимо мигрировать, причем в живую (ключь —live), виртуалку с именем Debian6, и скопировать хранилище на удаленную машину (—copy-storage-all), если хранилище уже есть на хосте и достаточно свежо, то вместо копирования всего раздела, можно указать команду (—copy-storage-inc) и копирование будет инкиментальное, тоесть будет передана только измененная часть хранилища, что может существенно сэкономить время. Очень важно, так же не забыть ключь —live, потому как без него, система будет приостановлена, и запущена после миграции на другой системе. Вот собственно и вся наука.