Boot Environment
Boot Environment とは ZFS をルートファイルシステムに選んだ場合に使える機能です。 ルートファイルシステムのクローンを任意に作成し、 どのクローンから起動するのかを自由に切り替えることができます。
例えば、新しいリリースまたはパッチを試すために、現在の環境のクローンを作成しバックアップ用に取っておきます。
その上で、新しいリリースまたはパッチをインストールして、うまくいけばそのまま使い続ければ良いですし、 何か問題が発生したならば、バックアップ用に取っておいた環境からブートすれば、元に戻ります。
また、異なるバージョンの FreeBSD をインストールしておき、切り替えて使うこともできます。
セットアップ
FreeBSD のインストーラでルートファイルシステムに zfs を選んでインストールします。 すると次のような zfs のファイルシステム構成になります。
$ zfs list NAME USED AVAIL REFER MOUNTPOINT zroot 683M 12.4G 176K /zroot zroot/ROOT 680M 12.4G 176K none zroot/ROOT/default 679M 12.4G 679M / zroot/tmp 176K 12.4G 176K /tmp zroot/usr 704K 12.4G 176K /usr zroot/usr/home 176K 12.4G 176K /usr/home zroot/usr/ports 176K 12.4G 176K /usr/ports zroot/usr/src 176K 12.4G 176K /usr/src zroot/var 1.09M 12.4G 176K /var zroot/var/audit 176K 12.4G 176K /var/audit zroot/var/crash 176K 12.4G 176K /var/crash zroot/var/log 232K 12.4G 232K /var/log zroot/var/mail 176K 12.4G 176K /var/mail zroot/var/tmp 176K 12.4G 176K /var/tmp
この zroot/ROOT/default がデフォルトのルートファイルシステムです。 ルートファイルシステムに含まれるディレクトリは /dev を除いた / 以下の全てのディレクトリです。 /usr や /var も含みます。
逆を言うと個別にマウントされたものがルートファイルシステムには含まれないことになります。 上記のリストでは以下が該当します。
- /tmp
- /usr/home
- /usr/ports
- /usr/src
- /var/audit
- /var/crash
- /var/log
- /var/mail
- /var/tmp
zroot/usr と zroot/var はルートファイルシステムに含まれない領域を作り出すためのダミーです。 マウントポイントが割り当てられていますが、mounted が no のため実際にはマウントされていません。
$ zfs get mounted,canmount zroot/usr zroot/var NAME PROPERTY VALUE SOURCE zroot/usr mounted no - zroot/usr canmount off local zroot/var mounted no - zroot/var canmount off local
mount コマンドでも確認することができます。
$ mount zroot/ROOT/default on / (zfs, local, noatime, nfsv4acls) devfs on /dev (devfs, local, multilabel) zroot/tmp on /tmp (zfs, local, noatime, nosuid, nfsv4acls) zroot/usr/home on /usr/home (zfs, local, noatime, nfsv4acls) zroot/usr/ports on /usr/ports (zfs, local, noatime, nosuid, nfsv4acls) zroot/usr/src on /usr/src (zfs, local, noatime, nfsv4acls) zroot/var/audit on /var/audit (zfs, local, noatime, noexec, nosuid, nfsv4acls) zroot/var/crash on /var/crash (zfs, local, noatime, noexec, nosuid, nfsv4acls) zroot/var/log on /var/log (zfs, local, noatime, noexec, nosuid, nfsv4acls) zroot/var/mail on /var/mail (zfs, local, nfsv4acls) zroot/var/tmp on /var/tmp (zfs, local, noatime, nosuid, nfsv4acls) zroot on /zroot (zfs, local, noatime, nfsv4acls)
管理ツール
Boot Environment を扱うためのツールとして以下の2つがあります。
- bectl
- FreeBSD 12.0 から標準搭載されたコマンドラインツールです。
- beadm
- ports/pkg でインストールできるコマンドラインツールです。
bectl がない環境でも使うことができます。
どちらも機能的にはほとんど変わりません。 このページでは bectl を例に説明します。
使い方
1. ルートファイルシステムをクローンする
bectl create <環境名>
現在のルートファイルシステムのスナップショットを取り、そこから新しいルートファイルシステムを作成します。
zroot/ROOT/<環境名> というファイルシステムが作成されます。
既にルートファイルシステムにスナップショットがあるならば、そこからクローンすることもできます。
bectl create -e <環境名>@<スナップショット> <環境名>
例えば default@2019-04-01 から test というルートファイルシステムを作成するのは次のようになります。
bectl create -e default@2019-04-01 test
2. 次回起動時のルートファイルシステムを変更する
bectl activate <環境名>
次回起動時のルートファイルシステムを <環境名> に変更します。
3. ルートファイルシステムの一覧表示
bectl list
作成したルートファイルシステム一覧を表示します。結果は次のように表示されます。
BE Active Mountpoint Space Created default NR / 248K 2019-06-12 18:45 test - 679M 2019-06-12 18:53
この例では default と test の2つのルートファイルシステムがあります。
N,R の意味は次の通りです。
- N: 現在アクティブなファイルシステムです。 (Now Active)
- R: 次回起動時に選ばれるファイルシステムです。 (Reboot next time)
4. ルートファイルシステムの削除
bectl destroy <環境名>
作成したルートファイルシステムを削除します。
5. ルートファイルシステムのマウント
bectl mount <環境名> <マウントポイント>
指定したルートファイルシステムをマウントします。 マウントポイントを省略した場合は /tmp にテンポラリのマウントポイントを作成し、 そこにマウントします。
アンマウントするには以下を実行します。
bectl umount <環境名>
6. 環境名の変更
bectl rename <古い環境名> <新しい環境名>
環境の名前を変更します。 これは現在起動している環境に対して行うことも可能です。
7. jail 起動
bectl のみの機能です。
bectl jail <環境名>
ルートファイルシステムから jail を作成し、その中で動く sh を起動します。 ネットワーク環境はセットアップされません。sh から手動で設定します。
ブートローダでの選択
もし、新しいルートファイルシステムにトラブルがあり、カーネルすら起動できなくなった場合は ブートローダでルートファイルシステムを選択することができます。
起動直後の画面で "7" を押します。
"2" を押すと、ブートする環境が切り替わります。
元の環境を選びスペースキーを押すと、その環境でブートします。
起動したらアクティブなファイルシステムを切り替えましょう。
bectl activate default
ローダはアクティブなファイルシステムを切り替えてはくれません。
ユースケース
実際に freebsd-update を行う場合を例にとると一連の操作の流れは次のようになります。
1. バックアップの作成
bectl create backup
"backup" という名前で新しいルートファイルシステムを作成します。
2. freebsd-update
freebsd-update fetch install
freebsd-update を実行しシステムを更新します。
3. 再起動
shutdown -r now
アップデート後に再起動します。
4. 動作確認
ps でプロセスを確認するなど、動作を確認します。
5. 切り戻し
もし、4. の動作確認で問題があれば、"backup" をアクティベートし、再起動します。
bectl activate backup shutdown -r now
その後、default を削除し、backup を default にリネームすると元に戻ります。
bectl destroy default bectl rename backup default
6. 古いバックアップの削除
bectl destroy backup
ある程度安定的に動くことが分かったならば、不要になったバックアップを削除します。