wiki:linux/KvmStorage

KVMのストレージメモ

sparceでないrawイメージを作る

qemu-imgでrawイメージを作成すると、サイズの大きなイメージでも一瞬で作ることができます。

# time qemu create -f raw test.raw 100G
Formatting 'test.raw', fmt=raw size=107374182400

real 0m0.011s

ls -sで実際のファイルサイズを確認すると、サイズが0であることが分かります。

# ls -s
0 test.raw

これは、qemu-imgでイメージを作成するとsparseファイルとして作成されるためです。sparseファイルは初回書き込み時のアクセス性能が落ちます。sparseでないファイルイメージを作成するには、ddを使います。

# dd if=/dev/zero of=test.raw bs=1G count=100

sparceファイルの扱い

sparceでないファイルの0で埋まっている箇所をsparceと扱いコピーするには、

# cp --sparce=always org.raw dest.raw

差分イメージを作成

仮想マシンイメージを作成するごとに、OSをインストールするのは手間です。そんなときは、テンプレートイメージを作成しておき、 テンプレートイメージからの差分のみ記録するイメージを作成するとディスクを効率的に利用でき、イメージ作成も早くすることができます。 テンプレートイメージからイメージ作成は、次のようにします。

# qemu-img create -b CentSO64_BASE.qcow -f qcow2 CentOS64_Working.qcow

ベースイメージは、raw形式も利用することができます。

ディスクのオンラインスナップショット

オンラインスナップショットは、VMを動作させたまま、ディスクのスナップショットを取る方法です。ディスクのバックアップに利用することができます。

下記の機能は比較的新しい機能で、RHEL系OSだとRHEVで提供されている qemu-kvm-rhevが必要となります。また、Ubuntuでは、13.04以降が必要となります。

# virsh snapshot-create-as --domain DOMAIN snap1 "Snapshot Description" --disk-only \
  --diskspec vda,snapshot=external,file=/tmp/snap1.qcow2 \              
  -- atomic 

上記のコマンドを実行すると、もともとの仮想マシンイメージは、読み込み専用となり、新しい追記は、/tmp/snap1.qcoww2に行われます。 スナップショットを取得してから、仮想マシンイメージのバックアップを取ることにより、安全にバックアップと取ることができます。 (バックアップ中にディスクへの書き込みが発生すると整合性の取れないバックアップディスクになるためです)

現在書き込み中のストレージは下記のコマンドで確認できます。

# virsh domblklist DOMNAME
Target     Source
----------------------------------------------------
vda        /tmp/snap1.qcoww2

バックアップが終了したら、blockpullで差分イメージを元のイメージに統合し、スナップショットを削除します。

# virsh blockpull --domain DOMNAME --path \
    /tmp/snap1.qcow2 \
    --base /var/lib/libvirt/images/DOMNAME.img --verbose --wait
# virsh snapshot-delete ALMTest snap1 --metadata

イメージの編集

libguestfs-toolsを利用すると、簡単にイメージをマウントして編集することができます。 例えば、下記のような感じです。

# export LIBGUESTFS_BACKEND=direct
# guestmount -a cirros-jp-0.3.3-x86_64-disk.img -m /dev/sda1 --rw /mnt

-mで編集したいパーティションを指定します。