FreeBSDのOSアップグレードは再起動が2回

FreeBSDのアップグレードはfreebsd-updateコマンドが生まれたことでかなり楽になった。
が、面倒臭さにはキリがないもので、それさえも面倒になってきた。

というのも。
まずfreebsd-updateは、アップグレード先バージョンのファイルと今のバージョンのファイルの差分を確認し、必要なファイルをダウンロードする。
次に新しいカーネルをインストールし、一回再起動。
それで問題がなければ、今度はユーザランドを新しくし、再起動という流れ。

OS自体のアップグレードは何が起こるかわからないので、上記のように着実に進めているというわけ。

ただ、サーバ用途のマシンならともかく、デスクトップ用途とか、すぐにロールバックできる仮想マシンなら、さっさとアップグレードしてしまいたい。
何より各ステップで発生する人間の操作を極力少なくしたい。

ZFS上にインストールされているFreeBSDなら、無人とは言わないまでも再起動は一度で済む。

beadmを使った無人アップグレード

条件は

  • ZFSにインストールされたFreeBSDであること
  • beadm1.3.5以上がインストールされていること

である。
beadmとは、ZFSのブート環境を管理するツール。
pkgまたはportsからインストールできる。
このツールと、chrootを使って実現する。
具体的にはchroot環境でアップグレードをしたのち、その環境と原環境を差し替える。

beadmのインストール

さっそくインストール。
pkgにもあるが、バージョンが1.3.5以上であることを確認すること。
2022/5/8時点ではpkgには1.3.2しかないようなので、portsからインストールした。

~> pkg search beadm
beadm-1.3.2                    Solaris-like utility to manage Boot Environments on ZFS

~> sudo portsnap fetch update #<-- portsのアップデート)
<snip>
> psearch beadm #<-- portsの検索)
sysutils/beadm            Solaris-like utility to manage Boot Environments on ZFS
sysutils/beadm-devel      Solaris-like utility to manage Boot Environments on ZFS
~> cd /usr/ports/sysutils/beadm
~> make install clean
<snip>
 ~> beadm --version

      ___                     ___          __ ____ __   
     /  /                    /  /         / //    \\ \ 
    /  /   ____   ____   ___/  /___ ___  / //  /  / \ \ 
   /    \ /  _ \ /    \ /     //   \   \/ / \     \ / / 
  /  /  //  ___//  /  //  /  //  /  /  /\ \ /  /  // /  
  \____/ \____/ \_____\\____//__/__/__/  \_\\____//_/ 

beadm 1.3.5 2022/05/06
~> 

beadmの基本

以下、beadmの基本。
BEとはブート環境の意味。

beadm list : BEの一覧を表示する。Active欄でNは現在有効なBEを指し、Rは次回起動時に有効になるBEを指す。
beadm create <name> : nameというBEを作る。
beadm destory <name> : nameというBEを削除する。
beadm rename <nameA> <nameB> : nameAをnameBに変える。
beadm chroot <name> : nameというBEにchrootする。

作業

実際の作業スタート。
基本、管理者権限で。
以下では13.1-RC6にアップグレードする場合のサンプル。
()で注釈をつける。
随時beadm listで内容を確認すること。

(beadmで一時環境作成)
 ~> sudo beadm create 13.1-RC6
Created successfully

(beadm chrootでその環境へ移る)
 ~> sudo beadm chroot 13.1-RC6
Entered chroot(8) for '13.1-RC6' boot environment
root@temp:/ # 

(freebsd-update upgrade実行)
root@temp:/ # yes | freebsd-update upgrade -r 13.1-RC6

(インストールされたファイルの確認があるのでq連打)

(再起動2回実行)
root@temp:/ # sh -c 'for I in 1 2 3; do freebsd-updte install; done'
src component not installed, skipped
Installing updates...
Kernel updates have been installed.  Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.

Installing updates...Scanning //usr/share/certs/blacklisted for certificates...
Scanning //usr/share/certs/trusted for certificates...
Scanning //usr/local/share/certs for certificates...
 done.
No updates are available to install.
Run '/usr/sbin/freebsd-update fetch' first.

(環境から抜ける)
root@temp:/ # exit
exit
Leaved from chroot(8) for '13.1-RC6' boot environment

(beadm activateで次回のブート環境をスイッチする)
 ~> sudo beadm activate 13.1-RC6
パスワード: 
Activated successfully
 ~> 

(再起動)
~> reboot

以上の通り再起動すればバージョンも上がっているはず。

(バージョン確認)
~> uname -a
FreeBSD xanadu 13.1-RC6 FreeBSD 13.1-RC6 releng/13.1-n250146-cd651fcc491 GENERIC amd64

もしもうまく行かない場合には、おそらくシングルモード起動->マウント->旧環境にbeadm activate->再起動でなんとかなるはず。。

古い環境はbeadm destoryで消しておく。

 ~> beadm list
BE                           Active Mountpoint  Space Created
default                      -      -            8.0M 2021-11-09 23:44
13.1-BETA1_2022-04-29_092431 -      -            1.1G 2022-04-29 09:24
13.1-RC4_2022-05-01_204553   -      -          602.0M 2022-05-01 20:45
13.1-RC6                     NR     /           21.7G 2022-05-08 20:53
 ~> sudo beadm destroy 13.1-BETA1_2022-04-29_092431
パスワード: 
Are you sure you want to destroy '13.1-BETA1_2022-04-29_092431'?
This action cannot be undone (y/[n]): y
Boot environment '13.1-BETA1_2022-04-29_092431' was created from existing snapshot
Destroy '13.1-RC6@2022-04-29-09:24:31-0' snapshot? (y/[n]): 
Origin snapshot '13.1-RC6@2022-04-29-09:24:31-0' will be preserved
Destroyed successfully

以上