初めに
UEFIブートでファイルシステムがZFSなFreeBSDのシステムの、バックアップと復元の手順をまとめてみました。
前提
- UEFIによるブート
- OSはFreeBSD 13.0-RELEASE amd64
- ディスクはSATA接続
- ZFSは単独ディスクによるRAID 0(ストライプ)構成
- バックアップ用のディスクにデータをバックアップして、後にそのデータを使ってシステムを復元
システムのバックアップ
バックアップの手順は以下の通りです。
- データバックアップ用のディスクをシステムに接続
- ブートメディアでシステムを起動
- データバックアップ用のディスクにZFSのプールとファイルシステムを作成してマウント
- バックアップ対象のディスクのZFSのプールをインポート
- バックアップ対象のディスクのZFSのデータをデータバックアップ用のディスクにバックアップ
- バックアップ対象のディスクのESP(EFIシステムパーティション)のデータをデータバックアップ用のディスクにバックアップ
- バックアップ対象のディスクのパーティション情報をデータバックアップ用のディスクにバックアップ
- ZFSのプールをエクスポート
- システムをシャットダウン
以下、各手順の詳細を説明します。
ブートメディアでシステムを起動
13.0-RELEASE amd64のブートメディアでシステムを起動し、FreeBSDのインストーラーが起動されたらShellを選択します。起動後のデバイスファイルは以下の通りです。
# ls -l /dev/ada?
crw-r----- 1 root operator 0x5c 12月 5 10:44 /dev/ada0
crw-r----- 1 root operator 0x5d 12月 5 10:44 /dev/ada1
/dev/ada0がバックアップ対象のディスクで、/dev/ada1がデータバックアップ用のディスクです。
データバックアップ用のディスクにZFSのプールとファイルシステムを作成してマウント
バックアップデータ保存先のディスクのファイルシステムは、FreeBSDが読み書きできるものなら何でもよいのですが、ここではZFSを使うことにします。
まず/dev/ada1にパーディションを作成します。
# gpart create -s GPT ada1
ada1 created
# gpart add -t freebsd-zfs ada1
ada1p1 added
# gpart show ada1
=> 40 209715120 ada1 GPT (100G)
40 209715120 1 freebsd-zfs (100G)
作成されたパーティション(/dev/ada1p1)にZFSのプールとファイルシステムを作成してマウントします。インストールメディアからブートした場合/はread-onlyなので、/tmpの下にディレクトリを作成してそこにマウントします.
# mkdir /tmp/zbackup
# zpool create -R /tmp/zbackup zbackup /dev/ada1p1
バックアップ対象のディスクのZFSのプールをインポート
バックアップ対象のZFSのプールをインポートします。このプールも同様に/tmpの下にディレクトリを作成してそこにマウントします。
# mkdir /tmp/zroot
# zpool import -R /tmp/zroot zroot
バックアップ対象のディスクのZFSのデータをデータバックアップ用のディスクにバックアップ
まずバックアップを取るスナップショットを作成します。
# zfs snapshot -r zroot@backup
作成したスナップショットのデータをzfs send -Rで/tmp/zbackupの下にバックアップします。後でこのデータから復元するためには-Rオプションを指定することが重要です。
# zfs send -R -v zroot@backup > /tmp/zbackup/zbackup/zroot@backup.zfs-send.dat
バックアップ対象のディスクのESP(EFIシステムパーティション)のデータをデータバックアップ用のディスクにバックアップ
ESPを/tmp/espの下にマウントします。
# mkdir /tmp/esp
# mount -t msdosfs /dev/ada0p1 /tmp/esp
バックアップ対象のディスクのESPのデータをtarでバックアップします。
# cd /tmp/esp
# tar cfv /tmp/zbackup/zbackup/efi.tar .
バックアップ対象のディスクのパーティション情報をデータバックアップ用のディスクにバックアップ
バックアップ対象のディスクのパーティション情報をgpartを使ってバックアップします。
# gpart backup ada0 > /tmp/zbackup/zbackup/gpart-backup-ada0.log
ZFSのプールをエクスポート
バックアップ対象とバックアップ先と双方のZFSのプールをエクスポートします。
# zfs unmount -a
# zpool export -a
システムの復元
復元の手順は以下の通りです。
- ブートメディアでシステムを起動
- バックアップ用ディスクのZFSのプールをインポート
- 復元対象のディスクにパーティション情報を復元
- ZFS用のパーティションに空のプールを作成
- バックアップされたZFSのデータを復元
- ZFSのプールの
bootfsプロパティを設定 - EPSを初期化
- バックアップされたEPSのデータを復元
- ZFSのプールをエクスポート
- システムをシャットダウンしてデータバックアップ用のディスクをシステムから外す
- 新しいブートディスクからシステムを起動
以下、各手順の詳細を説明します。
ブートメディアでシステムを起動
バックアップの時と同様にブートメディアでシステムを起動します。/dev/ada0はまっさらなディスクだとして、これに/dev/ada1に保存してあるデータを復元していきます。
バックアップ用ディスクのZFSのプールをインポート
前述の通りこの状態では/はread-onlyなので、-Rオプションを指定して/tmp/zbackupの下にインポートします。
# mkdir /tmp/zbackup
# zpool import -R /tmp/zbackup zbackup
新しいディスクにパーティションを復元
バックアップ時に保存したパーティション情報を使ってgpartで/dev/ada0にパーティション情報を復元します。
# gpart restore -l ada0 < /tmp/zbackup/zbackup/gpart-backup-ada0.log
ZFS用のパーティションに空のプールを作成
/dev/ada0s3に空のZFSのプールを作成します。作成されたプールは/tmp/zrootの下にマウントします。
# mkdir /tmp/zroot
# zpool create -R /tmp/zroot zroot /dev/ada0p3
バックアップされたZFSのデータを新しいディスクに復元
zfs recvを実行してバックアップデータを新たに作成したプールに書き込みます。
# zfs recv -F zroot < /tmp/zbackup/zbackup/zroot@backup.zfs-send.dat
ZFSのプールのbootfsプロパティを設定
以下のコマンドを実行して新しいプールのbootfsプロパティを設定します。
# zpool set bootfs=zroot/ROOT/default zroot
ESPを初期化
newfs_msdosコマンドを用いてESPを初期化します。
# newfs_msdos -F 32 -c 1 -L EFISYS /dev/ada0p1
バックアップされたEPSのデータを復元
まず初期化したESPを/tmp/espにマウントします
# mkdir /tmp/esp
# mount -t msdosfs /dev/ada0p1 /tmp/esp
そしてバックアップしたESPのデータをtarで復元します。
# cd /tmp/esp
# tar xfpv /tmp/zbackup/zbackup/efi.tar
インポートしたZFSのプールをエクスポート
バックアップデータのプールと新規に作成したプールの両方をエクスポートします。
# zfs unmount -a
# zpool export -a