В этом руководстве рассказывается как выполнить живую миграцию OpenVZ контейнера с одного хоста на другой. В этой статье оба сервера OpenVZ работают под управлением Debian Lenny, но в целом миграция на других системах ничем не отличается.
Предварительные заметки
Мы будем использовать следующие системыI’m using the following systems here:
- OpenVZ сервер 1 : server.example.com, IP адрес: 192.168.0.100
- OpenVZ сервер 2 : server2.example.com, IP адрес: 192.168.0.101
- виртуальная машина: vm1.example.com, IP адрес 192.168.0.102, VEID 102
Виртуальная машина запущена на сервере server1, имеет VEID 102.
Живая миграция виртуальной машины vm1.example.com с server1 на server2
Для проверки того, что миграция действительно “живая”, мы залогинимся на vm1.example.com и запустим ping на другой сервер:
vm1.example.com:
ping google.com
Пинг не должен пропасть в процессе миграции.
Спонсор статьи
Интересный и познавательный строительный блог. Свежая качественная информация о строительстве.
server1:
Живая миграция будет работать только если пользователь root с server1 может залогиниться на server2 через SSH без запроса пароля. Это можно обеспечить сгенерировать ключи для root@server1 и сохранив публичный ключи root@server1 в файл ~/.ssh/authorized_keys на сервере root@server2. К счастью, можно использовать упрощающий нам жизнь скрипт:
vi /usr/local/bin/ssh-keyput
#!/bin/bash # # ssh-keyput -- set up passwordless openssh login. # # Copyright (C) 2001, 2002, 2006 by SWsoft. # Author: Kir Kolyshkin # # This script is used to put your public ssh keys to another host's # authorized_keys[2], so you will be able to ssh login without entering # a password. Key pairs are generated if needed, and connectivity # is checked after putting the keys. PROGNAME=`basename $0` function usage() { echo "Usage: $PROGNAME [user@]IP [[user@]IP ...]" 1>&2 exit 0 } # Check for correct number of parameters test $# -gt 0 || usage; SSH_KEYGEN=`which ssh-keygen` if test $? -ne 0; then # Error message is printed by 'which' exit 1 fi SSH_DIR=~/.ssh if ! test -d $SSH_DIR; then mkdir $SSH_DIR fi chmod 700 $SSH_DIR if [ ! -f $SSH_DIR/identity ] || [ ! -f $SSH_DIR/identity.pub ]; then echo "Generating ssh1 RSA keys - please wait..." rm -f $SSH_DIR/identity $SSH_DIR/identity.pub $SSH_KEYGEN -t rsa1 -f $SSH_DIR/identity -P '' if [ $? -ne 0 ]; then echo "Command \"$SSH_KEYGEN -t rsa1 -f $SSH_DIR/identity" "-P ''\" failed" 1>&2 exit 1 fi else echo "ssh1 RSA key is present" fi if [ ! -f $SSH_DIR/id_dsa ] || [ ! -f $SSH_DIR/id_dsa.pub ]; then echo "Generating ssh2 DSA keys - please wait..." rm -f $SSH_DIR/id_dsa $SSH_DIR/id_dsa.pub $SSH_KEYGEN -t dsa -f $SSH_DIR/id_dsa -P '' if test $? -ne 0; then echo "Command \"$SSH_KEYGEN -t dsa -f $SSH_DIR/id_dsa" "-P ''\" failed" 1>&2 exit 1 fi else echo "ssh2 DSA key is present" fi SSH1_RSA_KEY=`cat $SSH_DIR/identity.pub` SSH2_DSA_KEY=`cat $SSH_DIR/id_dsa.pub` for IP in $*; do echo "You will now be asked for password for $IP" # set -x ssh -oStrictHostKeyChecking=no $IP "mkdir -p ~/.ssh; chmod 700 ~/.ssh; echo \"$SSH1_RSA_KEY\" >> ~/.ssh/authorized_keys; echo \"$SSH2_DSA_KEY\" >> ~/.ssh/authorized_keys2; chmod 600 ~/.ssh/authorized_keys ~/.ssh/authorized_keys2" # set +x if test $? -eq 0; then echo "Keys were put successfully" else echo "Error putting keys to $IP" 1>&2 fi done for IP in $*; do for ver in 1 2; do echo -n "Checking $IP connectivity by ssh$ver... " ssh -q -oProtocol=${ver} -oBatchMode=yes -oStrictHostKeyChecking=no $IP /bin/true if [ $? -eq 0 ]; then echo "OK" else echo "failed" 1>&2 fi done done
Делаем скрипт исполняемый…
chmod a+x /usr/local/bin/ssh-keyput
… И затем запускаем скрипт:
ssh-keyput 192.168.0.101
server1:~# ssh-keyput 192.168.0.101 Generating ssh1 RSA keys - please wait... Generating public/private rsa1 key pair. Your identification has been saved in /root/.ssh/identity. Your public key has been saved in /root/.ssh/identity.pub. The key fingerprint is: 5f:5b:17:0d:6b:17:9e:ae:b8:bf:87:37:d2:27:db:65 root@server1.example.com The key's randomart image is: +--[RSA1 2048]----+ | .. | | .o+| | o+o| | ....| | S . ...| | . ..o.. | | ....o E| | .o.Bo| | ..o*o+| +-----------------+ Generating ssh2 DSA keys - please wait... Generating public/private dsa key pair. Your identification has been saved in /root/.ssh/id_dsa. Your public key has been saved in /root/.ssh/id_dsa.pub. The key fingerprint is: 29:84:d2:0f:ed:9d:25:52:6f:09:f5:5f:c3:fd:eb:26 root@server1.example.com The key's randomart image is: +--[ DSA 1024]----+ | o.. | | . o . o o . .| | . + + . = . oo| | . = o * . .o| | + S . .| | . .| | . | | E.. | | o. | +-----------------+ You will now be asked for password for 192.168.0.101 root@192.168.0.101's password: Keys were put successfully Checking 192.168.0.101 connectivity by ssh1... failed Checking 192.168.0.101 connectivity by ssh2... OK server1:~#
Интересное
Все про отопление, системы отопления, теплый пол в ваш доме и многое другое. Рекомендую всем.
Запустим команду
vzlist -a
Вы должны увидеть единственную запущенную на данном сервере виртуальную машину:
server1:~# vzlist -a VEID NPROC STATUS IP_ADDR HOSTNAME 102 9 running 192.168.0.102 vm1.example.com server1:~#
Можем начинать миграцию:
vzmigrate --online 192.168.0.101 102
(Используйте IP адрес или имя хоста сервера назначения после опции –online. Последним аргументом указывается VEID виртуальной машины, в нашем случае 102.)
server1:~# vzmigrate --online 192.168.0.101 102 OPT:--online OPT:192.168.0.101 StartingPreparingInitializingSyncingLiveSyncingCleanup server1:~#
На протяжении миграции пинг гугла в виртуальной машине не должен прерываться.
После завершения посмотрим ещё раз список виртуальных машин:
vzlist -a
server1:~# vzlist -a VEID NPROC STATUS IP_ADDR HOSTNAME server1:~#
Как вы видите, vm1.example.com отсутствует на server1.
Проверим server2:
server2:
vzlist -a
server2:~# vzlist -a VEID NPROC STATUS IP_ADDR HOSTNAME 102 9 running 192.168.0.102 vm1.example.com server2:~#
Как вы видите это не такой уж и сложный процесс. Успехов в тестировании.
Источник: howtoforge.com
Постовой
Хорош работать, поиграй в yetisports 3. Это намного веселей :)