ゲスト vm のシステムバックアップを取得する

kvm ホスト側からゲスト用 lv のファイルシステムをマウントして dump コマンドでイメージバックアップを取得する手順です。

うちの環境では kvm ホスト側の lvm で作成したボリュームをそのままゲストに渡しています。

バックアップ取得作業をする 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 を落とします。

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

-rvff に続けてイメージファイル名を指定して実行すると、カレントディレクトリにファイルが展開されます。

1)
512 以外のパターンもあるかもしれませんが……その数字を確認しておきます
https://manimani.cc/lib/plugins/linkback/exe/trackback.php/wiki:kvm:system_backup_with_dump_lv