qcow2 backing ファイルで複数起動した場合について調べる
今回しらべた構成
d03 の仮想マシン作り、そのイメージから 2つの仮想マシンを差分として起動する。
d03 ─┬ d03.1 └─ d03.2
Backing-fileのBASEが更新されたとき、差分側はどうなるのか
d03 の作成
virt-install\ --connect=qemu:///system \ --initrd-inject=/home/takuya/preseed.cfg \ --name d03 \ --ram 8192 \ --disk path=/var/lib/libvirt/images/d03.qcow2 \ --vcpus 8 \ --virt-type kvm \ --os-type linux \ --os-variant debian10 \ --graphics none \ --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/ \ --extra-args="console=ttyS0"
d03.1 の作成
オーバーレイ(差分)を作る
sudo qemu-img create \ -b /var/lib/libvirt/images/d03.qcow2 \ -f qcow2 -F qcow2 \ /var/lib/libvirt/images/d03.1.qcow2
差分を使うDebianを起動する
virt-install \ --boot hd \ --connect=qemu:///system \ --name d03.1 \ --ram 8192 \ --disk path=/var/lib/libvirt/images/d03.1.qcow2 \ --vcpus 8 \ --virt-type kvm \ --os-type linux \ --os-variant debian10 \ --graphics none
d03.2 の作成
差分を使うDebianをもう一つ作る
オーバーレイ(差分)をもう一つ作る
sudo qemu-img create \ -b /var/lib/libvirt/images/d03.qcow2 \ -f qcow2 -F qcow2 \ /var/lib/libvirt/images/d03.2.qcow2
仮想マシンを作る
virt-install \ --boot hd \ --connect=qemu:///system \ --name d03.2 \ --ram 8192 \ --disk path=/var/lib/libvirt/images/d03.2.qcow2 \ --vcpus 8 \ --virt-type kvm \ --os-type linux \ --os-variant debian10 \ --graphics none
同時に起動できるのか
オーバーレイを使う2つは起動できる
差分を使う2つの仮想マシンは同時に起動できる
sudo virsh start d03.1 sudo virsh start d03.2
差分1と差分2を使う2つの仮想マシンd03.1/d03.2 は同時に起動できた。
これが正しい使い方である。
baseファイルを使えるのか?
Baseファイルを使うd03 というベースは、同時に起動できない。
Base側を起動して
sudo virsh start d03
差分も起動すると、エラー
takuya@:~$ sudo virsh start d03.1 エラー: Failed to start domain 'd03.1' エラー: 内部エラー: process exited while connecting to monitor: 2022-04-27T06:49:56.304604Z qemu-system-x86_64: -blockdev {"node-name":"libvirt-2-format","read-only":true,"driver":"qcow2","file":"libvirt-2-storage","backing":null}: Failed to get shared "write" lock Is another process using the image [/var/lib/libvirt/images/d03.qcow2]?
いちどオーバーレイを作成したら大本の仮想マシンは、もはや触るべきではありません。
Base側は更新して大丈夫なのか
Base側を更新して、終了
sudo virsh start d03 --console takuya@d03:~$ rm from-base takuya@d03:~$ echo 11 > from-base takuya@d03:~$ sudo shutdown -h now
差分側を起動する
sudo virsh start d03.1 --console takuya@d03:~$ rm from-base takuya@d03:~$ cat from-base cat: No such file or directory takuya@d03:~$ sudo shutdown -h now
こうすれば、d03.1にd03の変更点が適用されそうな予感はする。が、これは禁忌である。
動かないことはないが、d03.1に変更点が適用されることもない。
backing file は書き換えたらいけない
https://kashyapc.fedorapeople.org/virt/lc-2012/snapshots-handout.html
NOTE: Backing files are always opened read-only. In other words, once an overlay is created, its backing file should not be modified(as the overlay depends on a particular state of the backing file). Refer below ('blockcommit' section) for relevant info on this.
Backing file は参照先からリードオンリで読み取りがされる。言い換えれば、一度オーバーレイ作成したら、backing file は編集するべきではない。(オーバーレイ側の状況によるが)、差分(オーバーレイ)側からコミットなどを参照のこと
差分をbaseに反映したとき
d03.2 の差分を、d03(base)へ書き出し(commit) する
sudo qemu-img commit /var/lib/libvirt/images/d03.2.qcow2
これで、d03.2 に差分はなくなり、d03 と同じ状態になる。
d03.1 はどうなるのか?変わらない。
d03 ─┬ d03.1 └─ d03.2
d03.2 とd03 を同じ状態にしたので d03'が生じている。これは d03.1 となんの関係もない状態になった。
試した結果
d03 ─┬ d03.1 └─ d03.2 ⇓ commit 後 d03 ── d03.1 d03' ─┐ └─ d03.2
上記のようになっていた。 d03(=d03’)になっているが、d03.1は古い状態を維持していた
d03にスナップショットを作ったのと同じような状況になったと考えられる。無名のスナップショット的ものなのかもしれない。
virsh ならできるかも
上流から下流へ変更点を伝播 (propagate)させるなら、virsh でできるかもしれない。
virsh blockpull virsh blockcommit
qemu-img man ではよくわからなかった
man of qemu-img
をざっと見た感じだと、細かいことがよくわからない。
backing-file から複数の仮想マシンを作れる
OSをインストールしたファイルから、複数の仮想マシンをさくっと、インストールなしで作成できる。しかもコピーもなしで作れるから快適
その程度が実現できたらいい感じ。っていう機能なのかもしれない。
コンテナ全盛期で仮想マシンの関連の記事が空気になっていて、かんたんに結論が出る情報が少ないよぉ。
ソースコードやフォーラムをたどっていくのもしんどいしあまり深く追求しないことにする。
clone や docker pull や preseedよりは速く作れる
qcow2でオーバーレイ(差分)を作ってインストールすると、仮想マシンはすぐ作れる。
- ストレージをコピーするより速い
- docker pull より速い
- preseedでゼロからインストールより速い。
このあたりに大変魅力がある気がします。