初めに
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