2016年12月4日日曜日

スナップショットを使おう その3

というわけで、今回はスナップショットの差分情報を仮想ディスクの内部ではなく、外部に持てないか?という検証。
(VMware Workstation ProやESXiと同じような。)

とりあえず、まだスナップショットが残っていると思うので、削除しておこう。
(aquarius) $ virsh snapshot-delete pisces pisces-1

仮想ディスクにスナップショットの情報が残ってないことを確認しておこう。
(aquarius) $ virsh vol-info pisces.qcow2 default
(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces.qcow2
(aquarius) $ sudo qemu-img snapshot -l /var/lib/libvirt/images/pisces.qcow2
(aquarius) $ virsh snapshot-list pisces

では、ベースとなる仮想マシンを稼動させよう。
(aquarius) $ virsh start pisces
(aquarius) $ virsh list --all

スナップショットを作成する前に、pisces上にダミーファイルを一つ作っておこう。
(pisces) $ touch snap-1

さて、この状態でスナップショットを作るのだが、メモリ情報やディスクのスナップショット情報を外出しにするにはどうすればいいのだろうか?
どうやら、メモリ情報を外出しにするには--memspecというオプション、ディスクは--diskspecというオプションらしい。しかも、--diskspecでファイルをスナップショットファイルを指定する場合、フルパスでないといけないようだ。(メモリは相対パスでもいける)
どこに配置するのが綺麗なのか判らないので、とりあえず仮想ディスクファイルが存在する場所を指定する。
(aquarius) $ virsh snapshot-create-as \
--domain pisces \
--name pisces-1 \
--memspec file=/var/lib/libvirt/images/pisces-1.mem,snapshot=external \
--diskspec vda,snapshot=external,file=/var/lib/libvirt/images/pisces-1.vda.qcow2

これで作れたっぽい。
確認してみよう。
(aquarius) $ sudo ls -l /var/lib/libvirt/images/pisces-1.mem
-rw------- 1 root root 183578840 12月 4 18:51 /var/lib/libvirt/images/pisces-1.mem

(aquarius) $ sudo ls -l /var/lib/libvirt/images/pisces-1.vda.qcow2
-rw------- 1 libvirt-qemu kvm 198144 12月 4 18:51 /var/lib/libvirt/images/pisces-1.vda.qcow2

それぞれファイルが出来上がっている。

メモリファイルの方をチェック。
(aquarius) $ sudo file /var/lib/libvirt/images/pisces-1.mem
/var/lib/libvirt/images/pisces-1.mem: Libvirt QEMU Suspend Image, version 2, XML length 3980, running

QEMU Suspend Imageとなっているってことは、仮想マシンを一時的にSuspend状態にして、その瞬間のメモリ情報が格納されているんだろうな。
ってことは、もしかしたら単純に仮想マシンをSuspendさせる時も、同じように--memspecオプションがあるかも。後日調べてみよう。

仮想ディスクファイルのチェック。
(aquarius) $ sudo file /var/lib/libvirt/images/pisces-1.vda.qcow2
/var/lib/libvirt/images/pisces-1.vda.qcow2: QEMU QCOW Image (v3), has backing file (path /var/lib/libvirt/images/pisces.qcow2), 77309411328 bytes

backing fileとして、元の仮想ディスクファイルが指定されている。
ということはきっと、元の仮想ディスクファイル(pisces.qcow2)からの差分情報が、このファイル(pisces-1.vda.qcow2)に格納されているんだろう。

だとすれば、仮想マシンの定義と、メモリファイル、ベースとなっている仮想ディスクファイル(pisces.qcow2)をバックアップしたら、仮想マシンそのもののバックアップになるのだろうか?
これも後日確認だな。

スナップショットの定義確認。
(aquarius) $ virsh snapshot-info pisces pisces-1
名前: pisces-1
ドメイン: pisces
カレント: はい (yes)
状態: running
場所: 外部
親: -
子: 0
子孫: 0
メタデータ: はい (yes)

お、「場所」の項目が「外部」になっているから、期待した動きのようだ。

前回と同様、仮想ディスクファイル(元の仮想ディスクファイル)を確認してみる。
(aquarius) $ virsh vol-info pisces.qcow2 default

スナップショットの情報は出てこなかった。

qemu-imgコマンドでも確かめてみる。
(aquarius) $ sudo qemu-img snapshot -l /var/lib/libvirt/images/pisces.qcow2

何も出てこない。

ってことは、元の仮想ディスクファイルには、スナップショットの情報は記録されておらず、新しい差分ファイル(pisces-1.vda.qcow2)の方にのみ、情報が記録されているってことだな。

一応、差分ファイルの方をqemu-imgコマンドで確認してみよう。
(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces-1.vda.qcow2
image: /var/lib/libvirt/images/pisces-1.vda.qcow2
file format: qcow2
virtual size: 72G (77309411328 bytes)
disk size: 196K
cluster_size: 65536
backing file: /var/lib/libvirt/images/pisces.qcow2
backing file format: qcow2
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false

backing fileの定義がある。やっぱりそうみたいだ。

ついでに、仮想メモリファイルの方も確認してみよう。
(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces-1.mem
image: /var/lib/libvirt/images/pisces-1.mem
file format: raw
virtual size: 175M (183579136 bytes)
disk size: 175M

ん?今、piscesにはメモリ128MByteしか割り当てて無いはずだから、175Mってのはちょっと大きいな…。何でやろ?

続いて、仮想マシンの定義を見てみよう。
(aquarius) $ virsh dumpxml pisces
(一部抜粋)
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/pisces-1.vda.qcow2'/>
<backingStore type='file' index='1'>
<format type='qcow2'/>
<source file='/var/lib/libvirt/images/pisces.qcow2'/>
<backingStore/>
</backingStore>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

仮想ディスクが、pisces-1.vda.qcow2になって、そのbackingStoreとして、pisces.qcow2と定義されている。

pisces-1.vda.qcow2が更新され、今まで使ってたpisces.qcow2は更新されずに参照のみ、ということになるんだろう。

ファイルの状態を見てみる。
(aquarius) $ sudo fuser -fuv /var/lib/libvirt/images/pisces.qcow2
USER PID ACCESS COMMAND
/var/lib/libvirt/images/pisces.qcow2:
libvirt-qemu 3525 f.... (libvirt-qemu)qemu-system-x86

(aquarius) $ sudo fuser -fuv /var/lib/libvirt/images/pisces-1.vda.qcow2
USER PID ACCESS COMMAND
/var/lib/libvirt/images/pisces-1.vda.qcow2:
libvirt-qemu 3525 F.... (libvirt-qemu)qemu-system-x86

pisces.qcow2の方は、ACCESSフラグが"f"で、pisces-1.vda.qcow2の方のACCESSフラグは"F"だ。

man fuserによると、
f open file. f is omitted in default display mode.
F open file for writing. F is omitted in default display mode.
とのことで、やはりpisces.qcow2の方はread onlyなのだろう。

さて、では作ったスナップショットを消してみよう。
(aquarius) $ virsh snapshot-delete pisces pisces-1
エラー: スナップショット pisces-1 の削除に失敗しました
エラー: サポートされない設定: 1 個の外部ディスクスナップショットの削除はまだサポートされていません

おや?削除できない。
ディスクを外部に持たせたタイプのスナップショットは削除できないのか?それじゃスナップショットのメリットが無いなぁ。

だったら、スナップショットに戻すのは?
(aquarius) $ virsh snapshot-revert pisces pisces-1
エラー: サポートされない設定: revert to external snapshot not supported yet

あらま、これもサポートされないって…。

どうやら、外部ディスクにスナップショットを取得していた場合は、スナップショットを削除するには--metadataというオプションが必要らしい。
(aquarius) $ virsh snapshot-delete pisces pisces-1 --metadata
ドメインのスナップショット pisces-1 が削除されました

本当に削除されたのだろうか?
(aquarius) $ virsh snapshot-list pisces
名前 作成時間 状態
------------------------------------------------------------

何もリストに出てこない。無事に削除されたようだ。

スナップショットが削除されたのなら、外部スナップショットファイルとメモリファイルはどうなった?
(aquarius) $ sudo ls -l /var/lib/libvirt/images/pisces-1.mem
-rw------- 1 root root 183578840 12月 4 18:51 /var/lib/libvirt/images/pisces-1.mem

(aquarius) $ sudo ls -l /var/lib/libvirt/images/pisces-1.vda.qcow2
-rw------- 1 libvirt-qemu kvm 198144 12月 4 18:51 /var/lib/libvirt/images/pisces-1.vda.qcow2

どちらも存在している。削除はされないようだ。

ファイルの定義も確認しておくが…変わってないようだ。
(aquarius) $ sudo file /var/lib/libvirt/images/pisces-1.mem
/var/lib/libvirt/images/pisces-1.mem: Libvirt QEMU Suspend Image, version 2, XML length 3980, running

(aquarius) $ sudo file /var/lib/libvirt/images/pisces-1.vda.qcow2
/var/lib/libvirt/images/pisces-1.vda.qcow2: QEMU QCOW Image (v3), has backing file (path /var/lib/libvirt/images/pisces.qcow2), 77309411328 bytes

ファイルのオープン状態は?
(aquarius) $ sudo fuser -fuv /var/lib/libvirt/images/pisces-1.vda.qcow2
USER PID ACCESS COMMAND
/var/lib/libvirt/images/pisces-1.vda.qcow2:
libvirt-qemu 3525 F.... (libvirt-qemu)qemu-system-x86

Read/WriteモードでOpenしているようだ…な。

(aquarius) $ sudo fuser -fuv /var/lib/libvirt/images/pisces.qcow2
USER PID ACCESS COMMAND
/var/lib/libvirt/images/pisces.qcow2:
libvirt-qemu 3525 f.... (libvirt-qemu)qemu-system-x86

ベースファイルの方は、Read Onlyか…。この辺りも変わってないな。

(aquarius) $ sudo fuser -fv /var/lib/libvirt/images/pisces-1.mem
あれ?こちらは誰もOpenしていない。

(aquarius) $ virsh dumpxml pisces
(一部抜粋)
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/pisces-1.vda.qcow2'/>
<backingStore type='file' index='1'>
<format type='qcow2'/>
<source file='/var/lib/libvirt/images/pisces.qcow2'/>
<backingStore/>
</backingStore>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

相変わらず、外部スナップショットファイルを使用しているように見えるぞ。
う~ん。ちょっと期待した動作と違うなぁ…。

一応、qemuコマンドで確認してみる。
(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces-1.vda.qcow2
image: /var/lib/libvirt/images/pisces-1.vda.qcow2
file format: qcow2
virtual size: 72G (77309411328 bytes)
disk size: 196K
cluster_size: 65536
backing file: /var/lib/libvirt/images/pisces.qcow2
backing file format: qcow2
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false

(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces-1.mem
image: /var/lib/libvirt/images/pisces-1.mem
file format: raw
virtual size: 175M (183579136 bytes)
disk size: 175M

変わったようには見えないなぁ。

ちょっとpiscesにダミーファイルを作って、先に作ったダミーファイルを削除してみるか。
(pisces) $ touch hogefuga
(pisces) $ rm snap-1

仮想ディスクファイルのタイムスタンプはどうなった?
(aquarius) $ date; sudo ls -l /var/lib/libvirt/images/pisces.qcow2 /var/lib/libvirt/images/pisces-1.vda.qcow2
2016年 12月 4日 日曜日 19:04:31 JST
-rw------- 1 libvirt-qemu kvm 458752 12月 4 19:04 /var/lib/libvirt/images/pisces-1.vda.qcow2
-rw------- 1 libvirt-qemu kvm 2917203968 12月 4 18:51 /var/lib/libvirt/images/pisces.qcow2

外部スナップショットファイルの方が更新されたな。

じゃぁこの状態でpiscesを停止してみる。
(pisces) $ sudo shutdown -h now

停止したら、仮想ディスクのタイムスタンプをもう一度確認してみる。
(aquarius) $ date; sudo ls -l /var/lib/libvirt/images/pisces.qcow2 /var/lib/libvirt/images/pisces-1.vda.qcow2
2016年 12月 4日 日曜日 19:05:45 JST
-rw------- 1 root root 3276800 12月 4 19:05 /var/lib/libvirt/images/pisces-1.vda.qcow2
-rw------- 1 libvirt-qemu kvm 2917203968 12月 4 18:51 /var/lib/libvirt/images/pisces.qcow2

やっぱり、外部スナップショットの方が更新された。
どうやら、一度外部スナップショットファイルを作成すると、基本的にはソレが更新対象になるようだ。
スナップショットを削除しても、ベースの方にI/Oが行われるようになるわけではないようだ。

念のため、piscesの定義も確認してみる。
(aquarius) $ virsh dumpxml pisces
(一部抜粋)
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/pisces-1.vda.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

piscesが停止していると、<backingStore>定義が見えなくなるのか…。

う~ん。再びpiscesを起動してみるか…。
(aquarius) $ virsh start pisces

さっき作成したダミーファイルは残っているんかいな?
(pisces) $ ls hogefuga
存在しているねぇ。

もう一度、ディスク定義を見てみる。
(pisces) $ virsh dumpxml pisces
(一部抜粋)
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/uramoto/pisces-1.vda.qcow2'/>
<backingStore type='file' index='1'>
<format type='qcow2'/>
<source file='/var/lib/libvirt/images/pisces.qcow2'/>
<backingStore/>
</backingStore>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

やっぱり、pisces.qcow2とpisces-1.vda.qcow2の両方を使っているように見えるなぁ。

もう一度、ディスクの使用状況を…。
(aquarius) $ sudo fuser -fuv /var/lib/libvirt/images/pisces-1.vda.qcow2
USER PID ACCESS COMMAND
/var/lib/libvirt/images/pisces-1.vda.qcow2:
libvirt-qemu 3820 F.... (libvirt-qemu)qemu-system-x86
(aquarius) $ sudo fuser -fuv /var/lib/libvirt/images/pisces.qcow2
USER PID ACCESS COMMAND
/var/lib/libvirt/images/pisces.qcow2:
libvirt-qemu   3820 f.... (libvirt-qemu)qemu-system-x86

変わってない…。う~ん…。

piscesを停止させてから考えよう…。
(pisces) $ sudo shutdown -h now

なんか、virsh restoreってのがあるみたいだけど、これ使うとどうなるんやろ?
(aquarius) $ virsh restore /var/lib/libvirt/images/pisces-1.mem
ドメインが /var/lib/libvirt/images/pisces-1.mem から復元されました

ちょっ、マジか…。
普通に起動してスナップショットを取得した瞬間の状態になった!

ちょっとログインして、ダミーファイルを確認してみよう…。
(pisces) $ ls hogefuga snap-1
スナップショットを取得する前に作成したファイル(snap-1)は残ってて、スナップショット作成後に作ったファイル(hogefuga)は存在していない!
スナップショットを取った瞬間に戻った…のか?

例によって、ファイルのオープン状態を確認してみよう。
(aquarius) $ sudo fuser -fuv /var/lib/libvirt/images/pisces-1.vda.qcow2
オープンされていない。
(aquarius) $ sudo fuser -fuv /var/lib/libvirt/images/pisces.qcow2
USER PID ACCESS COMMAND
/var/lib/libvirt/images/pisces.qcow2:
libvirt-qemu   3915 F.... (libvirt-qemu)qemu-system-x86

オープンされてる。しかもR/Wモードだ。

メモリファイルの方は…
(aquarius) $ sudo fuser -fv /var/lib/libvirt/images/pisces-1.mem

オープンされてない。

仮想マシンの構成情報は?
(aquarius) $ virsh dumpxml pisces
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/pisces.qcow2'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

元に戻ってる!!!

piscesを一回停止させて、もう一度起動したら、どの状態になるんだろう?
(pisces) $ sudo shutdown -h now
(aquarius) $ virsh dumpxml pisces
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/pisces-1.vda.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

あ…あれ?…???どういうことだ???
外部スナップショットファイルが指定されてる…ぞ?
ベースのファイルが更新されているから、これだと起動しないんじゃないか?

(aquarius) $ virsh start pisces
立ち上がってくるなぁ…。
普通に立ち上がってくるし、ダミーファイル(hogefuga)も存在している。
良く分からんぞ…。
(これ、たまたま起動したんだと思う。ベースファイルが大きく書き換わっていた場合、差分ファイルとの整合性が合わなくなる。ベースファイルの更新が少なかったから、なんとかなったのではないだろうか?)

さっきの流れ的には、多分メモリファイルから復帰させた後、構成ファイルを書き換えれば完全に元に(スナップショット前に)戻せるだろう。
とりあえずそれをやってみよう。
(pisces) $ sudo shutdown -h now
(aquarius) $ virsh restore /var/lib/libvirt/images/pisces-1.mem
(pisces) $ sudo shutdown -h now
(aquarius) $ virsh edit pisces
<source file='/var/lib/libvirt/images/pisces-1.vda.qcow2'/>

<source file='/var/lib/libvirt/images/pisces.qcow2'/>
(aquarius) $ virsh start pisces
(aquarius) $ virsh dumpxml pisces
(pisces) $ sudo shutdown -h now
(aquarius) $ virsh dumpxml pisces
(aquarius) $ sudo rm /var/lib/libvirt/images/pisces-1.mem /var/lib/libvirt/images/pisces-1.vda.qcow2

これで、元に戻ったかな?

今回の実験は、色々な情報がモリモリになっていて、自分でもちょっと理解し切れていない。
一旦はここで切って、次回、情報を整理したい。

というわけで今回は以上。

0 件のコメント:

コメントを投稿