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だけ存在している状態だ。

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


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

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

2016年11月4日金曜日

Win7(64bit)のWindows Update

ちょっと今回はKVMやLinuxとは関係ない話題。

自宅には、Windowsマシンが数台いて、そのうち1台は、ミドルタワー型。
そいつがWindowsメインマシンで、それとは別に作業用のWindowsノートPCが1台いる。
(他にも、WinXPノートが2台ほど稼動可能な状態でいるけど、使ってない。)

で、使っているタワー型&ノート型はいずれもWin7の64bitモデル。

最近、コイツらのWindows Updateが上手く動いてくれないんだ。

具体的には、何もしていない状態ではsvchost.exeがCPU1個分(4コアモデルなら25%、2コアモデルなら50%)を使い切ってしまい、さらにメモリもアホみたいに消費する。
(4コア8GBMemモデルで、1.5GB程メモリを消費する。)

更新プログラムの自動インストールをOnにして何日も放置し、更新プログラムの自動適用を繰り返させれば、ある程度収まるかと思っていたんだが、これが収まらない。

挙句、更新プログラムの適用にも失敗しまくるとうい事象が発生し、どうにもならない状態だった。

なんとなく対策が打てたと思うので、ざっと記載。

具体的には、
  • KB3050265
  • KB3102810
の2つのパッチを、Microsoft Update Catalogからダウンロードして、個別に適用すればよいようだ。

ただし、適用する直前に、wuauserv(Windows Update)というサービスを停止しておく。
停止しておかないと、パッチが適用できないようだ。
サービスを停止してすぐパッチを適用すれば、サクッとパッチ適用でき、OS再起動すればすぐに反映される様子。

今のところ、CPU使用率もほぼゼロ、メモリも40MB程の消費で済んでいるし、更新プログラムの自動適用も進んでいるようだ。

もう一台のWin7マシン(ノート型)でも試してみよう。