ラベル snapshot の投稿を表示しています。 すべての投稿を表示
ラベル snapshot の投稿を表示しています。 すべての投稿を表示

2017年5月8日月曜日

確認前にバックアップ

前回、/etc/libvirt を共有する構成を作った。

で、この上で幾つか検証をしようと思う。
実は既に検証しているんだが、そこで想定外の挙動を示した。
その結果、一部データがロストしてしまい、ちょっと復旧に手間がかかった。(致命傷を受ける前に対処出来たけど…)

というわけで、検証前に現状をバックアップしておこう。

LVMスナップショットを取れればいいんだけど、CLVMによって共有モードでアクティベートされた領域は、スナップショットが取れないらしい。
実際に試してみると、「(lvol名) must be active exclusively to create snapshot」というメッセージが出て、スナップショットが作られない。

これもまた想定外だな…いやまぁ、クラスタボリュームでスナップショットが作れないことはある程度予想できていたが…。

とりあえず、バックアップの方法については別途検討するとして、今回は仮想マシンを落として、丸っとバックアップを取ることにする。

(仮想マシン leo は停止しておくこと)
まずはバックアップ用のファイルシステムの作成
(gemini) $ sudo lvcreate -C n -n backup -L 20G vg-gfs2
(gemini) $ sudo vgdisplay -v vg-gfs2
(gemini) $ sudo lvchange -a y vg-gfs2/backup
(gemini) $ sudo mkfs.ext4 /dev/vg-gfs2/backup

マウントしてバックアップ
(gemini) $ sudo mkdir /mnt/backup
(gemini) $ sudo mount /dev/vg-gfs2/backup /mnt/backup
(gemini) $ sudo chmod 777 /mnt/backup
(gemini) $ sudo -i
(gemini) # cd /etc
(gemini) # tar cvjSf /mnt/backup/etc-libvirt.tbz libvirt
(gemini) # tar tvjf /mnt/backup/etc-libvirt.tbz
(gemini) # cd /var/lib
(gemini) # tar cvjSf /mnt/backup/var-lib-libvirt.tbz libvirt
(gemini) # tar tvjf /mnt/backup/var-lib-libvirt.tbz
(gemini) # exit
アンマウントする前に、leo の構成ファイルもバックアップしておこう。
(gemini) $ virsh dumpxml leo > /mnt/backup/leo.xml
(gemini) $ cat /mnt/backup/leo.xml
(gemini) $ sudo umount /mnt/backup
(gemini) $ sudo lvchange -a n vg-gfs2/backup

これでバックアップは完了だ。
次こそ色々試してみる。

2017年4月4日火曜日

共有仮想ディスクの設定

前回、cancer側でocfs2ファイルシステムのマウントが出来なくなった、と書いた。
クラスタ云々っていう理由だと思ったけど、それ以前に共有仮想ディスク(/dev/vdb、/dev/vdc)の設定自体がおかしかった。

そもそも、複数のサーバで仮想ディスクを共有させるのなら、仮想マシンにそのディスクを割り当てる時に「共有可能」というチェックボックスにチェックを入れておく必要があった。

この時点で既に設定が間違っていたということになる。

これが付いていないと、それぞれの仮想マシン(gemini/cancer)でスナップショットを作成したりすると、この仮想ディスクも2世代スナップショットが作られてしまい、内部的に混乱してしまう。

それで、geminiでマウント出来ても、cancerでマウント出来ない状態になったようだ。

アカン…もう一度作り直すか…。

2017年2月4日土曜日

スナップショットを使おう その5(内部スナップショットの破棄-停止状態)

というわけで、スナップショットの破棄のパターンをテストしてみる。

これまで色々いじってきた内容と基本的には被るわけだが、整理だと思ってくれい。
とりあえず、内部スナップショット-停止状態のパターンを書く。

piscesが稼動していたら停止させよう
(aquarius) $ virsh list --all

内部スナップショットの作成だ。(piscesにスナップショットが無いことが前提だ。)
(aquarius) $ virsh snapshot-list pisces
(aquarius) $ virsh snapshot-create-as \
--domain pisces \
--name pisces-1.....
(aquarius) $ virsh snapshot-list pisces

piscesを起動させよう。
(aquarius) $ virsh start pisces
(aquarius) $ virsh list --all

