気づけば遠くに来たもんだ

がちゃぽん!

サポートブログ

外部スナップショットをつかってKVMをバックアップしてみる(1)

投稿日:

前回の投稿ではqcow2でスナップショットすると仮想マシンが一時的にロックがかかってしまうからLVMで…と言っておきながら、今回はqcow2でスナップショットを取る体で話がスタートしています。

LVMでスナップショット領域が溢れた場合の動作が怖くて、より安全な方法のスナップショットをつかってのバックアップはないものかと。
(LVMスナップショット領域を増やせばいいのかなとも思いますが)

で、ちょいちょい調べていると Red Hat Enterprise Virtualization(RHEV)では外部スナップショット機能を使う(CentOS6ではダメの様です)ことで、仮想マシンに一時的なロックをかからずにスナップショットがとれるとのこと。で、Ubuntu 16.04ではこの機能が使えそうなので、この外部スナップショットをつかってバックアップを考えてみたいと思います。

現在の仮想マシンの情報を確認します。

# virsh list
 Id    名前                         状態
----------------------------------------------------
 16    skyline                        実行中

ディスクの書き込みを意図的に発生させておいて、どのように記録されるかも見てみたいと思いますので、100MBのファイルを繰り返し作成する以下のコマンドを仮想マシン内で実行させておきます。

# for in list {0..10} ; do ; dd if=/dev/urandom of=/home/$list.img bs=1M count=100; done;

では、外部スナップショットを取ってみます。外部スナップショットを取る場合には --disk-only を引数に付加してコマンドを実行します。

# virsh snapshot-create skyline --disk-only --atomic
ドメインのスナップショット 1466064346 が作成されました

スナップショットが取れたので、ディスクイメージを確認してみます。
まずは、元のイメージファイルを…(ファイル名は「skyline」としています。)

# qemu-img info skyline
image: skyline
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 6.3G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false

スナップショットの方のイメージファイルを確認してみます。

# qemu-img info skyline.1466064346
image: skyline.1466064346
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 92M
cluster_size: 65536
backing file: /kvm/skyline
backing file format: qcow2
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 1

元イメージファイルは80GB割り当て中の6.2GBを使用していて、スナップショットイメージファイルは92Mを使用ということで、新しいデータはスナップショットイメージに書き込まれているのが確認できました。

ここで仮想マシンがどのイメージファイルを参照しているのかを確認してみます。

# virsh domblklist skyline
ターゲット ソース
------------------------------------------------
vda        /kvm/skyline.1466064346

たしかに、スナップショットイメージファイルを参照していることが確認できました。

仮想マシンがこういう状態ということは、元のイメージファイルにファイルに対しては書き込みが発生しないので静的な状態では?だから元のイメージファイルを別ディレクトリにコピーしたらバックアップが完了するんぢゃね?

cp /kvm/skyline /backup/skyline.qcow2

で、バックアップは完了?
でも、書き込み途中のデータは元ディスクイメージファイルと新しいディスクイメージファイルに書かれている状況になるので、データの整合性について問題が残るんだよね。
(100MBのファイルを生成中に、40MB分のデータを書いたところでスナップショットされてたら残りの60MB分のデータは新しいディスクイメージファイルに書かれて、分断されてしまわない?)

ではここでもう一回スナップショットを取ってみます。(まだ仮想マシン内では100MBのファイル作成処理は実行中です)

# virsh snapshot-create skyline --disk-only --atomic
ドメインのスナップショット 1466064537 が作成されました

で、スナップショットイメージファイルを確認してみると

# qemu-img info skyline.1466064537
image: skyline.1466064537
file format: qcow2
virtual size: 80G (85899345920 bytes)
disk size: 116M
cluster_size: 65536
backing file: /kvm/skyline.1466064346
backing file format: qcow2
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 1

新しいスナップショットイメージが作成されました。
(仮想マシン内で100MBファイルを作成処理が動いているので、すでにこの時点で116MB消費しています。)
そして、backing file項目で skyline.1466064346 から生成されたスナップショットであることも分かります。

念のため、ここでも仮想マシンがどのイメージファイルを参照しているのかを確認してみます。

# virsh domblklist skyline
ターゲット ソース
------------------------------------------------
vda        /kvm/skyline.1466064537

新しく作成したスナップショットイメージファイルを参照しているのが確認できます。

現在の仮想マシンに関するスナップショット一覧をみてみます。

# virsh snapshot-list skyline
 名前               作成時間              状態
------------------------------------------------------------
 1466064346           2016-06-16 17:05:46 +0900 disk-snapshot
 1466064537           2016-06-16 17:08:57 +0900 disk-snapshot

それではここで本筋とは離れますが、1466064346のスナップショットに戻してみたいと思います。

# virsh snapshot-revert skyline --snapshotname 1466064346 --running
エラー: サポートされない設定: revert to external snapshot not supported yet

がーんだな。
2016/06/16現在Ubuntu 16.04LTS ではvirshコマンドを使って、外部スナップショットからrevertすることができませんでした。

それでは、blockcommitをつかって、スナップショットを1つのファイルにまとめてみたいと思います。

# virsh blockcommit skyline vda --active --verbose --pivot
Block commit: [100 %]エラー: ディスク vda のジョブの並び替えに失敗しました
エラー: ブロックコピーがまだ動作中です: ディスク 'vda' はまだピボットの準備ができていません

ふたたび、がーんだな。
失敗しただと…ブロックコピーがまだ動作中ってどういうこと?

blockjobコマンドを使ってジョブ状況をみてみます。

# virsh blockjob skyline vda
Active Block Commit: [100 %]

いつまでたっても100%から進まない…なんでや…

この100%から進まない問題は、バグとしてリポートされています。
https://bugs.launchpad.net/qemu/+bug/1455475
(2015/05/15にレポートがあがって2016/06/15に「確認」って…おい…)

このままだと、ラチが空かないのでジョブを中断します。

# virsh blockjob skyline vda --abort

# virsh blockjob skyline vda
No current block job for vda

中断できました。

snapshot-create-asとするべき所を、snapshot-createとしていたので、もう一回やりなおし。(snapshot-create とsnapshot-create-as の違いが分かっておりません…)

この仮想マシンを破棄して、別のテストにチャレンジ…

-サポートブログ

Copyright© がちゃぽん! , 2017 All Rights Reserved.