知らないのはもったいない。FreeBSDとBE(Boot Environment)
前回に引き続き、ZFS の話です。
OSのアップデートをするとき、必ずと言っていいほど表示される注意書きがあります。
データをバックアップしてから実行しましょう
みなさん、アップデートの前に本当に毎回バックアップしていますか?
バックアップというのは思いのほか面倒です。
時間もかかるし、保存先の準備も必要です。
その結果、「まあ大丈夫だろう」とバックアップせずに実行している人も多いのではないでしょうか。
かく言う私も、信心などないくせに神に祈り、日頃の行いを悔いながら「ポチッ」とやっていました。
しかし、FreeBSD の Boot Environment(BE)という仕組みを知っていれば、このドキドキからほぼ解放されます。
zfs list に出てくる“見覚えのない snapshot”
`zfs list` を実行すると、自分で作った覚えのない snapshot が表示されることがあります。
$ zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zdata/data@second 56K - 1.10M -
zroot/ROOT/14.3-RELEASE-p8_2026-02-13_180104@2026-02-13-18:01:04-0 460K - 2.68G -
zroot/ROOT/15.0-RELEASE-p2_2026-02-13_180227@2026-02-13-18:02:27-0 464K - 2.75G -
zroot/ROOT/default@2026-02-14-01:49:50-0 165M - 1.15G -
zroot/ROOT/default@2026-02-13-17:13:06-0 3.46M - 2.13G -
zroot/ROOT/default@2026-02-15-16:19:08-0 44.7M - 2.41G -zdata/data/@second は前回作った snapshot ですが、それ以外は、BE を作るために自動的に作られた snapshot です。
FreeBSD で freebsd-update install を実行すると、
現在の環境の snapshot を作成
その snapshot から clone(新しいBE)を作成
その clone にアップデートを適用
という流れになります。
つまり、アップデート前の状態は常に丸ごと保存されているのです。
BE の一覧を見る
Boot Environment を扱うコマンドは bectl です。わかりやすいですね。
BEの一覧を表示するには、`bectl list`を実行します。
$ bectl list
BE Active Mountpoint Space Created
14.3-RELEASE-p8_2026-02-13_171306 - - 696M 2026-02-13 17:13
14.3-RELEASE_2026-02-14_014950 - - 165M 2026-02-14 01:49
14.4-BETA1_2026-02-15_161908 - - 44.7M 2026-02-15 16:19
15.0-RELEASE-p2_2026-02-13_180227 - - 99.0M 2026-02-13 18:02
default NR / 3.47G 2026-02-14 01:41BE の名前を見ると、そのマシンの履歴がよく分かります。上記のマシンでは、
14.3-RELEASE をインストール
14.3-RELEASE-p8 にパッチ適用
15.0 にメジャーアップグレード
再び 14.3 系に戻る
14.4-BETA 系を試す
つまり、以下の構成になっています。
zroot/ROOT
│
├── 14.3-RELEASE(BE なし)
│ └── 14.3-RELEASE-p8_2026-02-13_180104
│
├── 14.4-BETA1_2026-02-15_161908
│ └── default(14.4-BETA2)
│
└── 15.0-RELEASE-p2_2026-02-13_180227
BE の切り替え
これらの BE には、どの時点へも自由に移動することができます。
BE の切り替えは非常に簡単です。
bectl activate BE名
その後 reboot すると、その環境で起動します。
snapshot とは違い、どの時点に移動しても「未来」が消えることはありません。つまり、一台のマシンの中に複数の OS バージョンが同居している状態になっているのです。
例えば、15.0-RELEASE にアップデートして「やっぱり 14.3-RELEASE がいい」と思ったら、bectl activate で戻るだけ。何事もなかったように戻れます。各 BE は独立していて、他の BE での変更が別の BE に影響することはありません。
14.3 で pkg install したものは 15.0 には入らない
15.0 で削除したファイルは 14.3 には影響しない
という関係になります。とても不思議です。
なお、もしBEをいじくりすぎてブートできなくなった場合はコマンド入力ができませんが、起動時のブートメニューでBEを選択できるようになっているので、起動できるBEを選択してブートさせれば大丈夫です。

BE が影響する範囲
BE は、基本的に zroot/ROOT/default だけです。ほかの dataset には影響ありません。
通常、ホームディレクトリ(例:zroot/home)は別 dataset になっているため、BE を切り替えても共通です。
OS部分は世代ごとに分離
ユーザーデータは共通
という構造になっています。よくできています。
Git のブランチに似ている
この仕組みは Git のブランチに非常によく似ています。まるでバージョン管理システムに保存して、いつでも前の状態に戻れる──その安心感こそが、冒頭で述べた「ドキドキから開放される」という言葉の正体です。
容量はどうなるのか?
「BE が増えると容量を食うのでは?」と思うかもしれません。
ZFS は Copy-on-Write 方式です。
clone直後は親と同じブロックを共有し、変更があった部分だけが新しく保存されます。だから、他のBEに切り替えて(過去に戻って)何かファイルを作ったり pkg install をしたりしない限り、ほとんど容量は消費されません。
ただし、注意するのは、ファイルを削除して空き容量を増やそうとする場合です。
削除しても空き容量が増えない場合
例えば、
14.3 時代から存在する大きなファイル
15.0 でそのファイルを削除
この場合、14.3 BE がそのブロックを参照していれば、空き容量は増えません。
参照が残っている限り、ブロックは解放されないからです。ゴミ箱にファイルが残っているような状態になります。
空き容量が増える場合
BE作成後に新しく作ったファイル
それを削除
他に参照がない
この場合は、容量はきちんと解放されます。
BE の削除
不要になった BE は削除できます。
bectl destroy BE名
この操作は即時実行され、取り消しはできません。
その BE だけが保持していたブロックがあれば、その分の容量が解放されます。とはいえ、普通にバージョンアップを繰り返している状態(過去に戻ってごちゃごちゃやってない)では、めったにこれが必要になることはないと思います。
手動でBEを作る
アップデート以外でも、任意の時点を保存できます。
bectl create BE名
大きな変更を加える前に実行しておけば、安心して変更できます。
Ubuntuでの体験
私は以前、 Ubuntu 22.04 から 24.04 への自動でメジャーアップグレードを実行しました。
結果は散々でした。
なぜか特定のアプリだけ起動しない
一部のサービスが原因不明で落ちる
GUIの挙動がおかしい
apt の依存関係が崩れる、何もインストールできなくなる。
といった、原因不明の不具合が次々と発生しました。もしかしたら私が何かミスをしていたかもしれません。
何をやっても完全には戻らず、調整すればするほど別の不具合が出る。
結局、再インストールという選択をせざるを得ませんでした。
再インストールから元の環境を取り戻すための設定は、今の環境を参照しながらでないとやり切れる自信がなかったため、新しいマシンを調達することにしました。
そして空いた古いマシンにインストールしたのが、現在の FreeBSD のメイン環境です。
もしUbuntuに Boot Environment があったとすれば、
アップグレードしてみる
ダメなら activate で戻る
それだけで済んだはずです。
FreeBSD + BEなら再インストールという発想そのものが不要になります。
結論
Git を知ったあとに、Git なしで開発するのが考えられないのと同じで、
FreeBSD を使うなら
bectl activate
は必須コマンドです。
アップデートが怖くなくなる。
これが Boot Environment の最大のメリットです。
