第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-server
がyes
に セットされている場合、このパラメータ、(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-port
とxend-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-virt07
と et-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
これで、オフラインとライブの移行テストを正常に実行できました。