LVMベースのKVMで仮想マシンを別のホストにリモートコピーする手順

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アドレス

KVMホストで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

参考URL

28.8. 新規の特有 MAC アドレスを生成