それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

qcow2のbacking ファイルから複数起動した場合について調べる

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でゼロからインストールより速い。

このあたりに大変魅力がある気がします。