virt-cloneでKVMの仮想マシンを複製
目次
概要
KVMの仮想化環境を運用する場合、稼働させる仮想マシンのOSを毎回インストールするのは面倒です。 仮想マシンイメージ・ファイルが無料で公開されているので、ダウンロードして利用することもできますが、 公開されている仮想マシンイメージにどのパッケージがインストールされてどうセットアップされているの分からないので ちょっと使うモチベーションが沸かなかったりします。 自分好みにインストールしてセットアップしたOSをベースに複製して使いたい場合は、 virt-install コマンドでKVMの仮想マシンを作成した後に、OSをインストール、初期設定したうえで virt-clone コマンドで仮想マシンを複製します。 今回は複製元の仮想マシンが存在する状態で virt-clone コマンドで仮想マシンを複製します。 仮想マシンを単純に複製すると複製元の仮想マシンとIPアドレスが重複するので、複製後にIPアドレスを変更します。
構成
サーバ構成
Raspberry Pi 4 model B 8GBモデルにAlmaLinux 8.4をインストールしてKVMの仮想化環境を構築して利用しています。
OS
AlmaLinux 8.4 (Electric Cheetah) aarch64
インストール済み主要パッケージ
- libvirt-client-6.0.0-35.1.module_el8.4.0+2523+3300d70f.aarch64.rpm
- virt-install-2.2.1-4.el8.noarch.rpm
手順
事前確認
複製対象の仮想マシンの確認
virt-clone コマンドで複製する対象(複製元)の仮想マシン名を確認します。 なお、複製対象の仮想マシンは shut off もしくは paused 状態にしておく必要があります。 例えば running 状態で virt-clone を実行すると、以下のエラーが出力されます。
■エラーメッセージ
ERROR Domain with devices to clone must be paused or shutoff.
# virsh list --all
Id Name State
------------------------
- vm001 shut off ←この仮想マシンを複製する
#
仮想マシンの複製
virt-cloneで仮想マシンの複製
virt-clone コマンドで仮想マシンを複製します。 仮想マシン vm001 を複製して、新たに vm002 を作成します。
複製元(既存)の仮想マシン名 | vm001 |
---|---|
複製先(新規)の仮想マシン名 | vm002 |
複製先の仮想マシンイメージ・ファイル | /vmdata/vm002.qcow2 |
# virt-clone --original vm001 --name vm002 --file /vmdata/vm002.qcow2 WARNING Setting the graphics device port to autoport, in order to avoid conflicting. Allocating 'vm002.qcow2' | 80 GB 00:01:07 Allocating 'vm002_VARS.fd' | 64 MB 00:00:00 Clone 'vm002' created successfully.
事後確認
複製された仮想マシンの確認
複製された新規の仮想マシン vm002 が存在することを確認します。
# virsh list --all Id Name State ------------------------ - vm001 shut off ←複製元の仮想マシン - vm002 shut off ←複製して作成された仮想マシン
仮想マシン定義ファイルの確認
virt-clone コマンドによって複製された仮想マシンの定義情報が、複製元の仮想マシンとどの程度違うのか見てみます。 定義ファイルを diff コマンドで比較してみると、仮想マシン単位でユニークにならなければならないパラメータが 自動で変更されているようです。
# cd /etc/libvirt/qemu/ # ls -l total 20 drwx------. 3 root root 4096 Sep 18 03:06 networks -rw------- 1 root root 5778 Sep 24 01:50 vm001.xml ←複製元仮想マシンの定義ファイル -rw------- 1 root root 5777 Sep 24 02:38 vm002.xml ←複製して作成された仮想マシンの定義ファイル # diff vm001.xml vm002.xml 4c4 < virsh edit vm001 --- > virsh edit vm002 ←先頭のコメント行に書かれている仮想マシンの編集コマンド 9,10c9,10 < <name>vm001</name> < <uuid>dc050927-42b5-41da-bab4-453be00aade1</uuid> --- > <name>vm002</name> ←仮想マシン名 > <uuid>a75fb9e0-0731-4739-ae15-acdf4cb5ae36</uuid> ←仮想マシンのUUID 22c22 < <nvram>/var/lib/libvirt/qemu/nvram/vm001_VARS.fd</nvram> --- > <nvram>/var/lib/libvirt/qemu/nvram/vm002_VARS.fd</nvram> ←NVRAM 38c38 < <source file='/vmdata/vm001.qcow2'/> --- > <source file='/vmdata/vm002.qcow2'/> ←仮想マシンイメージ・ファイル 55,57d54 < <controller type='virtio-serial' index='0'> < <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> < </controller> 102a100,102 > <controller type='virtio-serial' index='0'> ←この3行は内容に違いはないが記述の順序が異なっているので差分として出ている > <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> > </controller> 104c104 < <mac address='52:54:00:da:ba:b7'/> --- > <mac address='52:54:00:da:99:cd'/> ←NICのMACアドレス 127c127 < <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0'> --- > <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'> ←VNCの接続ポート番号
仮想マシンイメージ・ファイルの確認
念のため複製後の仮想マシンイメージ・ファイルを確認しておきます。 複製元と同じくスパースファイルとして作成されています(仮想ディスクは80GB)。 ファイルのパーミッションを比較すると、qemu-img create で作成したファイルは 644 になっていますが、 virt-clone で作成したファイルは 600 になっています。動作上影響ないはずなので気にしないことにします。
# ls -l /vmdata/
total 7972864
drwxr-xr-x 2 root root 43 Sep 24 01:35 iso
-rw-r--r-- 1 root root 2751004672 Sep 24 02:36 vm001.qcow2
-rw------- 1 root root 2696806400 Sep 24 02:39 vm002.qcow2 ←virt-cloneで作成されたイメージファイル
IPアドレスの変更
複製した仮想マシンの起動
仮想マシンがメタ情報として保持しているパラメータは virt-clone コマンドで自動的に変更されましたが、 IPアドレスは自動で変更されないので、複製元と複製先の仮想マシンを同時に起動するとIPアドレスが重複して 通信できなくなってしまいます。 複製先の新規仮想マシン vm002 のみ起動します。
# virsh start vm002
Domain vm002 started
# virsh list --all
Id Name State
------------------------
1 vm002 running ←起動した
- vm001 shut off
#
複製した仮想マシンにコンソール接続
IPアドレスを変更するために、起動した仮想マシン vm002 にコンソール接続します。
# virsh console vm002
Connected to domain vm002
Escape character is ^]
AlmaLinux 8.4 (Electric Cheetah)
Kernel 4.18.0-305.el8.aarch64 on an aarch64
Activate the web console with: systemctl enable --now cockpit.socket
almalinux84 login: root
パスワード: ←パスワードを入力
前回のログイン: Sat Sep 25 01:14:01 端末: tty1
仮想マシンのIPアドレス変更
nmcli コマンドでIPアドレスを変更します。 変更後、対象のコネクションを再起動(down & up)すると変更が反映されます。
# ip a 1: lo:mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp1s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:51:59:4c brd ff:ff:ff:ff:ff:ff inet 192.168.0.51/24 brd 192.168.0.255 scope global noprefixroute enp1s0 ←変更前のIPアドレス valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe51:594c/64 scope link valid_lft forever preferred_lft forever # nmcli c mod enp1s0 ipv4.address "192.168.0.53/24" ←IPアドレスを変更 # nmcli c down enp1s0 && nmcli c up enp1s0 ←IPアドレス変更を反映するためにコネクションの再起動 接続 'enp1s0' が正常に非アクティブ化されました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/1) 接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/2) # ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp1s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:51:59:4c brd ff:ff:ff:ff:ff:ff inet 192.168.0.53/24 brd 192.168.0.255 scope global noprefixroute enp1s0 ←変更後のIPアドレス valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe51:594c/64 scope link valid_lft forever preferred_lft forever
コンソールの切断
仮想マシンのコンソールに接続した状態で exit すると、仮想マシンのユーザがログアウトされた状態にはなりますが、 コンソールは接続されたままになります。Ctrl と ] キーを押すとコンソールから切断されます。 なお、ログアウトしなくてもコンソールから切断することはできますがお作法として。。
# exit
ログアウト
AlmaLinux 8.4 (Electric Cheetah)
Kernel 4.18.0-305.el8.aarch64 on an aarch64
Activate the web console with: systemctl enable --now cockpit.socket
almalinux84 login: ←「Ctrl」+「]」を押すとコンソールから切断される