【Linux】restoreコマンドでOS復旧

dump/restoreコマンドを用いたシステム領域復旧の話。

IBMCloudではImagetemplateが使用できるので、ポータル上からポチポチするだけでOS領域のみのバックアップ・リストアできて楽です。が、以下の懸念点があります。(2018/08/03時点)
```
・テンプレートの保管に月$25/GBかかる
・OSのパスワードが新しいものに変わる
・IPアドレスなどネットワーク周りの設定が初期化される
・OSリロードという策もあるが、システムの領域は真っさらになる上にカーネルバージョンも強制的に最新のものになる
```
上記のようにクラウド独自のバックアップサービス使用が困難、かつLinuxバックアップサーバ―が1台しかないとかだと、バックアップサーバ―自体のシステム復旧が必要になった時どうする？となります。

てことで、ここでは"OSレベルでdump/restoreコマンドを使用した復旧手順"です。
流れとしては、
```
- ①dumpコマンドでOS領域(/と/boot)を2ndディスクにバックアップしておく (バックアップ先をNFSとかにしてもOK) 

- ②メディアからブートしてレスキューモード起動 (クラウドのレスキューブートを使用) 

- ③リストア先に合わせてパーティション作成

- ④/と/bootのファイルシステム作成

- ⑤マウントしてリストア実行

- ⑥/dev,/proc,/sysをバインド

- ⑦リストアした/システムをルートにする

- ⑧/boot/grub2/grub.cfgを書き換える

- ⑨/etc/fstabを書き換える

- ⑩GRUB2をPReP Bootデバイス(/dev/xvda)に再インストール

- ⑪メディアを外してリブート
```
~~いや～めんどくさい。~~
<br>
# 事前準備
・OS領域はIBMCloudのVSIデバイス`/dev/xvda`とします。
・バックアップ先として`/bkup`に2ndDISKのFSをマウントしているものとします。

まずパーティションやLVM情報を事前に取得しておきましょう。

```
# sfdisk -d /dev/xvda > /bkup/sfdis.dat
# pvdisplay > /bkup/pvdis.dat
# vgdisplay > /bkup/vgdis.dat
# cat /etc/fstab > /bkup/fstab.dat
# mount > /bkup/mount.dat
# blkid > /bkup/blkid.dat
# vgcfgbackup VG名 -f /bkup/vgcfg.dat　(/領域にLVMが組まれている場合は実施)
```

dumpコマンドがない場合はインストール
```
# yum install dump
```
注意ーーーーー
※dumpはFSタイプが"EXT"でのみ使用できます。
※IBMCloudのVSIのタイプに合わせて本手順では"EXT"とします。
※FSタイプを確認して、もし"XFS"であれば"xfsdump"をインストールしてください。オプションも若干変わります。
ーーーーーーーーーー

# ①dumpコマンドでバックアップを取る。
```
# dump 0 -f /bkup/root.dump /dev/xvda2
# dump 0 -f /bkup/boot.dump /dev/xvda1
```
これでバックアップ完了です。 
/bkup以下を確認して.dumpファイルがあることを確認しましょう。

# ②メディアからレスキューモード起動
物理ならメディアをぶち込み
仮想環境なら管理画面からISOマウント
クラウドならカスタマーポータルからレスキューブートします。(IBM Cloud)

ちなみにメディアのバージョンが古すぎるとこの後の手順でひっかかるので、なるべくリストアするシステムと近いバージョンにしましょう。同じメジャーバージョンなら安心です。
また、レスキューメディアとリストアシステムのアーキテクチャ(64,32bit)も合わせておく必要があります。

# ③パーティション作成
ISOブートしてKVMコンソールでレスキューモードに入りましょう。
CentOS7では`Trouble shooting`から`Rescue a CentOS system`を選択します。
![20180615134900.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/0bc036b4-cf7c-667b-833f-cc6e1c416189.jpeg)

```
sh-4.2#
```
などのプロンプトがでてくればOK
2ndDISKのデバイスはみえているはずなので、
適当なリストアファイル用ディレクトリを作成します。(本手順では/bkup)

リストアファイルが置いてある/bkupをマウント

```
# mount /dev/vg_bkup/lv_bkup /bkup
```
もしデバイスのstateが`not available`になっててできない場合は有効化。

```
# lvchange --available y /dev/vg_bkup/lv_bkup
```
バックアップしたファイルが見えているか確認。

```
# ls -l /bkup
```

事前準備で取得したsfdis.datから構成情報をリストア

```
# sfdisk --force /dev/xvda < /bkup/sfdis.dat
```
※事前準備でvgcfgbackupしていた場合は以下も実施

```
# lvm vgscan
# lvm vgcfgrestore -f /bkup/vgcfg.dat ${VGNAME}
```

# ④ファイルシステム再作成

/と/bootのシステムを再作成します。FSタイプは実機に合わせましょう。

```
# mkfs.ext3 -f /dev/xvda1
# mkfs.ext3 -f /dev/xvda2
```

# ⑤マウントしてリストア実行
リストア対象のファイルシステムをマウントしておく必要があるので、一時的なマウント先を作成します。名前やパスはなんでもいいです。

```
# mkdir /restore
```
rootをマウントしてリストア
※デバイス名に注意

```
# mount /dev/xvda2 /restore
# cd /restore
# restore -rf /bkup/root.dump
```
一次領域アンマウント

```
# cd /
# umount /restore
```
bootをマウントしてリストア

```
# mount /dev/xvda1 /restore
# cd /restore
# restore -rf /bkup/boot.dump
```
アンマウント

```
# cd /
# umount /restore
```
再度、rootをマウント

```
# mount /dev/xvda2 /restore
```

# ⑥/dev,/proc,/sysをバインド
これしないと後のgrub2関係がうまくいかないっぽいのでそれぞれバインド

```
# mount --bind /proc /mnt/sysimages/proc
# mount --bind /sys /mnt/sysimages/sys
# mount --bind /dev /mnt/sysimages/dev
```

# ⑦リストアした/システムをルートにする
`chroot`でルート変更

```
# chroot /restore
```
/bootをマウント

```
# mount /dev/xvda1 /boot
```

# ⑧/boot/grub2/grub.cfgを書き換える
ファイルシステムを再作成した時点でUUIDが変わっています。
そのため、`/boot/grub2/grub.cfg`に書かれている(/boot)のUUIDを
再作成した方のUUIDに書き換える必要があります。
grub.cfgは直接編集NGなので、現環境に合わせてgrub.cfgを再生成する以下コマンドを実施

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

# ⑨/etc/fstabを書き換える
`/etc/fstab`も同様、書き換える必要があります。
こちらは直接編集可ですが、手打ちは怖いので以下のコマンドを実行。

```
# export NEWUUID=`blkid | grep /dev/xvda1 | awk '{print $2}' | cut -d '"' -f 2`
# export OLDUUID=`cat /bkup/fstab.dat | grep /boot | awk '{print $1}' | cut -d '=' -f 2`
# sed -i.org -e "s/UUID=${OLDUUID}/UUID=${NEWUUID}/g" /etc/fstab
```

# ⑩GRUB2をPReP Bootデバイス(/dev/xvda)に再インストール

```
# /sbin/grub2-install /dev/xvda
```
`"install finished.  no error reported"`
と表示されればOK

# ⑪メディアを外してリブート
あとはリブートし、リストアしたシステムからブートするようにします。

この手順はOS領域のFSを一旦消す手順なので、実施する場合は注意してください。
またコマンドはコンソール上なのでコピペができないと思います。 
バックアップと一緒に上記コマンドのスクリプト作って取っておいたがいいかもですね。
<br>
以上ウ