第18章 Xen ライブ移行

Xen hypervisor は para-virtualized ゲストと 完全仮想化ゲストのために 移行 をサポートします。移行は Red Hat Enterprise Linux 5.1 及びそれ以降のシステムで のみサポートされています。移行はオフライン、又はライブで実行できます。
  • オフライン移行はオリジナルホスト上の仮想化ゲストを休止して、それを目的地のホストへと 移動し、それからそのゲストが完全に転送された時点でそれを復帰します。オフライン移行は virsh migrate コマンドを使用します。
    # virsh migrate GuestName libvirtURI
  • ライブ移行では、送信元のホスト上でゲストの稼働を維持しながら、ゲストを停止 せずにメモリーの移動を始めます。そのイメージが送信された後で全ての修正済み メモリーページが追跡されて目的地まで送信されます。メモリーは変更のあったページで 更新を受けます。このプロセスはそれが発見的状況に到達するまで継続します。 それは全てのページが正常にコピーされるか、又は送信元の変化が速過ぎて、送信先の ホストが進展できない状態のどちらかです。発見的状況に到達した場合、ゲストは送信元ホストで一時的に休止して、レジスタとバッファが送信されます。レジスタは送信先のホストで ロードされてゲストはそれからその新しいホスト上で復帰します。ゲストがマージ出来ない 場合(ゲストの負荷が超過している場合に発生)、ゲストは一時停止して、それからは代わりに オフライン移行が開始されます。
    ライブ移行には virsh migrate コマンドで --live オプションを使用します。
    # virsh migrate--live GuestName libvirtURI

重要

移行は現時点では、Itanium® アーキテクチャ上でのサポートがありません。
Xen を使用した移行を有効にするには、 /etc/xen/xend-config.sxp の 設定ファイルにいくつかの変更が必要になります。 不正確な設定がセキュリティ問題になる可能性があるため、デフォルトでは移行は 無効になっています。移行ポートを開くと権限の無いホストが移行を開始したり、移行ポートに 接続したりできるようになります。移行要求用に認証と権限授与が設定されておらず、唯一の 制御メカニズムはホスト名と IP アドレスを基にしています。移行ポートが無許可のホストに アクセスされないように特別な注意が必要です。

重要

IP アドレスとホスト名のフィルタは最低限のセキュリティのみを提供します。これらの 属性は両方共、攻撃者が移行クライアントのアドレスとホスト名を知っていると偽造できます。移行のための最善のセキュリティはネットワークを、外部と権限の無い内部接続から隔離することです。
移行を有効にする

