CentOS7でddコマンドを用いた起動用ディスクバックアップ、リストア（低頻度）

#概要

* CentOS7で運用をしているサーバーの起動用ディスク(SSD)が購入から5年ほど経ったので、容量の多い新しいディスクに入れ替えた
* 環境の変更頻度が低いため、準備が楽なオフラインバックアップ・リストアとする
* 物理環境なのでEFIパーティションも含めて作業

#流れ
1. 準備：予めバックアップ先のDISK（Bとする）、リストア先のDISK（Cとする）は筐体に接続しておく

1. レスキューモード起動：ルートを含むDISK（Aとする）のバックアップでありデータの静止点をとるためレスキューモードで起動する。この操作にはCentOS7のインストールメディアが必要が必要なため用意すること。

2. バックアップ取得：`dd`コマンドを使いAのバックアップをBに取得、同時に`sgdisk`コマンドを使いAのGPTパーティションテーブルの情報もBにバックアップする

3. リストア先ディスク準備：リストア作業の準備としてCのパーティションをAと同じになるように構成する。この時Bに取得したGPTパーティションテーブルバックアップからリストアすると楽

4. リストア：`dd`コマンドを使い、Bに取得したAのバックアップをCにリストアする

5. リストア後作業：OSを再起動しBIOSからデバイスの起動順序をCのDISKが優先となるように変更する

#環境
##バックアップ作業
###バックアップ元（A）
* OS：CentOS7
* DISK：120GiB SSD /dev/sda （含む、EFI、ブート、ルートパーティション）
* パーティション：下記の通り、物理ディスクの先頭にEFIパーティションがあり、ルートを含むパーティションはLVMで切られている。マウントポイントを指定する/etc/fstabではディスクがUUIDによって指定されている↓

```
[20:14:17 linux@~]$ lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda               8:0    0 223.6G  0 disk  
├─sda1            8:1    0   200M  0 part  /boot/efi
├─sda2            8:2    0   500M  0 part  /boot
└─sda3            8:3    0 111.1G  0 part  
  ├─centos-swap 253:0    0   7.8G  0 lvm   [SWAP]
  ├─centos-root 253:1    0    50G  0 lvm   /
  └─centos-home 253:2    0  53.3G  0 lvm   /home

[01:48:04 root@~]# cat /etc/fstab
UUID=bf5c7aae-20f9-4bd6-80b2-54260515abbf /boot                   xfs     defaults        1 2
UUID=E6BB-A053          /boot/efi               vfat    umask=0077,shortname=winnt 0 0
/dev/mapper/centos-root /                       xfs     defaults        1 1
/dev/mapper/centos-home /home                   xfs     defaults        1 2
/dev/mapper/centos-swap swap                    swap    defaults        0 0

```
###バックアップ先（B）
* OS：同一
* DISK：2TiB HDD /dev/sdb （バックアップ元のDISKと同じ容量があればOK）
* ディレクトリ：/work/backup/

##リストア作業
###リストア元（B）
→上記「バックアップ先」に記載のもの
###リストア先（C）
* DISK：240GiB SSD /dev/sdc

#手順
##1. 準備
* サーバの電源を停止し、SATAでバックアップ先のDISK（B）、リストア先のDISK（C）を接続する

* レスキューモードでもUSB接続のHDDは参照できたため、接続方法は問わない

##2. レスキューモード起動
* CentOS7のインストールメディアをサーバに接続し、再起動。BIOS画面にて起動順序をインストールメディア優先にし、インストールメニューからレスキューモードを選択する

* レスキューモード起動時に既存のシステムに対して書き込みを許可するか否かの選択肢が出るが、許可を選択

* インストールメディアの作成方法はQiitaに参考となる投稿がありましたのでつかわせていただきました→https://qiita.com/fiftystorm36/items/27368f855141b311d014

* 今回レスキューモードで起動したのはルートを含むDISK（Aとする）のバックアップでありデータの静止点をとるためでしたが、そこまで気にしないという人はランレベル1とかで作業してもいいような気がします

##3. バックアップ取得
#### データバックアップ

* システムディスクであるsdaを丸ごとバックアップしたいので`dd`コマンドを使いAのバックアップをBに取得する

```
dd if=/dev/sda conv=sync,noerror bs=64k status=progress | gzip -c > /mnt/sysimage/work/backup/yyyymmdd_sda_dd_backup.gz
```

* レスキューモードでは、レスキュー対象のOSの領域が`/mnt/sysimage`配下にマウントされる
* 私の環境(120GiB)では2時間程度かかりました
* オプションは以下の通り
* noerror    読み込みエラーが発生しても無視
* sync    連続して NUL (バイト 0) を詰める
* bs    一度に指定されたデータ量ごとにコピーする
* progress 進捗表示


#### GPTパーティションテーブルバックアップ

* ddコマンドではGPTパーティションテーブルの情報までバックアップされないようなので、`sgdisk`コマンドを使いAのGPTパーティションテーブルの情報もBにバックアップする

```
sgdisk --backup=/mnt/sysimage/work/backup/yyyymmdd_sda_GPT_backup /dev/sda
```
 
##4. リストア先ディスク準備
* リストア作業の準備としてCのパーティションをAと同じになるように構成する
* 今回はBに取得したGPTパーティションテーブルバックアップからリストアする

```
sgdisk --load-backup=/mnt/sysimage/work/backup/yyyymmdd_sda_GPT_backup /dev/sdc
```



##5. リストア
* `dd`コマンドを使い、Bに取得したAのバックアップをCにリストアする

```
gzip -c /mnt/sysimage/work/backup/yyyymmdd_sda_dd_backup.gz | dd of=/dev/sdc bs=64k
```

* これは確か30分程度

##6. リストア後作業
* OSを再起動しBIOSからデバイスの起動順序をCのDISKが優先となるように変更する
* この時AのDISKは接続解除すること。パーティションのUUID情報が同一になってしまうので不具合が起こる可能性がある



#所感
* Qiita初投稿がこんな三文記事でいいのか微妙ですが、「ddにしようか、xfs_dumpでオンラインバックアップにしようか」と悩んだり、「ddでGPTのパーティション情報はコピーされるの？！？！」と狼狽えたりしたので、役にたてればいいなと思いました
* 自宅のサーバで低頻度でやるならこれくらいがちょうどいいかなって思ってます
* 誤りなどありましたらごめんなさい。ご指摘お願いします。。