それマグで!

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

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

qcow2 backing file を使う

qcow2 backing file を使う

sudo qemu-img create -b d03.qcow2 -f qcow2 -F qcow2 d03.diff.qcow2

qcow2をバックエンドにして qcow2.diff を作る

d03.qcow2 -> d03.diff.qcow2

実際にやってみた。

仮想ディスクからディスクを作る。

$ sudo qemu-img create  -b d03.qcow2 -f qcow2 -F qcow2 d03.diff.qcow2
Formatting '/var/lib/libvirt/images/d03.diff.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=8589934592 backing_file=/var/lib/libvirt/images/d03.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16

起動する。

差分ディスクを使って新規仮想マシンを作る

virt-install\
 --boot hd \
 --connect=qemu:///system  \
 --name d03-diff-1 \
 --ram 8192  \
 --disk path=/var/lib/libvirt/images/d03.diff_1.qcow2  \
 --vcpus 8  \
 --virt-type kvm  \
 --os-type linux  \
 --os-variant debian10  \
 --graphics none

速攻で起動して嬉しい。

もとに戻す。

もとに戻すのはかんたん。

HDDを作り直せばいい。

仮想マシン停止して、HDDを作り直し、仮想マシンを起動する。

$ sudo virsh destory d03-diff-1
$ sudo qemu-img create  -b d03.qcow2 -f qcow2 -F qcow2 d03.diff_1.qcow2
$ sudo virsh start d03-diff-1

仮想マシンの停止は、起動中ならディスクの書き込みは排他ロックされているため。

差分情報

差分について確認したいとき

takuya@:~$ sudo qemu-img info /var/lib/libvirt/images/d03.diff_1.qcow2
image: /var/lib/libvirt/images/d03.diff_1.qcow2
file format: qcow2
virtual size: 8 GiB (8589934592 bytes)
disk size: 272 MiB
cluster_size: 65536
backing file: /var/lib/libvirt/images/d03.qcow2
backing file format: qcow2
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false

commit でBaseへ変更点を反映する

差分側の変更点を、Baseファイル側へ書き出す(Commit)

書き出すと。ファイルのサイズはほぼゼロになる。差分ファイルに溜まった変更点をBASE側に持っていったので当たり前である。

もちろん、仮想マシンが停止している必要がある。

takuya@:~$ sudo qemu-img commit /var/lib/libvirt/images/d03.diff_1.qcow2
Image committed.
takuya@:~$ sudo qemu-img info /var/lib/libvirt/images/d03.diff_1.qcow2
image: /var/lib/libvirt/images/d03.diff_1.qcow2
file format: qcow2
virtual size: 8 GiB (8589934592 bytes)
disk size: 256 KiB
cluster_size: 65536
backing file: /var/lib/libvirt/images/d03.qcow2
backing file format: qcow2
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false
takuya@:~$

baseファイルとSnapshotの違い

baseファイルとsnapshot はほとんど同じである。

snapshot を1ファイルとして切り出したら、ある状態を起動することができる。しかし、変更点をスナップショットに戻すのは困難

一方でスナップショットからスナップを取れるし、スナップは削除できる。

qcow2 -> snapshot -> | port of no return | --> qcow2
qcow2 -> snapshot -> | can  rollback | --> snapshot

しかし、スナップは1つのqcow2 ファイルにあるため同時に起動できない。

そこで、qcow2 をベースに別ファイルとしてファイルを作る

qcow2 -> snapshot -> |  base file | --> qcow2.diff

すると、スナップショットまるごとコピーしてdiff に変更点をためておき、元ファイルに書き出すこともできる。

BASE Fileの場合

baseファイルと差分ファイルを、2つの仮想マシンに分割できる。(同時起動はWriteの奪い合いでできない。)

っていうかスナップショットと殆ど変わらない。ファイルに分かれているかどうか。ってくらい

qcow2 ファイル単位で仮想ボリュームが違うものになるため、複数のマシンで起動が可能である。

qcow2 -> snapshot -> | base file | --> qcow2.diff1
qcow2 -> snapshot -> | base file | --> qcow2.diff2
qcow2 -> snapshot -> | base file | --> qcow2.diff3

調べてないけど、特定スナップショットをbase fileにできたかもしれない。

rebaseで元ファイルを切り替える。

このような親子関係を作ると・・・

d03 ── d03.diff1 ┬─ d03.diff2
                 └─ d03.diff3

これこうする

d03 ┬─ d03.diff1 ── d03.diff2
    └─ d03.diff3

diff 3 の元ファイルを変えてしまう。

sudo qemu-img rebase -f qcow2 -b d03.qcow2 -F qcow2  d03.diff_3.qcow2

これで、差分ファイルの親を変えることができる・・・が・・・・

rebase で無茶をしてみる。

debian から作った差分の元ファイル(Backing-file)をUbuntuにしたらどうなるのか

  • debian を入れたファイル d03.qcow2
  • debian からの差分 d03-diff.qcow2
  • ubuntu を入れた u04.qcow2

これを

d03 ── d03.diff
u04 ── 

こうする

d03 ── 
u04 ── d03.diff

どうなるのか。

takuya@:~$ sudo qemu-img info /var/lib/libvirt/images/d03.diff_1.qcow2
image: /var/lib/libvirt/images/d03.diff_1.qcow2
file format: qcow2
virtual size: 8 GiB (8589934592 bytes)
disk size: 5.28 GiB
cluster_size: 65536
backing file: /var/lib/libvirt/images/u04.qcow2
backing file format: qcow2
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false
takuya@:~$

差分が大量に発生してますね。

起動したらDebianで起動します。つまり、ubuntuファイルシステムu04 を d03.diff の状態まで変更した差分ができたってことですかね。

極端な差分は作れないので、aufs のレイヤみたいな感じには使えないようです。

base file は別ファイルのスナップショット的な感じで使う感じですね。