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の奪い合いでできない。)
っていうかqcow単体スナップショットと殆ど変わらない。ファイルに分かれているかどうか。ってくらい
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にしたらどうなるのか
これを
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 は別ファイルのスナップショット的な感じで使う感じですね。