LVMを利用して構築したKVMの仮想マシンを、KVMホスト間で複製する手順です。
関連ホスト
サーバ | 備考 |
---|---|
vm01 | host01のKVM上の仮想マシン |
host01 | KVMホスト(vm01のコピー元) |
host02 | KVMホスト(vm01のコピー先) |
host01上での作業
仮想マシン情報確認
こちらの仮想マシンを移動します。
# virsh list --all Id 名前 状態 ---------------------------------------------------- 1 vm01 実行中
対象の仮想マシンのdevice名を取得しておきます。
virsh -c qemu:///system dumpxml vm01 | grep "source dev" <source dev='/dev/vm_vg/lv_vm01' />
Deviceの容量を確認します。
# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
lv_vm01 vm_vg owi-a-s-- 40.00g
仮想マシンvm01のスナップショット取得
vm01を停止します。またはvirsh suspendで一時停止にしても大丈夫です。
# shutdown -h now # vm01上で実行 or # virsh shutdown vm01 or # virsh suspend vm01
Snapshotの作成をします。この処理自体はほとんど時間かかりません。 サイズはスナップショットのサイズなので作業時にvm01で発生する変更データ分の容量があればOKです。
例えば、新規に1GBのファイルを作成すると更新分の1GBが消費されることになります。
# lvcreate -s -n vm01-snapshot -L 10G /dev/vm_vg/lv_vm01 Logical volume "vm01-snapshot" created
停止していたvm01を起動します。vm01のダウンタイムはここまでになります。
# virsh start vm01 or # virsh resume vm01 # Suspendしていた場合
snapshotが作成されているのが確認できます。Data%の項目がスナップショットの容量になります。ここが100%になる前に作業完了させます。またはスナップショットのサイズを増やします。
# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
lv_vm01 vm_vg owi-a-s-- 40.00g
vm01-snapshot vm_vg swi-a-s-- 10.00g vm01 0.42
host02での作業
host01上のvm01、同サイズのLVをhost02に作成します。
# lvcreate -L 40G -n lv_vm01 vm_vg # lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert lv_vm01 vm_vg -wi-a---- 40.00g
仮想マシンコピーの実行
データのコピー
ssh経由のddでhost01上のsnapshotからhost02に新規作成したLVにデータを流し込みます。コマンドはhost02上で実行します。
ssh host01 dd if=/dev/vm_vg/vm01-snapshot | dd of=/dev/vm_vg/lv_vm01
コピーが始ますが進行状況等は表示されません。表示したい場合はhost02で別のコンソールを立ち上げて以下のコマンドを実行します。
pkill -USR1 dd
ddを実行している方のコンソールに進捗状況が表示されます。
20465353+0 records in 20465353+0 records out 10478260736 bytes (10 GB) copied, 131.729 s, 79.5 MB/s
定義ファイル
定義ファイルコピー
vm01の定義ファイルをhost01からhost02にコピーします。
scp host01:/etc/libvirt/qemu/vm01.xml /etc/libvirt/qemu/
定義ファイル修正
仮想マシン名
仮想マシン名を新しく設定したい場合はnameのタグを修正します。
<name>your_new_vm_name</name>
LV名
host1とhost2でLVの名前が異なる場合は定義ファイルを編集します。
<source dev='/dev/vm_vg/lv_sys-test02'/>
MACアドレス
# echo 'import virtinst.util ; print virtinst.util.randomMAC()' | python 00:16:3e:82:73:e5
生成したMACアドレスを元に定義ファイルを修正します。
<mac address='00:16:3e:82:73:e5'/>
仮想マシン登録
修正した定義ファイルを利用して仮想マシンを登録します。
# virsh define /etc/libvirt/qemu/vm01.xml
登録されました。
# virsh list --all Id 名前 状態 ---------------------------------------------------- 10 vm01 シャットオフ
起動します。
# virsh start vm01
ネットワーク調整
この時点ではネットワークが繋がりませんので、コンソールに繋ぎます。
# virsh console vm01
NICの設定に新しいIPアドレスと生成したMACアドレスを設定します。
# vi /etc/sysconfig/network-scripts/ifcfg-eth0 IPADDR="XXX.XXX.XXX.XXX" HWADDR="00:16:3e:82:73:e5"
udevの設定も削除します。
# mv /etc/udev/rules.d/70-persistent-net.rules /tmp/
後はrebootすればネットワークが利用できるようになります。ここまで来るとSSHで繋げるようになっていzます。コンソールは「Ctrl+]」で抜けられます。
# reboot
host01のスナップショットの削除
忘れずにスナップショットも削除しておきます。
# lvremove /dev/vm_vg/vm01-snapshot