CentOS7 dump/restore を使用して空のHDDに復旧させるまで

# はじめに
Qiita初投稿です。自分はSEになってまだ3年目のぺーぺーですが、新しい案件で環境構築を任されシステムバックアップの実装もするよう言われました。その際、CentOS7 での復旧手順で地獄を見たので備忘録として残しておきます。誰かの役に立ちますように。

# 環境
- バックアップサーバ
Western Digital製 HDD 3TB
CentOS7.6
レガシーBIOSのみ
IP：192.168.56.10

- バックアップ対象サーバ
Western Digital製 HDD 3TB
CentOS7.6
UEFI対応
IP：192.168.56.1

- リストアサーバ
Western Digital製 HDD 3TB
IP：192.168.56.1

### 前提
- HDD1枚のため、デバイス名は`/dev/sda`とします。
- CentOS7.6のイメージディスク使用。
- バックアップ対象サーバとリストアサーバは同じ筐体を使用。

今回のバックアップ、リストアはレガシーBIOSでブートする場合になります。
UEFIでのリストアはまだ上手くいっていません。。。いつか上げられたら嬉しいです。

# 手順
1. NFSサーバの設定
	まずはバックアップを取るためにNFSサーバ・クライアントの設定します。以下のサイトを参考に構築していきます。  

	### 参考サイト
	[CentOS7.1 NFSサーバ、クライアントの設定](https://qiita.com/sugimount/items/1c1ab9b45b0d862a7dd6#nfs%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E8%A8%AD%E5%AE%9A)
	[NFS サーバ／クライアント設定メモ（CentOS7.1.1503）](https://blog.apar.jp/linux/2712/)

	NFSサービスのインストール

	```
	# yum -y install nfs-utils
	```

	エクスポートポイント(NFS用の共有)設定。
	今回は、 /backup というディレクトリを誰でも触れるようにしている 
	アクセスできるIPアドレスを設定したい場合は、* のところにIPを設定する。

	```
	# vi /etc/exports
	/backup *(rw,async,no_root_squash)
	```

	サービスを起動して有効化  
	以下の２つはOS起動時に自動的に有効にするコマンド

	```
	# systemctl start rpcbind
	# systemctl start nfs-server
	# systemctl enable rpcbind
	# systemctl enable nfs-server
	```

	**ここからはNFSクライアントの設定**

	マウントポイントを作成

	```
	# mkdir /mnt/nfs
	```

	サービスを起動して有効化

	```
	# systemctl start rpcbind
	```

	ポート 2049 の TCP/UDP を許可

	```
	# firewall-cmd --add-port=2049/tcp --permanent
	# firewall-cmd --add-port=2049/udp --permanent
	```
	設定を読込み

	```
	# firewall-cmd --reload
	```

	設定を確認（以下の表示があればOK）

	```
	# firewall-cmd --list-all
	ports: 2049/tcp 2049/udp
	```

	NFSv4でマウント

	```
	# mount -t nfs [サーバ側のIPアドレス]:/backup /mnt/nfs
	```

	※NFSv3とNFSv4の違いは、IPの指定ができる点。その他諸々。
	以下、参考サイト
	[知っておきたいNFSの基本と活用法](https://baremetal.jp/blog/2018/04/17/541/)


1. バックアップ対象サーバのバックアップ実行

	### 参考サイト
	[Linuxシステムバックアップの基本:dump と restore コマンドによるシステムリカバリの方法を今更ながら解説(Linux)](http://success.tracpath.com/blog/2014/04/14/basic-method-system-backup_dump_and_restore_for_linux/)
	[Linux システムバックアップリストア(xfs dump restoreおよびUEFI)](http://chidipy.jpn.com/server/other/xfs_efi_backuprestore.html)

	2-1. 必要なパッケージのインストール
	CentOSの場合、dumpコマンドが標準インストールされていないため、パッケージをインストール
	また、この後使うディスク情報を取るコマンドで、足りないものがあったのでそれもインストールする。

	```
	# yum -y install dump
	# yum -y install lvm2    (lvm系のコマンドのインストール)
	```

	2-2. ディスク情報の出力
	バックアップ対象サーバーのディスク情報をファイルに出力。後でパーテーションの復旧等に使用。

	```
	# LANG=C fdisk -l > /tmp/`hostname`_fdisk.txt
	# LANG=C df -T > /tmp/`hostname`_df.txt
	# LANG=C pvdisplay > /tmp/`hostname`_pv.txt
	# LANG=C vgdisplay > /tmp/`hostname`_vg.txt
	# LANG=C lvdisplay > /tmp/`hostname`_lv.txt
	```

	2-3. ダンプの実行
	バックアップ対象サーバのマウントポイントごとに、ダンプする。 
	今回は、/および、/bootをバックアップ対象とし、tmpfsは、バックアップ対象外とする。

	```
	# dump -f /mnt/nfs/sda2_boot.dump /dev/sda2    (/boot のパーテーション)
	# dump -f /mnt/nfs/sda5_root.dump /dev/sda5    (/ のパーテーション)
	```

	ダンプが終了すると、NFSマウントしたマウント先にダンプファイルが出力されるので、NFSマウントを解除。

	```
	# umount /mnt/nfs
	```


1. 先ほど取ったバックアップを空のHDDに復旧させる(リストアの実行)
	ダンプ終了後、CentOSのインストールCDのレスキューモードを使用してリストア対象サーバにリストアを行う。 
	なお、リストア対象サーバは、OSがインストールされていない新規サーバとしている。

	3-1. レスキューモード起動
	CentOSのインストールCDを用いて、リストア対象サーバを起動。 
	ブートメニューが表示されたら、`Troubleshooting` -> `Rescue a CentOS system`
	の順で選択する。
	しばらく待っていると、1～4番のメニューを選択する画面になるので、3を入力。

	[レスキューモード.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373211/8af0dc79-40b3-0b1b-5875-4e75a57ea63b.png)


	3-2. 初期設定
	キーボードが変だったり、IPが設定されていなかったりするので設定する。

	```
	# localectl set-keymap jp106
	# ip a add [設定したいIP]/[ネットマスク] dev [ネットワークデバイス名]
	例）
	# ip a add 192.168.56.1/16 dev eno1
	```

	3-3. パーティション作成
	新規のHDDに、パーティションを作成。 
	自分の環境では、sda1からsda7までパーテーションを作成し、sda1にブートフラグを設定している。
	設定完了後、パーティションタイプも変更。
	設定の仕方は参考サイトにも書いてある。ちなみに今回は間違ってfdiskでやってしまいましたが特に問題はありませんでした。
	しかし、2TBを超える場合はgdiskコマンドで設定をしましょう。

	```
	# fdisk /dev/sda
	・
	・
	・

	★パーティション作成後
	# mkfs.ext4 /dev/sda2
	# mkfs.ext4 /dev/sda3
	# mkfs.ext4 /dev/sda4
	# mkfs.ext4 /dev/sda5
	# mkfs.ext4 /dev/sda7
	```

	3-4. リストアの実行
	まず、リストアを実行する前に、バックアップイメージを置いたバックアップサーバのNFS領域をマウント。

	```
	# mount -t nfs [バックアップサーバのIP]:[NFS領域] /mnt
	例）
	# mount -t nfs 192.168.56.10:/backup /mnt
	```

	そのままリストアすることは出来ないので、ルートディレクトリをリストアするディレクトリを作成。
	次に、ルートディレクトリをマウントさせていたデバイスをマウント。
	この後、/bootも同様の操作を行う。

	```
	# mkdir /restore
	# mount -t ext4 /dev/sda5 /restore
	# cd /restore
	# restore -rf /mnt/sda5_root.dump
	★ここからboot
	# mount -t ext4 /dev/sda2 /restore/boot
	# cd /restore/boot
	# restore -rf /mnt/sda2_boot.dump
	```

	3-5. chroot環境への移行
	リストアのマウントポイントを仮想ルートディレクトリに設定。

	```
	★chrootした先でboot配下等見れるようにする
	# mount --bind /dev /restore/dev
	# mount --bind /proc /restore/proc
	# mount --bind /sys /restore/sys
	
	# chroot /restore
	```

1. 現在のHDDの環境合わせる
	前のサーバの情報(主にUUID)がそのまま設定されているままなので修正していく。
	4-1. fstabの修正
	UUIDが設定されていると思うので、対応するデバイス名に変更。
	バックアップ対象サーバで、dfすればで見れる。
	※UUIDは適当に変更しましたので気にしないでください。イメージです。

	```
	# vi /etc/fstab
	★変更前
	UUID=11111111-2222-3333-4444-555555555555 /                       ext4    defaults        1 1
	UUID=11111111-2222-3333-4444-555555555555 /backup                 ext4    defaults        1 2
	UUID=11111111-2222-3333-4444-555555555555 /boot                   ext4    defaults        1 2
	UUID=11111111-2222-3333-4444-555555555555 /home                   ext4    defaults        1 2
	UUID=11111111-2222-3333-4444-555555555555 /home/tomatoma          ext4    defaults        1 2
	UUID=11111111-2222-3333-4444-555555555555 swap                    swap    defaults        0 0

	★変更後
	/dev/sda5     /                       ext4    defaults        1 1
	/dev/sda7     /backup                 ext4    defaults        1 2
	/dev/sda2     /boot                   ext4    defaults        1 2
	/dev/sda3     /home                   ext4    defaults        1 2
	/dev/sda4     /home/tomatoma          ext4    defaults        1 2
	/dev/sda6     swap                    swap    defaults        0 0
	```

	4-2. ネットワークインターフェースの修正
	/etc/sysconfig/network-scripts/[ネットワークインターフェース名] にも古いUUIDが設定されているので、nmcli コマンドを使用して現在のUUIDを調べる。あとは頑張って修正。
	※UUIDは適当に変更しましたので気にしないでください。イメージです。

	```
	# nmcli connection show
	NAME    UUID                                  TYPE      DEVICE 
	eno1  123456768-1234-5678-1234-1234567890ab   ethernet  eno1 
	```

	4-2. grub.cfgの修正
	grub2ブート設定(/boot/grub2/grub.cfg)にも、古いパーティションへのUUIDが定義されているので再作成し直す。
	直接編集は推奨されていないため、専用のコマンドを使用。

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

	4-3. mbrにブートローダ(bootのシステム的な) のインストール **超重要**
	これ忘れていたせいで数時間嵌ってしまいました。詳しいことは長くなるので調べてもらえたら幸いです。

	```
	# grub2-install /dev/sda
	```

	4-4. 再起動
	chrootを終了し、レスキューモードからも抜けます。

	```
	★chrootを終了
	# exit
	★レスキューモードを終了
	# exit 
	```

# まとめ
以上で手順は終わりです。手探りの中見つけた方法にはなるので、もしかしたら動かないよ！！！
みたいな人もいるかもしれません。また、この手順も必要じゃない？みたいなのもあるかもしれません。
もしそういった意見がありましたら是非教えて頂けたら幸いです。
ありがとうございました。