HDDをクローン化 ( using Clonezilla Live)

# サーバ内蔵HDDをクローン化
#はじめに
搭載HDDが一本しかないサーバのディスク障害対策を考えます。バックアップをとっておけ！というのがそもそも論なのですが、最短復旧を目的にして「HDDをクローン化しておいて、HDDが飛んだときはいつでも差し替えて使えるようにする」という対策案を検証することになりました。
昔、Mondo Rescueを使ったり、商用のCDブートできるバックアップソフトで対応したことがありましたが、今回はClonezilla-2.6.6.15を使ってみます。
検証に使うマシンにはLinuxが入ってますが、Windowsが入っていても使える手法です。

#用意するもの

- バックアップ対象のx86_64サーバ(VM on VMware vShpere Hypervisor 6.7u3 ）

- バックアップ先の外付けUSB-HDD
- リストアする内蔵HDD

- Clonezilla LiveのISO

#検証イメージ
![Clonezilla.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531509/0cefba93-0a08-e849-6466-ce4c6e5de698.png)
おおまかな手順はこんなかんじです。
Step.1: Clonezilla Liveで起動
Step.2: 内蔵HDDの中身を外付けHDDにバックアップ
Step.3: 内蔵HDDを交換用のHDDと入れ替えて、外付けHDDからリストア
Step.4: 交換用HDDを抜き出し、予備パーツとする。内蔵HDDを戻して運用再開

#準備作業
Clonezilla LiveのブータブルCDメディアを作成します。作成といっても今回は仮想マシンで読み込めればいいので、実際のCDメディアに書き込みは行いません。ISOを取ってくるだけです。
本家のサイトからダウンロードしましょう。今回のバージョンは、2.6.6-15
https://clonezilla.org/downloads.php
ダウンロード前に3つの選択肢があるので、下記のように選んでダウンロードしました。

| Item | Input |
|:-----|-------:|
|CPU architecutre|amd64|
|file type|iso|
|repository|auto|

ダウンロードしたISOファイルはVMware vShpere Hypervisor(ESXi)のデータストアに配置します。

#Step.0: 準備作業（仮想マシンの設定変更）
今回の検証には、前に作ってあったCentOS8.1の入っている仮想マシンを使います。
まず、仮想マシンの設定を以下のとおり変更しました。
##Clonezilla Liveのセット
VMware ESXiにアクセスして、対象の仮想マシンの`「設定の編集」`を開きます。CD/DVDドライブを`データストアISOファイル`にして、`clonezilla-live-2.6.6-15.amd64.iso`を選択します。
##外付けUSB HDDの接続
次にUSB-HDDをVMware ESXiに接続します。今回はUSB3.0規格のものを使いました。これを仮想マシン側で認識させるために仮想マシンの`「設定の編集」`を開き、新規デバイスで`USBコントローラ`を選び`USB3.0`を選択して追加します。
##CDブートさせるため処理
仮想マシンはそのまま起動すると仮想ディスクから普通にインスト済みのOSが上がってきてしまいます。CDからブートさせるため、起動時に起動元を選べるようにします。`「設定の編集」`で仮想マシンオプションタブを開き、`強制的にBIOSセットアップ`にチェックを入れます。こうすることで起動時に何からブートさせるか選ばせることができます。
#Step.1: Clonezilla Liveで起動
早速起動します。OSのブート画面に進まず、`Boot Manager`の画面が開かれます。私の環境では以下の通りでした。

```rust:Boot_Manager
Boot normally

CentOS Linux
EFI Virtual disk (0.0)
EFI VMware Virtual SATA CDROM Drive(0.0)
EFI Network
EFI Network 1
```
`EFI VMware Virtual SATA CDROM Drive(0.0)`を選択すると、ISOからブートされてグラフィカルな画面が立ち上がるので、`Clonezilla live (Default settings, VGA 800x600)`を選びます。

最初に`Choose language`で言語を選びます。はじめ日本語を選んでやってみたのですが、訳が分かりにくいので、私は`en_US.UTF-8 English`で進めました。
このあと`Keyboard configuration`でキーボード設定に進みます。デフォルトの`keep keep the default keyboard layout - US keboard`を選びました。

Clonezillaの対話画面をメニュー形式ですすめるか、CLIにするか尋ねられます。今回はメニュー形式で操作するため`Start_Clonezilla Clonezilla`を選択して開始します。


#Step.2:内蔵HDDの中身を外付けHDDにバックアップ
Clonezillaが立ち上がり、モード選択メニューが表示されます。

```rust:モード選択メニュー
device-image　work with disks or partitions using image
device-device work directly from a disk or partition to a disk or partition
remote-source Enter source mode of remote device cloning
remote-dest　 Enter destination mode of remote device cloning
lite-server　 Enter_Clonezilla_live_lite_server
lite-client　 Enter_Clonezilla_live_lite_client
```
こういうソフトって、最初に選ぶのはバックアップ用途かリストア用途かという選択だと勝手に思い込んでたため、このメニュー画面で求められている意味が分からなかったのです。。
実際のバックアップ時の挙動としては

- `device-image`はHDDの内容をイメージファイル（実際はメタ情報を含む複数のファイル群）として、指定した先に作成してくれるモード。
- `device-device`はHDDの内容を別のHDDにまんま書き込んでくれるモード。

という動作でした。

今回はディスクの中身をイメージとして取得したいので、`device-image`を選択します。

`Clonezilla image directory`画面に進みます。ここではバックアップもしくはリストアしたいデバイスを選びます。

```rust:ソースデバイス選択メニュー
local_dev　　 Use local device
ssh_server    Use SSH server
samba_server  Use SAMBA server (Network Neighborfood server)
nfs_server    Use NFS server 
webdav_server Use_WebDAV server
s3_server     Use_AWS_S3_server
enter_shell   Enter command line prompt. Do it manually
ram_disk      Use memory
skip          Use existing /home/partimag (Memory! *NOT RECOMMENDED*)
```
sambaやNFSは、リストアのときに使いそうな選択肢ですね。AWS S3まであるのはびっくりしました。
内蔵HDDのバックアップを接続されたUSB-HDDに作成するので、`local_dev`を選択し、OKします。すると次のようなメッセージがながれます。

```
ocsroot device is local_dev
Preparing the mount point /home/partimag...
If you want to use USB device as a Clonezilla image repository, plese
 * Insert USB device into this Machine *now*
 * Wait for about 5 secs
 * Press Enter key
so that the OS can detect the USB device and later we can mount it as /home/partimg.
press "Enter" to continue.....
```
USBデバイスをソースデバイスに使いたいときは、このタイミングで差し込めってことですね。私の場合は、もうすでにUSB-HDDは差し込んでいました。Enterを押します。

```
Every 3.0s: ocs-scan-disk

2020/06/13 05:12:40
You can insert storage device into this machine now if you want to use that, then wait for it to be detected.
Scanning devices... Available disk(s) on this machine:
===================================
Excluding busy partition or disk...
/dev/sda: Virtual_disk_ No_disk_serial_no 21.5GB
/dev/sdb: Transcend_ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 2000GB
===================================
Update periodically. Press Ctrl-C to exit this window.
```
2つのディスクが認識されていることがわかります。一本目が仮想マシンが持つ仮想ディスクです。二本目がTranscend社製の2TBのUSB-HDDです。XXXの箇所はディスクのシリアルナンバーのようなので伏せました。
Ctrl-Cします。

/home/partimagにマウントさせるパーティションを選択します。バックアップ目的の時は、/home/partimagに書き出されますのでバックアップ先のディレクトリを指定するメニューです。

```
sda1 600M_vfat_NO_NAME(In_Virtual_disk_)_No_disk_serial_no
sda2 1G_ext4(In_Virtual_disk_)_No_disk_serial_no
sdb1 1.8T_vfat_0x41:_Dirty_(In_Transcend_)_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
USB-HDD中に保存したいので、sdb1を選択します。するとディレクトリの一覧が表示されるので、バックアップしたいディレクトリを選びます。※ディレクトリの一覧の画面は割愛します。
USB-HDDの直下に作ってあったbackupというディレクトリを選びました。結果、以下のようにマウントされました。

```
Running: mount --bind -o noatime,nodiratime /tmp/ocsroot_bind_root/backup /home partimage
The file system disk space usage:
********************************************************.
SOURCE             FSTYPE  SIZE  USED  AVAIL  USE%  TARGET
/dev/sdb1[/backup] vfat    1.8T  113G  1.7T     6%  /home/partimag
********************************************************.
Press "Enter" to continue......
```
操作モードを選択せよとのこと。

```
Beginner  Beginner mode: Accept the default options
Expert    Expert mode: Choose your own options
Exit      Exit. Enter command line prompt
```
今回は`Expert`モードを選んで、オプションを選びながら進めることにします。

次は、この作業で何をしたいのかを選ぶメニューです。バックアップするのか、リストアするのか、イメージを暗号化するのかなどを選べます。

```
savedisk             Save_local_disk_as_an_image
saveparts            Save_local_partitions_as_an_image
restoredisk          Restore_an_image_to_local_disk
restoreparts         Restore_an_image_to_local_partitions
1-2-mdisks           Restore_an_image_to_multiple_local_disks
recovery-iso-zip     Creage_recovery_Clonezilla_live
chk-img-restorable   Check_the_image_restorable_or_not
cvt-img-compression　Convert_image_compression_format_as_another_image
encrypt-img          Encrypt_an_existing_unencrypted_image
decrypt-img          Decrypt_an_existing_encrypted_image
exit                 Exit. Enter command line prompt
```
内蔵HDDをイメージとしてバックアップしたいので、`savedisk`を選びました。
イメージファイルを格納するディレクトリ名を指定します。デフォルトだと`日付-img`になるようです。

バックアップ元のローカルディスクを選択するメニューが表示されます。

```
[*] sda 21.5GB_Virtual_disk__No_disk_serial_no
```
私の環境では、もともとディスクを2本認識(sda,sdb)していて、そのうちsdbをバックアップの書き込み先に指定してるので、表示されるのは1本だけでした。このままOkします。

このあといくつかオプションを設定します。
バックアップに使うコマンド(partclone, partimage, dd, ntfsclone)をどうするか指定します。指定するといっても優先順位を決めるようです。

```rust:Priority
-q2  Priority: partclone > partimage > dd
-q1  Priority: Only dd ( supports all filesystem, but inefficient)
-q   Priority: ntfsclone > partimage > dd
     Priority: partimage > dd (no ntfsclone)
```

デフォルトの`-q2`オプションで行きました。

```rust:advanced_parameters
[*] -c    Client waits for confirmation before cloning
[*] -j2   Clone the hidden data between MBR and list partition
・・・省略・・・
```
ここでもデフォルトの`-c`と`-j2`だけを選んで進めました。
圧縮形式を指定します。

```rust:compression
-zip Use parallel gzip compression for multicore/CPU
-z1  gzip compression (fast with a smaller image)
・・・省略・・・
-z0  No compression (fastest but largest image size)
```
バックアップ元が20GB程なのに対し、バックアップ先は1.8TBもあるので圧縮する意味がないですから、まずは`-z0`の圧縮なしにしました。

作成されるイメージファイルは、あるサイズで切り出され、複数のファイルに分かれます。次に定めるオプションは、この切り出しを何MBごとに分けるか指定します。10MB以上で指定する必要があります。またFAT32イメージの場合、4096MB以上にしてはいけないとのことです。それと0にしてもダメです。デフォルトの`4096`MBで進めます。

バックアップ前のファイルシステムにfsckをかけるかどうか尋ねられます。

```rust:fsck
-sfsck   Skip checking/repairing source file system
-fsck    Interactively check and repair source file system before saving
-fsck-y  Auto (Caution!) check and repair source file system before saving
```
オプションを指定して`fsck`かけてみます。

今度は、バックアップ後のイメージがリストアできるようなイメージであるかをチェックするかどうか指定します。なかなか親切な仕様です。

```
      Yes, check the saved image
-scs  No, skip checking the saved image
```
チェックしてもらうことにしました。

バックアップしたイメージファイルを暗号化するかどうかを決めます。

```
-senc  Not to encrypt the image
-enc   Encrypt the image
```
とくに暗号化する必要がないので、`-senc`にします。

最後に、バックアップ実行後のアクションを選びます。

```
-p choose    Choose reboot/shutdown/etc when everything is finished
-p cmd       Enter command line prompt
-p reboot    Reboot
-p poweroff  Shutdown
```
私は終わったらCLIでプロンプトを表示させたいので、`-p cmd`にしました。

以上で、設定終了です。

```rust:最終確認
PS. Next time you can run this command directly:
/usr/sbin/ocs-sr -q2 -c -j2 -zip -i 4096 -fsck -senc -p cmd savedisk 2020-06-13-06.img sda
This command is also saved as this file name for later use if necessary: /tmp/ocs-2020-06-13-06-img-2020-06-13-06-51
```
Enterキーを押して実行させます。実行されると直後に今回のアクションの確認画面が表示されます。これのあとに実際にバックアップが進みます。

```
The following step is to save the hard disk/partition(s) on this machine as an image:
******************************************************.
Machine: VMware7,1
sda (21.5GB_Virtual_disk__No_disk_serial_no)
sda1 (600M_vfat_0x41:_Dirty_(In_Virtual_disk_)_No_disk_serial_no)
sda2 (1G_ext4(In_Virtual_disk_)_No_disk_serial_no)
sda3 (14.4G_LVM2_member(In_Virtual_disk_)_No_disk_serial_no)
******************************************************.
-> "/home/partimag/2020-06-13-06-img".
```
fsckを実行する設定している場合は、この後にfsckに関する画面も表示されます。
バックアップが走り出すと、画面上に進捗状況がグラフィカルに表示されます。
完了すると、リストア可能なイメージファイルかを確認してくれます。問題なければジョブが終了します。

```
Checking if udevd rules have to be restored...
This program is not startedby Clonezilla server, so skip nothing it the job is done.
Finished!
Generating a tag file for this image...
Now syncing - flush filesystem buffers...
Ending /usr/sbin/ocs-sr at YYYY-MM-DD HH:MM:SS UTC...
```
この後は、バックアップジョブ実行後のアクションとして設定した挙動に入ります。私の場合はコマンドプロンプトが返ってきました。
#Step:3 内蔵HDDを交換用のHDDと入れ替えて、外付けHDDからリストア
クローンHDDを作るためにHDDを交換します。仮想マシンでやっていますので、`設定の編集`で22GB程の`ハードディスクを追加`してやります。そして先ほどまで使ってた仮想ディスクは削除してやりました。ただしデータストア上には残してます。
Clonezilla liveのISOを接続して、もう一度`強制的にBIOSセットアップ`にチェックを入れてから起動させます。
開始までの一連の設定は下記の流れです。

- Boot Managerの表示されるので`EFI VMware Virtual SATA CDROM Drive(0.0)`を選びます。
- `Clonezilla live (Default settings, VGA 800x600)`を選びます。
- `Choose language`で`en_US.UTF-8 English`を選びます。
- `Keyboard configuration`で`keep keep the default keyboard layout - US keboard`を選びます。
- `Start_Clonezilla Clonezilla`で開始します。

デバイスを指定するステップは以下のように進めました。

- バックアップ済のイメージファイルをリストアしたいので`device-image`を選びます。
-  ローカルのディスクを使いたいので`local_dev`を選びます。

```
Scanning devices... Available disk(s) on this machine:
===================================
Error: /dev/sda: unrecognised disk label
Error: /dev/sda: unrecognised disk label
Excluding busy partition or disk...
Error: /dev/sda: unrecognised disk label
/dev/sda: Virtual_disk_ No_disk_serial_no 22.6GB
/dev/sdb: Transcend_ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 2000GB
===================================
```
仮想ディスクがまっさらだったために、ディスクラベルが認識されないというエラーがでてますが、問題ないので進めます。

- /home/partimagにマウントさせるパーティションを選択します。リストアしたいイメージファイルが格納されているデバイスを選択します。この構成ではUSB-HDD一択なので、表示も1行だけでした。

```
sdb1 1.8T_vfat_0x41:_Dirty_(In_Transcend_)_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
- イメージが格納されているディレクトリを指定します。私の例ではbackupディレクトリです。

```
Running: mount --bind -o noatime,nodiratime /tmp/ocsroot_bind_root/backup /home partimage
The file system disk space usage:
********************************************************.
SOURCE             FSTYPE  SIZE  USED  AVAIL  USE%  TARGET
/dev/sdb1[/backup] vfat    1.8T  113G  1.7T     6%  /home/partimag
********************************************************.
Press "Enter" to continue......
```

- 操作モードを`Expert`にして進みます。
- イメージからリストアさせたいので`restoredisk          Restore_an_image_to_local_disk`を選びます。
- イメージファイルを選択します。実際には/backupの直下にあるイメージファイルが格納されてディレクトリが表示されるので、リストアさせたいイメージを選びます。
- 書き込み先のディスクを選択します。私の環境では`/dev/sda 23.6GB_Virtual_disk_ No_disk_serial_no`だけしか表示されないので、そのままOkします。
- この後のオプションはデフォルトを選択しました。
- パーティションテーブルをどうするか聞かれます。`Use the partition table from the image`を選びそのままにします。
- リストア前にイメージを確認するか聞かれます。`Yes, check the image before restoring`でチェックすることにしました。
- 最後にジョブ完了後の挙動は、プロンプトを出したいので、`-p cmd`にします。

先に進めるとリストアが開始されます。途中、2回ほど本当にリストアに進んでいいの？と聞かれました。完了してコマンドプロンプトが返ってきたら、`reboot`しましょう。
起動後に、正常性確認をしてみましたが、問題なく起動してきました。

#Step:4 交換用HDDを抜き出し、予備パーツとする。内蔵HDDを戻して運用再開
最後はディスクの戻しです。実機であればHDDを換装すればよいステップです。仮想マシンなので、もともとの仮想ディスクを追加して、リストアした後の仮想ディスクを外しました。こちらも起動させましたが全く問題なしです。

#おわりに
リストアのフローは、バックアップのときのフローと途中まで一緒なのでさくっと書きました。disk-diskの動作も確認しましたが、こちらも簡単でした。
ちょっと私にとっては癖のあるソフトウェアだったので、備忘のために書きました。