{{tag>kvm lvm gentoo linux}} # ゲスト 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` となっていることを確認します。((512 以外のパターンもあるかもしれませんが……その数字を確認しておきます)) ## パーティションごとにバックアップ `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` コマンドで指定するオフセット位置 `$(( * 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` に続けてイメージファイル名を指定して実行すると、カレントディレクトリにファイルが展開されます。