freebsd-version(1)

10.0-BETA1で、freebsd-versionというFreeBSDのパッチレベルを教えてくれるコマンドが生まれた。
便利なコマンドなのでメモ。

FreeBSDには、freebsd-updateというバイナリアップデートコマンドがある。
make buildworld, buildkernelしなくても、必要なファイルだけを更新してくれる優れもののコマンド。
セキュリティ更新があった場合や、アップグレードにとても便利なのだが、困ったことが一つ。

あるセキュリティ更新が、カーネルに影響せず、ユーザランドのファイルのみ対象だった場合。
仮にここで9.2-RELEASEのユーザランド、たとえばbindにのみ更新があり9.2-RELEASE-p1になったとする。

そのFreeBSDのパッチレベルを確認しようとunameコマンドを使っても、返ってくるのは9.2-RELEASEである。
つまりunameはカーネルしか見ていない。
これでは本当にfreebsd-updateが完了したか不安になる。

カーネルを再コンパイルすればきちんと9.2-RELEASE-p1と返してくれるようになるが、これでは何のためのfreebsd-updateなのか分からなくなる。

今回のfreebsd-versionは、このfreebsd-updateの困ったことを解決してくれるコマンドである。

使い方

$ freebsd-version
10.0-BETA1
$ which freebsd-version
/bin/freebsd-version
$ file /bin/freebsd-version
/bin/freebsd-version: POSIX shell script, UTF-8 Unicode text executable

freebsd-updateは10.0-BETA1で入ったもの。
/binの下にある。
ご覧の通りシェルスクリプトである。

freebsd-versionに-kオプションを与えると、カーネルのパッチレベルを返す。
uname -rと同じように見えるが、以下の点で違う。
freebsd-updateなどでパッチを適用し、リブートして「いない」状態であっても、新しいカーネルのパッチレベルを返してくれる。
リブートするまえに確認できるから便利ですな。

オプションなし、あるいは-uオプションを付けると、ユーザランドのパッチレベルを返してくれる。

-kuとつけると、最初にカーネルのバージョン、次にユーザランドのバージョンを返してくれる。

以下が実行例だが、ユーザランドに更新のない10.0-BETA1だけに違いが分からない…。

$ freebsd-version -k
10.0-BETA1
$ freebsd-version -u
10.0-BETA1
$ freebsd-version
10.0-BETA1
$ freebsd-version -ku
10.0-BETA1
10.0-BETA1

詳細はman freebsd-version。
環境変数ROOTでpathを与えると、freebsd-versionはそこを基準にしてカーネルやユーザランドのパッチレベルを教えてくれる例など載っているので。

EXAMPLES
To determine the version of the currently running userland:

/bin/freebsd-version -u

To inspect a system being repaired using a live CD:

mount -rt ufs /dev/ada0p2 /mnt
env ROOT=/mnt /mnt/bin/freebsd-version -ku

SEE ALSO
uname(1), loader.conf(5), freebsd-version$1n

uname -U, uname -K

と、この記事をまとめた後(この記事は予約投稿なのです)に、HEADに修正が入った
unameに新しいオプションが追加される。-Uと-K。

-Uがユーザランドの、-Kがカーネルのバージョンを返す。
HEADだから11.0に入るのかな。
しかしそうなるとfreebsd-versionの立場は…。と思ったけど、コミット理由に「important for jail/chroot environments」と書いてありますな。