UEFIブートでファイルシステムがZFSなFreeBSDのバックアップと復元


初めに

UEFIブートでファイルシステムがZFSなFreeBSDのシステムの、バックアップと復元の手順をまとめてみました。

前提

  • UEFIによるブート
  • OSはFreeBSD 13.0-RELEASE amd64
  • ディスクはSATA接続
  • ZFSは単独ディスクによるRAID 0(ストライプ)構成
  • バックアップ用のディスクにデータをバックアップして、後にそのデータを使ってシステムを復元

システムのバックアップ

バックアップの手順は以下の通りです。

  1. データバックアップ用のディスクをシステムに接続
  2. ブートメディアでシステムを起動
  3. データバックアップ用のディスクにZFSのプールとファイルシステムを作成してマウント
  4. バックアップ対象のディスクのZFSのプールをインポート
  5. バックアップ対象のディスクのZFSのデータをデータバックアップ用のディスクにバックアップ
  6. バックアップ対象のディスクのESP(EFIシステムパーティション)のデータをデータバックアップ用のディスクにバックアップ
  7. バックアップ対象のディスクのパーティション情報をデータバックアップ用のディスクにバックアップ
  8. ZFSのプールをエクスポート
  9. システムをシャットダウン

以下、各手順の詳細を説明します。

ブートメディアでシステムを起動

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/[email protected]

バックアップ対象のディスクの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

システムの復元

復元の手順は以下の通りです。

  1. ブートメディアでシステムを起動
  2. バックアップ用ディスクのZFSのプールをインポート
  3. 復元対象のディスクにパーティション情報を復元
  4. ZFS用のパーティションに空のプールを作成
  5. バックアップされたZFSのデータを復元
  6. ZFSのプールのbootfsプロパティを設定
  7. EPSを初期化
  8. バックアップされたEPSのデータを復元
  9. ZFSのプールをエクスポート
  10. システムをシャットダウンしてデータバックアップ用のディスクをシステムから外す
  11. 新しいブートディスクからシステムを起動

以下、各手順の詳細を説明します。

ブートメディアでシステムを起動

バックアップの時と同様にブートメディアでシステムを起動します。/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/[email protected]

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

参考文献