「dump」によるシステムバックアップから「restore」でOSを復元(リカバリ)する


以前に「dump」でバックアップしたDebian10 buster (4.19.0)を「restore」でOSを復元する方法が意外にも面倒だったので、備忘録として残しておきます。

はじめに

前回「dump」でバックアップしたDebian10ですが、早速、復元する機会がありましたので、その方法について、いろいろと調べてみました。

まず、最初に「restore」で元のパーティションに戻すだけのことをやってみました。

結果は、grub画面が出てきて、手作業で /boot/grub/grub.cfg を読み込ませるような状態でした。

しかも、エラーにより途中で停止してしまい、Debianは起動できませんでした。

エラーの内容を調べてみると「restore」により、Debianカーネルを読み込む場所が変わってしまったために起動できないことがわかりました。

そして、grubブートローダと「fstab」については、バックアップ時に記述されていたUUIDを「restore」後に新たなUUIDと入れ替える必要があることもわかりました。

/boot/grub/grub.cfg のUUIDは「grub-mkconfig」で更新をして、/boot/efi/grub.cfg のUUIDは「grub-install」で、Debianをマウントするために必要なUUIDは「fstab」を更新する必要があります。

今回やることは、上記の操作を確実に行うための方法になります。

また、この復元方法は同じディスク内にあるubuntu20.04で行ったものですが、方法は多くのlinuxディストリビューションでもほぼ共通していると思います。

OS復元(リカバリ)までの流れ

「dump」によるバックアップデータは前回バックアップしたものを使います。

環境

以前バックアップした「dump」データは、同じハードディスクにあるubuntu20.04に保管しているため、こちらから作業を進めていくことにしました。

ディスクパーティション構成は次のようになります。

sda4 : ubuntu20.04

sda6 : Debian10(restore)

sda5 : grub-boot-efi

全体の流れ

  1. restore前のシステム情報もdumpデータと一緒に保存しておく。
  2. restore対象のディスクパーティションをフォーマットする。
  3. ディスクパーティションはマウント→移動後にrestoreする。
  4. /boot/efi, /proc, /sys, /devをマウントする。
  5. chrootして*Debianファイルシステムのみを隔離する。
  6. 「grub-mkconfig」コマンドで/boot/grub/grub.cfg を更新する。
  7. 「fstab」のUUIDを書き換える。
  8. 「grub-install」でgrub-efiブートローダを更新する。
  9. chrootを抜けて、アンマウントをする。

以上のような流れとなります。

*ubuntu20.04の/proc などマウントしているので、Debianパーティションを仮想ファイルシステムとして作業を行うことができます。

1.restore前のシステム情報を保存する。

念の為に保存しておきます。今回は使う必要がありませんでした。

~$ sudo su -
~# sfdisk -d /dev/sda > /backup/sfdisk.dat
~# cat /etc/fstab > /backup/fstab.dat
~# mount > /backup/mount.dat
~# blkid > /backup/blkid.dat

2.ディスクパーティションをフォーマットする。

今回restoreする対象は /dev/sda6 になります。

/dev/sda6 がアンマウントされていることを確認して、フォーマットを行います。

~# lsblk /dev/sda
~# mkfs -t ext4 /dev/sda6

3.対象となるパーティションをマウントして「restore」する。

マウント先は /mnt/debianにしました。まずは「restore」したデバイスの中身を確認しています。

~# mount /dev/sda6 /mnt/debian
~# cd /mnt/debian
/mnt/debian# restore -rf /backup/debian/debian10.dump
/mnt/debian# ls(中身確認)

4./boot/efi, /proc, /sys, /devをマウントする。

/boot/efi はgrubブートローダ(/dev/sda5)のマウント先になります。すでに空のデレクトリがあります。

/mnt/debian# mount /dev/sda5 /mnt/debian/boot/efi

/proc, /sys, /dev は grub-install, grub-mkconfig を実行するために必要なのでマウントします。

–bind オプションはディレクトリ単位のマウントのときに使います。

/mnt/debian# mount --bind /proc /mnt/debian/proc
/mnt/debian# mount --bind /sys /mnt/debian/sys
/mnt/debian# mount --bind /dev /mnt/debian/dev

5.chrootしてDebianファイルシステムを隔離する。

chrootする理由については、主に作業しているOSの保護が目的だと思います。

/mnt/debian# chroot /mnt/debian
/# 

6.grub-mkconfigコマンドで/boot/grub/grub.cfg を更新する。

「blkid」コマンドで変更されたUUIDを確認できます。これを再設定していきます。

/# blkid /dev/sda6

/boot/grub/grub.cfgの内容から”UUID=”の部分を確認します。

/# cat /boot/grub/grub.cfg | grep /dev/sda6 | grep UUID=

新UUIDへ変更する際には、/boot/grub/grub.cfg を直接編集できないようなので、再設定コマンド(grub-mkdonfig)にて更新を行います。

/# grub-mkconfig -o /boot/grub/grub.cfg

7./etc/fstab のUUIDを書き換える。

「fstab」の内容を出力して、以前のUUIDを確認します。

/# cat /etc/fstab

先程「blkid」で確認した新UUIDをこちらのUUIDと書き換えます。

UUIDの入力は手入力以外(コピペなど)を推奨します。

/# sed -i -e "s/[old_UUID]/[new_UUId]/g" /etc/fstab

“-i “オプションはファイル書き換えに必要ですので、絶対に忘れないで下さい。(下は画面出力のみです)

8.grub-installコマンドでgrub-efiブートローダを更新する。

/boot/efiをマウントしてあることが確認できたら、grub-installを行います。grub-installは/dev/sdaを選択します。(パーティションを指定しない)

/# grub-install /dev/sda

9.chrootを抜けて、アンマウントをする。

chrootを抜けて、/proc, /sys, /dev, /boot/efi をアンマウントをする。

/# exit
/mnt/debian# cd  (カレントから移動)
~# umount /mnt/debian/proc
~# umount /mnt/debian/sys
~# umount /mnt/debian/dev
~# umount /mnt/debian/boot/efi

最後に/mnt/debianをアンマウントして、確認します。

~# umount /mnt/debian
~# mount | grep /mnt/debian

まとめ

今回はDebian10の復元ということで、ネットにあまり情報がなくて、とても苦労しました。

今回は、grubブートローダの更新ということでしたので、ミスをすれば正常に動作しているubuntuまで起動できなくなりそうだったので、慎重に作業を進めていきました。

実際には、fstabを書き換える sed コマンドに”-i ” オプションを付けていなくて、ファイルが更新されなかったりだとか、/proc, /sys, /dev のマウントをしてなくて、grub-mkconfig が使えなかったりだとか、/boot/efiにマウントしなければならないのに、/boot/grubにマウントしてgrub-installできなかったりだとか、失敗ばかりでしたので、結構時間かかりました。

これから、復元されたものが何事もなく使えるのかチェックしていきたいと思います。


コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)