ユーザ用ツール

サイト用ツール


サイドバー

Site Contents

転載・引用について

RSS

os:boot_environment

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つがあります。

  1. bectl
    • FreeBSD 12.0 から標準搭載されたコマンドラインツールです。
  2. 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 update

"update" という名前で新しいルートファイルシステムを作成します。

2. アクティベート

bectl activate update

起動するためにアクティベートします。

3. 再起動

shutdown -r now

再起動すると "udpate" から起動します。

4. freebsd-update

freebsd-update fetch install

freebsd-update を実行しシステムを更新します。

5. 再起動

shutdown -r now

アップデート後に再起動します。

6. 動作確認

ps でプロセスを確認するなど、動作を確認します。

7. 古いルートファイルシステム削除

bectl destroy default

問題なければ、古いファイルシステムを削除します。

8. デフォルトファイルシステムにリネーム

bectl rename update default

"update" ファイルシステムを "default" にリネームします。

これで、freebsd-update された新しいシステムに更新されます。

9. 切り戻し

もし、6. の動作確認で問題があれば、"default" をアクティベートし、再起動します。

bectl activate default
shutdown -r now

その後、update を削除すると元に戻ります。

bectl destroy update
os/boot_environment.txt · 最終更新: 2019/06/14 18:44 by yuichiro