環境
構成
作業イメージ図
前提
移行元(ESXi)
・ゲストマシンのイメージをコピーしておくこと。
操作
サマリ
1.ゲストマシンのイメージの移行
2.ゲストマシンのイメージの変換
3.ゲストマシンの起動
1.ゲストマシンのイメージの移行
ゲストマシンのイメージを移行先ホストマシンに配置する。
※移行元ホストマシン上のパスはTBD。
[root@kvm01 ~]# ls -lh /tmp/guest01_0-flat.vmdk -rw-------+ 1 nobody nobody 20G 12月 25 23:27 /tmp/guest01_0-flat.vmdk
2.ゲストマシンのイメージの変換
まず、ゲストマシンの定義ファイルを作成しておきたい。
他のゲストマシンかをクローニングすることで作成する。
※他のゲストマシンの定義ファイルをコピーすることも可能だが、正規手順じゃない感がある。詳細は後述する。
[root@kvm01 ~]# virt-clone --original t_centos7 --name guest01 --file /var/lib/libvirt/images/guest01.img 割り当て中 'guest01.img' 0% [ ] 0 B/s | 56 MB --:--:-- ・・・ 割り当て中 'guest01.img' 9% [=== ] 328 kB/s | 2.0 GB 15:58:08 割り当て中 'guest01.img' | 20 GB 00:01:00 'guest01' のクローニングに成功しました。
これを作りたかった。
[root@kvm01 ~]# ls -l /etc/libvirt/qemu/guest01.xml -rw-------. 1 root root 5972 4月 18 16:48 /etc/libvirt/qemu/guest01.xml
イメージもクローンされてしまうが、これは不要。次の手順で上書きするので放置する。
[root@kvm01 ~]# ls -l /var/lib/libvirt/images/guest01.img -rw-------. 1 root root 1345060864 4月 18 16:49 /var/lib/libvirt/images/guest01.img
ESXiのイメージをQEMUのイメージに変換する。
[root@kvm01 ~]# qemu-img convert /tmp/guest01_0-flat.vmdk -O qcow2 /var/lib/libvirt/images/guest01.img [root@kvm01 ~]# ls -lh /var/lib/libvirt/images/guest01.img -rw-r--r--. 1 root root 2.6G 4月 18 13:44 /var/lib/libvirt/images/guest01.img
イメージのフォーマットが変換されていることがわかる。
[root@kvm01 ~]# qemu-img info /tmp/guest01_0-flat.vmdk image: /tmp/guest01_0-flat.vmdk file format: raw virtual size: 20G (21474836480 bytes) disk size: 20G
[root@kvm01 ~]# qemu-img info /var/lib/libvirt/images/guest01.img image: /var/lib/libvirt/images/guest01.img file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 2.6G cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false refcount bits: 16 corrupt: false
3.ゲストマシンの起動
移行先ホストマシンにゲストマシンを登録する。
[root@kvm01 ~]# virsh define /etc/libvirt/qemu/guest01.xml ドメイン guest01 が /etc/libvirt/qemu/guest01.xml から定義されました
ゲストマシンを起動する。
[root@kvm01 ~]# virsh start guest01 ドメイン guest01 が起動されました
普通に起動するのを待つ。
ここでやや待たされる。
見慣れたエラーが。
仮想化基盤が変わったことで、設定ファイルと実機とで不整合が発生しているように見受けられる。
Warning: dracut-initqueue timeout
Warning: /dev/disk/by-uuid/<UUID> does not exist
ゲストマシンを再起動する。
※ゲストOS上でsystemctl reboot等しても再起動しなかった。
[root@kvm01 ~]# virsh destroy guest01; virsh start guest01 ドメイン guest01 は強制停止されました ドメイン guest01 が起動されました
レスキュー用のinitramfsで起動する。
起動時にエラーとなっていたUUIDが示すものを確認する。ルートパーティションを示していることがわかる。
※わかったところで今回はこの情報を活用するシーンはない。ただの状況分析。
[root@guest01 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Jul 7 15:05:05 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=255e912c-30f6-4ff6-9114-6c527eb5e145 / xfs defaults 0 0
UUID=5135eb87-2c27-4dc5-8dd7-af4473a5cf8b /boot xfs defaults 0 0
UUID=1045334c-e4f2-42b3-bcd9-77ed06bb7858 swap swap defaults 0 0
[root@guest01 ~]# blkid /dev/vda1: UUID="5135eb87-2c27-4dc5-8dd7-af4473a5cf8b" TYPE="xfs" /dev/vda2: UUID="1045334c-e4f2-42b3-bcd9-77ed06bb7858" TYPE="swap" /dev/vda3: UUID="255e912c-30f6-4ff6-9114-6c527eb5e145" TYPE="xfs" /dev/vdb1: UUID="2019-09-11-19-02-53-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" /dev/vdb2: SEC_TYPE="msdos" LABEL="ANACONDA" UUID="79B1-8EA0" TYPE="vfat"
[root@guest01 ~]# parted -l モデル: Virtio Block Device (virtblk) ディスク /dev/vda: 21.5GB セクタサイズ (論理/物理): 512B/512B パーティションテーブル: msdos ディスクフラグ: 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 1049kB 525MB 524MB primary xfs boot 2 525MB 2673MB 2147MB primary linux-swap(v1) 3 2673MB 21.5GB 18.8GB primary xfs
initramfsを再作成する。
[root@guest01 ~]# ls -l /boot/initramfs-* -rw-------. 1 root root 45275996 7月 8 2017 /boot/initramfs-0-rescue-9fb144ff8acf4c178a6a37bafcd4b2b2.img -rw------- 1 root root 18367783 1月 18 2018 /boot/initramfs-3.10.0-514.26.2.el7.x86_64.img -rw------- 1 root root 17996011 7月 8 2017 /boot/initramfs-3.10.0-514.el7.x86_64.img -rw------- 1 root root 18437420 1月 18 2018 /boot/initramfs-3.10.0-693.11.6.el7.x86_64.img -rw------- 1 root root 18122206 1月 27 2018 /boot/initramfs-3.10.0-693.17.1.el7.x86_64.img [root@guest01 ~]# [root@guest01 ~]# mv /boot/initramfs-3.10.0-693.17.1.el7.x86_64.img{,_old} [root@guest01 ~]# [root@guest01 ~]# ls -l /boot/initramfs-* -rw-------. 1 root root 45275996 7月 8 2017 /boot/initramfs-0-rescue-9fb144ff8acf4c178a6a37bafcd4b2b2.img -rw------- 1 root root 18367783 1月 18 2018 /boot/initramfs-3.10.0-514.26.2.el7.x86_64.img -rw------- 1 root root 17996011 7月 8 2017 /boot/initramfs-3.10.0-514.el7.x86_64.img -rw------- 1 root root 18437420 1月 18 2018 /boot/initramfs-3.10.0-693.11.6.el7.x86_64.img -rw------- 1 root root 18122206 1月 27 2018 /boot/initramfs-3.10.0-693.17.1.el7.x86_64.img_old [root@guest01 ~]# [root@guest01 ~]# dracut /boot/initramfs-3.10.0-693.17.1.el7.x86_64.img 3.10.0-693.17.1.el7.x86_64 [root@guest01 ~]# [root@guest01 ~]# ls -l /boot/initramfs-* -rw-------. 1 root root 45275996 7月 8 2017 /boot/initramfs-0-rescue-9fb144ff8acf4c178a6a37bafcd4b2b2.img -rw------- 1 root root 18367783 1月 18 2018 /boot/initramfs-3.10.0-514.26.2.el7.x86_64.img -rw------- 1 root root 17996011 7月 8 2017 /boot/initramfs-3.10.0-514.el7.x86_64.img -rw------- 1 root root 18437420 1月 18 2018 /boot/initramfs-3.10.0-693.11.6.el7.x86_64.img -rw------- 1 root root 18368778 4月 18 14:28 /boot/initramfs-3.10.0-693.17.1.el7.x86_64.img -rw------- 1 root root 18122206 1月 27 2018 /boot/initramfs-3.10.0-693.17.1.el7.x86_64.img_old
なお、dracutコマンドで指定したカーネルバージョンは、以下のディレクトリに存在するものから選択できる。
[root@guest01 ~]# ls -l /lib/modules 合計 16 drwxr-xr-x 7 root root 4096 7月 8 2017 3.10.0-514.26.2.el7.x86_64 drwxr-xr-x. 7 root root 4096 7月 8 2017 3.10.0-514.el7.x86_64 drwxr-xr-x 7 root root 4096 1月 18 2018 3.10.0-693.11.6.el7.x86_64 drwxr-xr-x 7 root root 4096 1月 27 2018 3.10.0-693.17.1.el7.x86_64
OSを再起動する。
[root@guest01 ~]# systemctl reboot
無事ゲストOSが起動した。
参考:ゲストOSのネットワーク設定移行
CentOS7のネットワークインターフェース名の形式は、ESXi6.5ではensXXXであったが、KVMではethXになっていた。
以下に比較的容易に変換(移行)する操作を例示しておく。
コマンド
nmcli connection modify <移行前の名称> con-name <移行後の名称> ifname <移行後の名称>
移行前の名称 | 移行後の名称 |
---|---|
ens160 | eth0 |
ens192 | eth2 |
操作
[root@guest01 ~]# nmcli connection show 名前 UUID タイプ デバイス 有線接続 1 a73f3223-c876-3462-8580-42023b523990 802-3-ethernet eth0 有線接続 2 eaa81556-3058-3960-bfff-f6e27cc5cd5c 802-3-ethernet eth1 有線接続 3 6e72d2ef-260d-3c95-9186-3997ac5f743f 802-3-ethernet eth2 ens160 4cf1e98f-9096-41ce-ba30-351c76b31054 802-3-ethernet -- ens192 fc516cbd-e864-4390-89ed-ec77230ade31 802-3-ethernet -- [root@guest01 ~]# [root@guest01 ~]# nmcli connection modify ens160 con-name eth0 ifname eth0 [root@guest01 ~]# nmcli connection modify ens192 con-name eth2 ifname eth2 [root@guest01 ~]# [root@guest01 ~]# nmcli connection show 名前 UUID タイプ デバイス 有線接続 1 a73f3223-c876-3462-8580-42023b523990 802-3-ethernet eth0 有線接続 2 eaa81556-3058-3960-bfff-f6e27cc5cd5c 802-3-ethernet eth1 有線接続 3 6e72d2ef-260d-3c95-9186-3997ac5f743f 802-3-ethernet eth2 eth0 4cf1e98f-9096-41ce-ba30-351c76b31054 802-3-ethernet -- eth2 fc516cbd-e864-4390-89ed-ec77230ade31 802-3-ethernet -- [root@guest01 ~]# [root@guest01 ~]# systemctl reboot ・・・ [root@guest01 ~]# nmcli connection show 名前 UUID タイプ デバイス eth0 4cf1e98f-9096-41ce-ba30-351c76b31054 802-3-ethernet eth0 eth2 fc516cbd-e864-4390-89ed-ec77230ade31 802-3-ethernet eth2 有線接続 1 5419339a-bf2e-384e-9c38-db7d74116f36 802-3-ethernet eth1 [root@guest01 ~]# [root@guest01 ~]# nmcli connection delete 有線接続\ 1 接続 '有線接続 1' (5419339a-bf2e-384e-9c38-db7d74116f36) が正常に削除されました。 [root@guest01 ~]# [root@guest01 ~]# nmcli connection show 名前 UUID タイプ デバイス eth0 4cf1e98f-9096-41ce-ba30-351c76b31054 802-3-ethernet eth0 eth2 fc516cbd-e864-4390-89ed-ec77230ade31 802-3-ethernet eth2 [root@guest01 ~]#
参考:virt-cloneはどんな処理をしている?
仕様は未確認だが、実態として以下の処理をしているように見受けられる。
コマンド
virt-clone --original XXX.img --name XXX --file XXX.img
処理
・イメージを(.img)のコピー
・定義ファイル(.xml)のコピー
・ゲストマシン間でユニークである必要のある情報の自動調整(ゲストマシンのUUID、ネットワークインターフェースのMACアドレス、等?)
[root@kvm01 ~]# diff /etc/libvirt/qemu/t_centos7.xml /etc/libvirt/qemu/guest01.xml 4c4 < virsh edit t_centos7 --- > virsh edit guest01 9,10c9,10 < <name>t_centos7</name> < <uuid>f2378229-3eaa-4258-98c6-8150ab6bd785</uuid> --- > <name>guest01</name> > <uuid>b4974ec6-df95-407e-8d84-4ab32f6c4552</uuid> 46c46 < <source file='/var/lib/libvirt/images/t_centos7.img'/> --- > <source file='/var/lib/libvirt/images/guest01.img'/> 106c106 < <mac address='52:54:00:e0:9e:55'/> --- > <mac address='52:54:00:f5:2e:75'/> 112c112 < <mac address='52:54:00:a3:23:21'/> --- > <mac address='52:54:00:da:30:af'/> 118c118 < <mac address='52:54:00:5c:29:d1'/> --- > <mac address='52:54:00:92:f5:64'/>
応用
これを逆手にとり、virt-cloneをせずにゲストマシンを移行することもできる。
ゲストマシンの定義ファイルをテンプレートのゲストマシンからコピーする。
[root@kvm01 ~]# cp -p /etc/libvirt/qemu/t_centos7.xml /etc/libvirt/qemu/guest01.xml
ノード名を変更する。
[root@kvm01 ~]# sed -i 's/t_centos7/guest01/g' /etc/libvirt/qemu/guest01.xml
UUIDとMACアドレスを削除する。
[root@kvm01 ~]# vi /etc/libvirt/qemu/guest01.xml ※内容はdiff結果を参照。
変更内容を確認する。
[root@kvm01 ~]# diff /etc/libvirt/qemu/t_centos7.xml /etc/libvirt/qemu/guest01.xml 4c4 < virsh edit t_centos7 --- > virsh edit guest01 9,10c9 < <name>t_centos7</name> < <uuid>74ee63be-5808-40a6-ab7b-4f43e553164e</uuid> --- > <name>guest01</name> 46c45 < <source file='/var/lib/libvirt/images/t_centos7.img'/> --- > <source file='/var/lib/libvirt/images/guest01.img'/> 113d111 < <mac address='52:54:00:e0:9e:55'/> 119d116 < <mac address='52:54:00:a3:23:21'/> 125d121 < <mac address='52:54:00:5c:29:d1'/>
ゲストマシンを登録する。
[root@kvm01 ~]# virsh define /etc/libvirt/qemu/guest01.xml ドメイン guest01 が /etc/libvirt/qemu/guest01.xml から定義されました
ここ注目。定義ファイルを再度diffしてみると、先ほどは無かった差分が表示される。
UUIDとMACアドレスがユニークな値で自動生成されていることがわかる。
[root@kvm01 ~]# diff /etc/libvirt/qemu/t_centos7.xml /etc/libvirt/qemu/guest01.xml 4c4 < virsh edit t_centos7 --- > virsh edit guest01 9,10c9,10 < <name>t_centos7</name> < <uuid>74ee63be-5808-40a6-ab7b-4f43e553164e</uuid> --- > <name>guest01</name> > <uuid>2eb880c9-0e77-451e-a9ee-dbeae6f018e2</uuid> 46c46 < <source file='/var/lib/libvirt/images/t_centos7.img'/> --- > <source file='/var/lib/libvirt/images/guest01.img'/> 113c113 < <mac address='52:54:00:e0:9e:55'/> --- > <mac address='52:54:00:c4:ff:73'/> 119c119 < <mac address='52:54:00:a3:23:21'/> --- > <mac address='52:54:00:ef:39:41'/> 125c125 < <mac address='52:54:00:5c:29:d1'/> --- > <mac address='52:54:00:c3:e2:42'/>
以降の手順は同様のため省略。