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
以上