なにかの技術メモ置き場

なにかの技術メモ置き場

@インフラエンジニア

仮想化基盤のリプレース(ESXi to QEMU+KVM)

概要

仮想化基盤をVMware ESXiからQEMU+KVMにリプレースしたので、その操作をまとめた。
ゲストマシンの移行作業がメインとなる。

ユースケース

・仮想化基盤としてESXiを使用していたが、QEMU+KVMに変更したい。
・ESXi上のゲストマシンをQEMU+KVM上に移行したい(V2V)。

環境

構成

用途 ホスト名 OS 備考
移行元ホストマシン esxi01 ESXi 6.5 -
移行先ホストマシン kvm01 CentOS 8.1.1911 -
ゲストマシン(移行対象) guest01 CentOS 7.7.1908 -
ゲストマシン(テンプレート) t_centos7 CentOS 7.3.1611 テンプレートとして使用

作業イメージ図

f:id:none06:20200419173913p:plain

前提

移行元(ESXi)

・ゲストマシンのイメージをコピーしておくこと。

移行先(QEMU+KVM)

・仮想化基盤を構築済みであること。
・ゲストマシン(テンプレート)とゲストマシン(移行対象)のOSメジャーバージョンが同一であること。必須ではないが説明の簡略化のため。
・ゲストマシンへのVNC接続が伴うため、適宜有効化する。

操作

サマリ

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 が起動されました

普通に起動するのを待つ。
f:id:none06:20200419012149p:plain

ここでやや待たされる。
f:id:none06:20200419012155p:plain

見慣れたエラーが。
仮想化基盤が変わったことで、設定ファイルと実機とで不整合が発生しているように見受けられる。

Warning: dracut-initqueue timeout
Warning: /dev/disk/by-uuid/<UUID> does not exist

f:id:none06:20200419012204p:plain

ゲストマシンを再起動する。
※ゲストOS上でsystemctl reboot等しても再起動しなかった。

[root@kvm01 ~]# virsh destroy guest01; virsh start guest01
ドメイン guest01 は強制停止されました

ドメイン guest01 が起動されました

レスキュー用のinitramfsで起動する。
f:id:none06:20200419012209p:plain

起動時にエラーとなっていた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が起動した。
f:id:none06:20200419012227p:plain

参考:ゲスト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'/>

以降の手順は同様のため省略。

ぼやき

今まで理解不足で「KVM」と呼称してきたが、正しくは「QEMU+KVM」ではないか。
しかし、「centos qemu 構築」とググっても記事は少なく、「centos kvm 構築」とググると求める記事が出てくる。世論に従うことにしよう。
QEMUエミュレータ。ゲストマシンを動かす機構。単体で動作する。準仮想化。
KVM:仮想化を支援するモジュール。単体では動作しない。QEMUと組み合わせて使用することで完全仮想化が実現する。