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)に再インストール
- ⑪メディアを外してリブート
いや~めんどくさい。
事前準備
・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
を選択します。
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を一旦消す手順なので、実施する場合は注意してください。
またコマンドはコンソール上なのでコピペができないと思います。
バックアップと一緒に上記コマンドのスクリプト作って取っておいたがいいかもですね。
以上ウ