/etc/xen/xend-config.sxp 内で以下のエントリを修正して、 移行を有効にします。必要であれば値を修正して、以下のパラメータの前にあるコメント (# マーク)を削除します。

(xend-relocation-server yes)
移行を無効にするデフォルト値は、no です。xend-relocation-server の値を yes に 変更して移行を有効にします。
(xend-relocation-port 8002)
xend-relocation-serveryes に セットされている場合、このパラメータ、(xend-relocation-port)、は ポート xend が移動インターフェイスの 為に使用されるべきことを指定します。
この変数のデフォルト値は ほとんどのインストールで機能するはずです。この値を 変更する場合は、移動サーバー上で未使用のポートを使用することを確認して下さい。
xend-relocation-port パラメータでセットされたポートは両方の システムで開かれる必要があります。
(xend-relocation-address '')
(xend-relocation-address) は、 xend-relocation-server がセットされている場合に、 relocation-socket 接続の移行コマンドの為に、xend がリッスンするアドレスです。
デフォルト設定は全てのアクティブインターフェイスをリッスンします。(xend-relocation-address) パラメータは移行サーバーを制約して特定のインターフェイス だけをリッスンするようにできます。 /etc/xen/xend-config.sxp 内のデフォルト値は 空の文字列 ('') です。この値は単独の有効な IP アドレスで入れ替える必要があります。例えば:
(xend-relocation-address '10.0.0.1')
(xend-relocation-hosts-allow '')
(xend-relocation-hosts-allow 'hosts') パラメータはどのホスト名が移動ポート上で通信できるかを制御します。
SSH 又は TLS を使用しているのでなければ、ゲストの仮想メモリーは暗号化の無い通信で 生の状態で転送されます。xend-relocation-hosts-allow オプションを修正して、移行サーバーへのアクセスを制限します。
単独引用句で囲まれた空の文字列で示した上のサンプルのように、その値が空である場合、全ての接続が許可されます。これは、移動サーバーがリッスンするポートとインターフェイスに接続が到着することを想定します。(上述の xend-relocation-portxend-relocation-address も参照して下さい)
それ以外の場合は、(xend-relocation-hosts-allow) パラメータは空白で分離された正規表現の連続でなければなりません。 これらの正規表現の1つに一致する完全修飾ドメイン名、又は IP アドレスを持つ ホストはいずれも受理されます。
(xend-relocation-hosts-allow) 属性の サンプル:
(xend-relocation-hosts-allow '^localhost$ ^localhost\\.localdomain$')
使用する設定ファイル内でパラメータを設定した後は、Xen サービスを再スタートします。
# service xend restart

18.1. ライブ移行の例

以下にライブ移行の為の簡単な環境のセットアップの仕方の例を示します。 この設定では、共有ストレージの為に NFS を 使用します。NFS はデモ用の環境には適していますが、 実稼働用の環境には、ファイバーチャンネル又は、iSCSI と GFS を使用したより強健な共有ストレージが推奨されます。
以下の設定は2つのサーバーで構成されています(et-virt07et-virt08)。この両方は eth1 をそのデフォルトネットワークインターフェイスとして 使用しているため、xenbr1 をその Xen ネットワーキング ブリッジとして使用しています。この例では、et-virt07 上でローカルに取り付けた SCSI disk (/dev/sdb) をNFS を 介して共有ストレージ用に使用しています。
ライブ移行のセットアップ

移行に使用されるディレクトリを作成してマウントします:

# mkdir /var/lib/libvirt/images
# mount /dev/sdb /var/lib/libvirt/images

警告

ディレクトリが正しいオプションでエキスポートされることを確認してください。 デフォルトのディレクトリ、/var/lib/libvirt/images/ を エキスポートしている場合は、/var/lib/libvirt/images/ のみを エキスポートすることと、/var/lib/xen/ ではないこと を 確認して下さい。/var/lib/xen/ ディレクトリは xend デーモンと他のツールにより使用されるものであり、このディレクトリを共有すると、 予知できない動作を起こす可能性があります。
# cat /etc/exports
/var/lib/libvirt/images  *(rw,async,no_root_squash)
NFS を介してエキスポートされていることを確認します:
# showmount -e et-virt07
Export list for et-virt07:
/var/lib/libvirt/images *
ゲストをインストール

ゲストのインストールの為に使用されるサンプルのインストールコマンド:

# virt-install -p -f /var/lib/libvirt/images/testvm1.dsk -s 5 -n\
testvm1 --vnc -r 1024 -l http://example.com/RHEL5-tree\
Server/x86-64/os/ -b xenbr1
ステップバイステップのインストール案内には、7章ゲストオペレーティングシステムのインストール手順 を参照して下さい。
移行用の環境を確認

仮想化ネットワークブリッジが正しく設定されており、両方のホスト上で同じ名前を 持つことを確認します:

[et-virt08 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
xenbr1          8000.feffffffffff       no              peth1
vif0.1
[et-virt07 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
xenbr1          8000.feffffffffff       no              peth1
vif0.1
移動パラメータが両方のホスト上で設定されていることを確認します:
[et-virt07 ~]# grep xend-relocation /etc/xen/xend-config.sxp |grep -v '#'
(xend-relocation-server yes)
(xend-relocation-port 8002)
(xend-relocation-address '')
(xend-relocation-hosts-allow '')
[et-virt08 ~]# grep xend-relocation /etc/xen/xend-config.sxp |grep -v '#'
(xend-relocation-server yes)
(xend-relocation-port 8002)
(xend-relocation-address '')
(xend-relocation-hosts-allow '')
移動サーバーがスタートしたことと、Xen 移行 (8002) 用の専用ポートでリッスンしている ことを確認します:
[et-virt07 ~]# lsof -i :8002
COMMAND  PID  USER   FD   TYPE  DEVICE SIZE NODE NAME
python 3445 root 14u IPv4 10223 TCP *:teradataordbms (LISTEN)
[et-virt08 ~]# lsof -i :8002
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME
python 3252 root 14u IPv4 10901 TCP *:teradataordbms (LISTEN)
NFS ディレクトリが他のホストにマウントされていることと、仮想マシンイメージとファイルシステムが 可視であり、アクセスできることを確認します:
[et-virt08 ~]# df /var/lib/libvirt/images
Filesystem           1K-blocks      Used Available Use% Mounted on
et-virt07:/var/lib/libvirt/images    70562400   2379712  64598336   4% /var/lib/libvirt/images
[et-virt08 ~]# file /var/lib/libvirt/images/testvm1.dsk 
/var/lib/libvirt/images/testvm1.dsk: x86 boot sector; partition 1: ID=0x83,
active, starthead 1, startsector 63, 208782 sectors; partition 2: ID=0x8e, 
starthead 0, startsector 208845, 10265535 sectors, code offset 0x48
[et-virt08 ~]# touch /var/lib/libvirt/images/foo
[et-virt08 ~]# rm -f /var/lib/libvirt/images/foo
ゲストの保存と復元を確認します

仮想マシンをスタートします(まだ仮想マシンがオンでない場合):

[et-virt07 ~]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
[et-virt07 ~]# virsh start testvm1
Domain testvm1 started
仮想マシンが稼働していることを確認します:
[et-virt07 ~]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
testvm1        blocked
ローカルホスト上の仮想マシンを保存します:
[et-virt07 images]# time virsh save testvm1 testvm1.sav
real    0m15.744s
user    0m0.188s
sys     0m0.044s
[et-virt07 images]# ls -lrt testvm1.sav
-rwxr-xr-x 1 root root 1075657716 Jan 12 06:46 testvm1.sav
[et-virt07 images]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
ローカルホスト上で仮想マシンを復元します:
[et-virt07 images]# virsh restore testvm1.sav
[et-virt07 images]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
testvm1        blocked
domain-id のライブ移行を et-virt07 からet-virt08 へ開始します。移行先のホスト名と <domain-id> の部分は、有効な値で入れ替える必要があります。
[et-virt08 ~]# xm migrate --live domain-id et-virt07
仮想マシンが et-virt07 上でシャットダウンされたことを確認します。
[et-virt07 ~]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
仮想マシンが et-virt08 に移行されたことを確認します:
[et-virt08 ~]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
testvm1        blocked
進行具合をテストしてライブ移行を始動

仮想マシン内で以下のスクリプトを作成して、移行中に日付とホスト名をログ します。このスクリプトはゲストのファイルシステム上で I/O タスクを実行します。

#!/bin/bash

while true
do
touch /var/tmp/$$.log
echo `hostname` >>  /var/tmp/$$.log
        echo `date`     >>  /var/tmp/$$.log
        cat  /var/tmp/$$.log
        df /var/tmp
        ls -l  /var/tmp/$$.log
        sleep 3
        done
スクリプトは単にテスト目的だけのためであり、実稼働環境でのライブ移行には 不要であることを忘れないで下さい。
仮想マシンを et-virt07 に移行する前に、 それが et-virt08 上で稼働していることを確認します:
[et-virt08 ~]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
testvm1        blocked
et-virt07 へのライブ移行を始動します。 time コマンドを追加すると、移行にかかる時間を見ることができます:
[et-virt08 ~]# xm migrate --live testvm1 et-virt07
ゲスト内でスクリプトを実行します:
# ./doit
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:26:27 EST 2007
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2983664   2043120    786536  73% /
-rw-r--r-- 1 root root 62 Jan 12 02:26 /var/tmp/2279.log
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:26:27 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:26:30 EST 2007
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2983664   2043120    786536  73% /
-rw-r--r-- 1 root root 124 Jan 12 02:26 /var/tmp/2279.log
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:26:27 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:26:30 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:26:33 EST 2007
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2983664   2043120    786536  73% /
-rw-r--r-- 1 root root 186 Jan 12 02:26 /var/tmp/2279.log
Fri Jan 12 02:26:45 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:26:48 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:26:51 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:54:57 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:55:00 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:55:03 EST 2007
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2983664   2043120    786536  73% /
-rw-r--r-- 1 root root 744 Jan 12 06:55 /var/tmp/2279.log
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:26:27 EST 2007
仮想マシンが et-virt08 上でシャットダウンされたことを確認します:
[et-virt08 ~]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
仮想マシンが et-virt07 上でスタートしたことを確認します:
[et-virt07 images]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
testvm1        blocked
et-virt07 から et-virt08 へと もう 1度移行サイクルを実行します。et-virt07 から et-virt08 への移行を以下のようにして開始します:
[et-virt07 images]# xm migrate --live testvm1 et-virt08
仮想マシンがシャットダウンされたことを確認します:
[et-virt07 images]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
移行を初めて執行する前に、ゲスト内で簡単なスクリプトを開始して、ゲストが 移行するときの時間の変化に注意します:
# ./doit
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:53 EST 2007
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2983664   2043120    786536  73% /
-rw-r--r-- 1 root root 62 Jan 12 06:57 /var/tmp/2418.log
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:53 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:56 EST 2007
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2983664   2043120    786536  73% /
-rw-r--r-- 1 root root 124 Jan 12 06:57 /var/tmp/2418.log
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:53 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:56 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:58:00 EST 2007
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2983664   2043120    786536  73% /
-rw-r--r-- 1 root root 186 Jan 12 06:57 /var/tmp/2418.log
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:53 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:56 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:58:00 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:30:00 EST 2007
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2983664   2043120    786536  73% /
-rw-r--r-- 1 root root 248 Jan 12 02:30 /var/tmp/2418.log
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:53 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:56 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:58:00 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:30:00 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:30:03 EST 2007
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2983664   2043120    786536  73% /
-rw-r--r-- 1 root root 310 Jan 12 02:30 /var/tmp/2418.log
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:53 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:57:56 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 06:58:00 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:30:00 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:30:03 EST 2007
dhcp78-218.lab.boston.redhat.com
Fri Jan 12 02:30:06 EST 2007
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
2983664   2043120    786536  73% /
-rw-r--r-- 1 root root 372 Jan 12 02:30 /var/tmp/2418.log
移行コマンドが et-virt07 上で完了すると、 et-virt08 上で仮想マシンがスタートしたことを 確認します:
[et-virt08 ~]# virsh list
 Id Name                 State
----------------------------------
Domain-0                 running
testvm1        blocked
そしてもう1つのサイクルを実行します:
[et-virt08 ~]# time virsh migrate --live testvm1 et-virt07
real    0m10.378s
user    0m0.068s
sys     0m0.052s
これで、オフラインとライブの移行テストを正常に実行できました。