仮想ディスクの状態の確認
(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces.qcow2

piscesにダミーファイルを作成してみる。
(pisces) $ touch 1
(pisces) $ ls -l 1

piscesのスナップショットを削除する。
(aquarius) $ virsh snapshot-delete --domain pisces pisces-1
(aquarius) $ virsh list --all
停止した状態でスナップショットを作成したので、停止した状態に戻るかと思ったんだが、起動したままになっている。

スナップショットの状態を確認
(aquarius) $ virsh snapshot-list pisces
スナップショットは削除されている。

piscesのファイルの状態は?
(pisces) $ ls -l 1
スナップショット作成後に作成したファイル、残っている。

ということは、この手順は、スナップショットは消えるが、スナップショットに対して行った作業は、ベースのディスクに反映されるってことか。

手順間違えた。もう一度実施だ。
まずは、pisces上のごみファイル(1)を削除する。
(pisces) $ rm 1
(pisces) $ ls -l

piscesはシャットダウンしておく。
(pisces) $ sudo shutdown -h now
(aquarius) $ virsh list --all

もう一度、内部スナップショットを作成する。(piscesにスナップショットが無いことが前提だ。)
(aquarius) $ virsh snapshot-list pisces
(aquarius) $ virsh snapshot-create-as \
--domain pisces \
--name pisces-1
(aquarius) $ virsh snapshot-list pisces

piscesを起動させよう。
(aquarius) $ virsh start pisces
(aquarius) $ virsh list --all

仮想ディスクの状態の確認
(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces.qcow2

piscesにダミーファイルを作成してみる。
(pisces) $ touch 1
(pisces) $ ls -l 1

piscesをスナップショットまで戻してみる。
(aquarius) $ virsh snapshot-revert --domain pisces pisces-1
(aquarius) $ virsh list --all
この時点で、piscesは停止する。(もともと停止状態で取得したスナップショットに戻ったわけだから、正常な挙動だ。)

スナップショットの確認
(aquarius) $ virsh snapshot-list pisces
(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces.qcow2
スナップショットは残っている。

この状態でスナップショットを削除する。
(aquarius) $ virsh snapshot-delete --domain pisces pisces-1
(aquarius) $ virsh snapshot-list pisces
(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces.qcow2
スナップショットは削除された。

本当に元に戻ったか、piscesを起動して確認だ。
(aquarius) $ virsh start pisces
(pisces) $ ls -l 1
ファイルが存在していない。スナップショット取得前に戻った状態だ。

これで、
  • スナップショットを破棄する。(スナップショット取得前に戻す。)
  • スナップショットは停止状態で取得する。
  • スナップショット形式は「内部スナップショット」。
のパターンの検証と手順の確立は完了だ。

次は、同様のパターンで「起動状態でスナップショットを取得する」の手順の確立を実施してみたい。

と、途中まで書いていたが、ちょっとスナップショット関連は停止。
まだまだ色々やりたいことがあるので、色んなことやってく過程で、またスナップショットは記載する。

2016年12月20日火曜日

スナップショットを使おう その4(仮想マシンスナップショットの目的整理)

スナップショット、色々試しているけど、ちょっと混乱してきた。
というわけで、まずはスナップショットを使う目的を整理しよう。

  1. ソフトウェアの導入検証
  2. ソフトウェア・OSのバージョンアップ検証
  3. ソフトウェア・OSの設定変更検証
  4. 同一ソフトウェアの異なるバージョンの検証

が主目的ではないだろうか?

1~3までは、「スナップショット作成→検証→元に戻す」を繰り返し、納得がいく状態になったらコミットする、という流れになる。
通常であれば、「バックアップ→検証→リストア」という手順になるが、バックアップおよびリストアは結構手間がかかる。それに比べ、仮想環境で取得可能なスナップショットは非常に短い時間、少ない手間で処理できるので、とても便利だ。

4は、「あるベースイメージから複数のスナップショットを作成→それぞれのスナップショットに異なるバージョンのソフトウェアを導入・検証→元に戻す」を繰り返し、問題ないバージョン(スナップショット)をベースイメージにコミットする、ということになるかと思う。
4に関しては、「ベースイメージを複数コピー→検証→破棄」という流れでも実施可能だ。このパターンなら、複数の仮想マシンに分かれるので、IPアドレス等がバッティングしなければ、同時に複数の仮想マシンを起動可能だ。
ただし、IPアドレスの変更は意外と影響範囲が大きく、思わぬところで躓く可能性があるため、十分注意する必要があるだろう。

というわけで、まずは1~3を目的としたスナップショットの操作手順をおさらいしていこう。

図にすると以下のような感じだ。

スナップショットの破棄パターン

スナップショットのコミットパターン


次回以降にそれぞれ記載していく。

今回はここまで。

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

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

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

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

2016年11月18日金曜日

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

前回は、軽くスナップショットを作ってみるところを試してみた。

今回は、スナップショットの情報、特に親との差分情報がドコに格納されているのか?を探してみる。

まずはざっと、スナップショットを作ってみよう。
(あえて、piscesが稼動している状態で作ってみるぞ。)
(aquarius) $ virsh start pisces
(aquarius) $ virsh snapshot-create-as pisces --name pisces-1

スナップショットが作成されたら、pisces自体は停止しておこう。
(pisces) $ sudo shutdown -h now
(aquarius) $ virsh list --all

スナップショットが出来ているか確認
(aquarius) $ virsh snapshot-list pisces

スナップショットが作られているのが確認できただろうか?

これで、スナップショット作成時はpiscesは稼働中、現在はpisces停止状態、という形になった。
というわけで、少なくともpisces-1の状態から今までの間に、システム停止に伴うログ情報の差分や、メモリ使用状況が大きく変わっているはずだ。
これらの情報はいったいドコに記録されているのだろうか?

というわけで、そのスナップショットの情報を見てみる。
(aquarius) $ virsh snapshot-info pisces pisces-1

何行か情報が出てくるがその中に
場所:         内部
という行がある。
もしかして、これが「差分情報をドコに持っているか?」ということなのだろうか?

となればまずは、ディスク情報を見てみよう。
(aquarius) $ virsh vol-info pisces.qcow2 default

う~ん…。特に変わった情報は無いなぁ…。

virshで見ることが出来なくて、qemuコマンドなら見ることが出来る、とかか…?
(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces.qcow2
(一部略)
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         pisces-1               543M 2016-11-11 19:01:30   51:41:26.974
(一部略)

何か出た…ぞ!?

こちらのコマンドでも出せる。
(aquarius) $ sudo qemu-img snapshot -l /var/lib/libvirt/images/pisces.qcow2
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         pisces-1               543M 2016-11-11 19:01:30   51:41:26.974

どうやら、スナップショットの情報は、同一仮想ディスク上に格納されているようだ。
スナップショット情報が、別の仮想ディスクとして記録されるVMware等とは異なる挙動だ。
そうすると、72GBしか割り当てていないはずの仮想ディスク、スナップショットで使い切ったらどうなるんだろう…?
調査はしていないけど、どうやらスナップショット数分、仮想ディスクの大きさは増えていくみたいだな。

さて、じゃぁスナップショット作成時のメモリの情報はドコに?
先ほどの出力結果を見てみると、VM SIZEという欄に「543M」という記載がある。
仮想マシンには、メモリを512MBしか割り当てていない。もしかしたら、スナップショットの瞬間のメモリ情報も、仮想ディスク内に格納されているのか?

これを確認するには、一旦メモリ割り当てサイズを変更して、スナップショットを取り直してみれば判るだろう。

というわけで、スナップショットの削除。
(aquarius) $ virsh snapshot-delete pisces pisces-1
(aquarius) $ virsh snapshot-list pisces

piscesが停止していることを確認して、メモリ割り当て量を変更。
(aquarius) $ virsh list --all
(aquarius) $ virsh edit pisces
以下の2行を書き換えよう。(割り当てサイズを512MBから128MBへ減らす)
  <memory unit='KiB'>524288</memory>
  <currentMemory unit='KiB'>524288</currentMemory>
↓
  <memory unit='KiB'>131072</memory>
  <currentMemory unit='KiB'>131072</currentMemory>

そしたら、piscesを起動し、スナップショットを取得
(aquarius) $ virsh start pisces
(aquairus) $ virsh snapshot-create-as pisces --name pisces-1

スナップショットの状態を確認
(aquarius) $ virsh snapshot-list pisces

では、仮想ディスクの状態を見てみる。
(aquarius) $ sudo qemu-img info /var/lib/libvirt/images/pisces.qcow2
(一部略)
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         pisces-1               145M 2016-11-18 11:07:00   00:02:07.609
(一部略)

(aquarius) $ sudo qemu-img snapshot -l /var/lib/libvirt/images/pisces.qcow2
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         pisces-1               145M 2016-11-18 11:07:00   00:02:07.609

おおおおっ!?VM SIZEが145Mになっている!やはりメモリ空間もこの仮想ディスクに格納されているのか!

VMwareの製品などは、仮想マシンの稼働中のスナップショットは、メモリ内容も別ファイルに格納されるようになっているから、実装が違うということか!
これでは、仮想マシンのスナップショットからのバックアップっていうのは無理かもしれないな。

ちなみに、仮想マシンが停止している状態で取得したスナップショットはどうなのだろうか?
同じ手順で確認してみよう。

まずはスナップショットの削除だ。
(aquarius) $ virsh snapshot-delete pisces pisces-1
(aquarius) $ virsh snapshot-list pisces

スナップショットが削除されたことが確認できたら、piscesを停止しよう。
(pisces) $ sudo shutdown -h now

piscesが停止していることを確認し、停止状態のままスナップショットの取得だ。
(aquarius) $ virsh list --all
(aquairus) $ virsh snapshot-create-as pisces --name pisces-1

スナップショットが取れたことを確認して、仮想ディスクの状態を確認してみる。
(aquarius) $ virsh snapshot-list pisces
(aquarius) $ sudo qemu-img snapshot -l /var/lib/libvirt/images/pisces.qcow2
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         pisces-1                  0 2016-11-18 11:26:55   00:00:00.000

予想通り、VM SIZEは0だ。
なるほど、仮想マシンスナップショットのメモリ空間は、デフォルトでは仮想ディスクに格納されるっていうことか。

というわけで次回は、メモリ保存とスナップショットディスクを、外部保管に出来ないか?という観点で調査してみる。

2016年11月11日金曜日

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

仮想マシン環境を使うメリットの一つに、スナップショット機能がある。
仮想マシンのある断面を保持し、いつでもその断面に戻せる機能だ。
フルバックアップしておいて、戻したいときにそのバックアップからリストアする、というのに似たイメージを持っているが、実際には異なる。

技術的には、スナップショットは「その瞬間と、現在との差分」のみ保持している状態だ。
つまり、現在の環境がまるっと消し飛ぶと、スナップショットから戻すことも出来なくなる。

また、差分管理のみのため、取得にかかる時間は非常に短くて済む。フルバックアップとは雲泥の差だ。

スナップショットとバックアップを組み合わせて、システム停止時間を出来る限り短くしたり、バックアップにかかるシステム負荷を小さくする、なんていうことを行っている人もいる、と思う。

また、仮想マシンのスナップショットを上手く使えば、
  • パッチ適用の検証
  • アプリケーション導入の手順の確認
  • システム設定変更の影響調査
等にも利用できる。

いずれも、作業前にスナップショットを取り、作業を行った後に、スナップショットに戻す、という流れで可能だ。
何度も繰り返し検証を行いたい場合にとても便利だ。

で、KVMではスナップショットは使えるのか?という点だけど、当然実装されている。
GUIのvirt-managerでも使えるけど、少し使い勝手が悪そうだ。
今回は、コマンドライン(virsh)で試してみよう。

とは言っても、スナップショット関連のオプションは幾つかある。
(aquarius) $ virsh help snapshot
 Snapshot (ヘルプのキーワード 'snapshot'):
    snapshot-create                XML によるスナップショットの作成
    snapshot-create-as             一組の引数からのスナップショットの作成
    snapshot-current               カレントスナップショットの取得・設定
    snapshot-delete                ドメインのスナップショットの削除
    snapshot-dumpxml               ドメインのスナップショットの XML 形式ダンプ
    snapshot-edit                  スナップショットの XML の編集
    snapshot-info                  スナップショット情報
    snapshot-list                  ドメインのスナップショットの一覧表示
    snapshot-parent                スナップショットの親の名前の取得
    snapshot-revert                ドメインのスナップショットへの復帰

しかもなぜか、「作成」が2つもある。
それぞれ、helpを引いてみると、似たようなオプションが指定できるようだ。
(aquarius) $ virsh help snapshot-create
(aquarius) $ virsh help snapshot-create-as
(オプションの一覧は省略する。各自確認してみてほしい。)

細かいところは抜きにして、とりあえず作ってみよう。

操作はコマンドラインで実施するが、仮想マシンのコンソール画面が見えていた方が変化がわかるかもしれないので、virt-managerを使って、仮想マシンpiscesのコンソール画面を見ておこう。
(aqaurius) $ virt-manager
(仮想マシンpiscesを選んで「開く」だ)

あと、主にaqauriusから操作を行うが、動作状況の確認のために、時々piscesで操作をする。
間違えないようにしよう。

で、piscesにスナップショットが無いことを確認。
(aquarius) $ virsh snapshot-list pisces

続いて、稼働中でも取得できることを確認するために、仮想マシンを起動してしまおう。
(aquarius) $ virsh list --all
(aquarius) $ virsh start pisces
(virt-managerから表示したコンソールを見て、piscesが起動したのを確認しておくこと。)

piscesが表示されているコンソールからログインし、空ファイルを一つ作っておこう。
(pisces) $ cd
(pisces) $ touch snap-before
(pisces) $ ls -l snap-before

そうしたら、スナップショットの作成だ。現時点でのスナップショットを取る。
(aquarius) $ virsh snapshot-create-as pisces --name pisces-1
ドメインのスナップショット pisces-1 が作成されました

無事に作成されたか確認だ。
(aquarius) $ virsh snapshot-list pisces
 名前               作成時間              状態
------------------------------------------------------------
 pisces-1             2016-11-10 09:45:59 +0900 running

どうやら無事に作成されたようだ。
ちなみに、piscesの画面は数秒間反応が無かったと思う。スナップショットを作成する数秒間だけ、動きが止まるようだ。

(aquarius) $ virsh list --all
piscesは稼動しているステータスのはずだ。

さて、今のpiscesのコンソールを使って、少しいじってみよう。

先ほど作ったファイルを削除してみたり…
(pisces) $ cd
(pisces) $ rm snap-before
(pisces) $ ls -l snap-before

別にファイルを作ってみたり…
(pisces) $ touch snap-after
(pisces) $ ls -l snap-after

piscesを落としてみたり…
(pisces) $ sudo shutdown -h now

piscesが停止したところでステータスを確認してみよう。
(aquarius) $ virsh snapshot-list pisces
 名前               作成時間              状態
------------------------------------------------------------
 pisces-1             2016-11-10 09:45:59 +0900 running

こちらはステータス変わらず。

(aqaurius) $ virsh list --all
こちらは、piscesはシャットダウン状態だ。

もう一度起動してみよう。
(aquarius) $ virsh start pisces
(aquarius) $ virsh list --all

普通に起動してきたはずなので、piscesのコンソールから状態を確認。
(pisces) $ ls -l snap-*
snap-afterだけ存在する状態だ。

この状態で、スナップショット取得時点(pisces-1作成時点)に戻してみよう。
(aquarius) $ virsh snapshot-revert pisces --snapshotname pisces-1

piscesのコンソールがリフレッシュされて、snap-beforeファイルを作成した直後に戻ったはずだ。
念のために確認してみよう。
(pisces) $ ls -l snap-*
snap-beforeが出てきて、snap-afterが無い状態だ。

つまり、pisces-1を作成したタイミング(virsh snapshot-create-as pisces --name pisces-1 を実行したタイミング)に戻ってきたわけだ。

もう一回、ダミーファイルの削除・作成をしてみよう。
(pisces) $ rm snap-before
(pisces) $ touch snap-after2
(pisces) $ ls -l snap-*
snap-after2だけ存在しているはずだ。

この状態で、スナップショットpisces-1を削除したらどうなるだろうか?
やってみよう。
(aquarius) $ virsh snapshot-delete pisces --snapshotname pisces-1
(aquarius) $ virsh snapshot-list pisces
(aquarius) $ virsh list --all

piscesのコンソールには何も変化が無く、スナップショットが消えただけだ。
pisces自身も稼働中のステータスだ。

pisces上のダミーファイルはどうなっているだろうか?
(pisces) $ ls -l snap-*
特に何も変化無く、snap-after2だけ存在している状態だ。

ざっと図にすると、以下のような流れで試してみた、ということだ。


これらをやってみると、他にも色んなことが考えられるのではないだろうか?
例えば、
  • スナップショットって差分を管理しているってことだけど、差分情報はドコにあるの?
  • スナップショットのスナップショットは作れるの?
  • スナップショットの分岐は可能なの?
  • 子スナップショットがいるスナップショットを削除したら?
等。

次回以降、この辺りを試していく。