ゲスト vm のシステムバックアップを取得する
kvm ホスト側からゲスト用 lv のファイルシステムをマウントして dump コマンドでイメージバックアップを取得する手順です。
前提
うちの環境では kvm ホスト側の lvm で作成したボリュームをそのままゲストに渡しています。
dump コマンド
バックアップ取得作業をする kvm ホスト os で dump
コマンドを用意します。
# emerge -av dump These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild N ] app-arch/dump-0.4.46::gentoo USE="bzip2 readline ssl zlib -debug -ermt (-libressl) -lzo (-selinux) -sqlite -static {-test} -uuid" 565 KiB Total: 1 package (1 new), Size of downloads: 565 KiB Would you like to merge these packages? [Yes/No] y
ゲスト vm の停止
まずはゲスト vm を落とします。
guest-os # shutdown -h now
ループバックデバイスの作成
kvm ホスト上でループバックデバイスを作成します。
空きループバックデバイスの確認
losetup -f
を打つと、空いているループバックデバイスを教えてくれます。
# losetup -f /dev/loop0
/dev/loop0
が空いている、使用可能とのことなので、ここを使います。
ループバックデバイスの作成
同じく losetup
コマンドを使用します。ゲスト vm のシステムディスクは /dev/vg001/lv001 であるとします。
# losetup /dev/loop0 /dev/vg001/lv001
このコマンドで vg001-lv001
が /dev/loop0 と接続されます。
ループバックデバイスの状態確認
gdisk
または fdisk
コマンドを使用して、ディスクとして見えていることを確認します。
# gdisk -l /dev/loop0 GPT fdisk (gdisk) version 1.0.1 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Disk /dev/loop0: 41943040 sectors, 20.0 GiB Logical sector size: 512 bytes Disk identifier (GUID): 8DC3B672-B3E1-4926-A9A7-A393DC074B63 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 41943006 Partitions will be aligned on 8-sector boundaries Total free space is 6 sectors (3.0 KiB) Number Start (sector) End (sector) Size Code Name 1 40 4135 2.0 MiB EF02 BIOS boot partition 2 4136 266279 128.0 MiB 8300 Linux filesystem 3 266280 8654887 4.0 GiB 8304 Linux x86-64 root (/) 4 8654888 12849191 2.0 GiB 8300 Linux /var 5 12849192 29626407 8.0 GiB 8300 Linux /var/tmp 6 29626408 38015015 4.0 GiB 8300 Linux /usr/src 7 38015016 40112167 1024.0 MiB 8200 Linux swap 8 40112168 41943006 894.0 MiB 8300 Install temp
見えてますね。ここで Logical sector size: 512 bytes
となっていることを確認します。1)
パーティションごとにバックアップ
gdisk
で表示されたリストの中で、必要なパーティションを1つずつ以下の手順でバックアップしていきます。
対象パーティションのマウント
オフセットを指定してループバックマウントします。
# mount -o loop,offset=$((4136 * 512)) /dev/loop0 /mnt/tmp
ここで指定している $((4136 * 512))
について、4136
というのは gdisk
で確認した時に2番目のパーティションの Start (sector)
に表示されていた数字です。Logical sector size: 512 bytes
で、開始位置が 4136 Sector なので、乗算してオフセット位置を指定してあげます。
マウントが通れば、通常のファイルシステムと同じように使用できます。ちなみにこの手順では /boot パーティションですね。
# ls /mnt/tmp grub kernel-4.8.17-hardened-r2.170528.01 lost+found
イメージバックアップの作成
dump
コマンドを使用します。
# dump -0f lv001p02.img /mnt/tmp DUMP: WARNING: no file `/etc/dumpdates' DUMP: Date of this level 0 dump: Sun Jul 2 11:52:13 2017 DUMP: Dumping /dev/loop1 (/mnt/tmp) to elsie_lv001p02.img DUMP: Label: boot DUMP: Writing 10 Kilobyte records DUMP: mapping (Pass I) [regular files] DUMP: mapping (Pass II) [directories] DUMP: estimated 12035 blocks. DUMP: Volume 1 started with block 1 at: Sun Jul 2 11:52:14 2017 DUMP: dumping (Pass III) [directories] DUMP: dumping (Pass IV) [regular files] DUMP: Closing elsie_lv001p02.img DUMP: Volume 1 completed at: Sun Jul 2 11:52:15 2017 DUMP: Volume 1 12650 blocks (12.35MB) DUMP: Volume 1 took 0:00:01 DUMP: Volume 1 transfer rate: 12650 kB/s DUMP: 12650 blocks (12.35MB) on 1 volume(s) DUMP: finished in 1 seconds, throughput 12650 kBytes/sec DUMP: Date of this level 0 dump: Sun Jul 2 11:52:13 2017 DUMP: Date this dump completed: Sun Jul 2 11:52:15 2017 DUMP: Average transfer rate: 12650 kB/s DUMP: DUMP IS DONE
/mnt/tmp にマウントしているファイルシステムを、-0f
の次に指定するファイル名でバックアップイメージを作成します。
対象パーティションのアンマウント
通常のファイルシステムと同じです。バックアップの取得が完了したらアンマウントします。
# umount /mnt/tmp
以上の手順を必要なパーティションの数だけ繰り返します。置き換える箇所は mount
コマンドで指定するオフセット位置 $((<Start> * 512))
の部分と、dump
コマンドの出力ファイル名だけです。
ループバックデバイスの切断
必要なパーティション全てのバックアップが完了したら、ループバックデバイスを切断します。
確認
最初に打った「空きループバックデバイスを探す」コマンドを打ってみます。
# losetup -f /dev/loop1
いま /dev/loop0 は使用中なので、次に使用可能なループバックデバイスは loop1
になっています。
切断
losetup
コマンドに -d
を付けて切断します。
# losetup -d /dev/loop0
切断されたことを確認
loop0
が使用可能な状態に戻っていることを確認します。
# losetup -f /dev/loop0
リストアしてみる
適当な lv を作るなり、適当なディレクトリなりで restore
コマンドを使ってイメージが復元できることを確認します。以下の手順では適当な lv を /mnt/target にマウントしてあるものとします。
# cd /mnt/target # restore -rvf /path/to/img/lv001p02.img
-rvf
の f
に続けてイメージファイル名を指定して実行すると、カレントディレクトリにファイルが展開されます。