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」と書いてありますな。