ttt

getttyent

(FreeBSD) sysctl: unknown oid 'net.fibs'

2008-10-03 22:01:25 | デジタル・インターネット

あるFreeBSD7なホストでapache22を再起動させたところ、

sysctl: unknown oid 'net.fibs'

というエラーメッセージが出ました。

# /usr/local/etc/rc.d/apache22 restart
Performing sanity check on apache22 configuration:
Syntax OK
Stopping apache22.
Waiting for PIDS: 26970
Performing sanity check on apache22 configuration:
Syntax OK
sysctl: unknown oid 'net.fibs'
Starting apache22.

これってのは、/usr/local/etc/rc.d/apache22
の中にある

        sysctl net.fibs 2>&1 > /dev/null

が、正しくは、

        sysctl net.fibs >/dev/null 2>&1

となるべきなんですね。

もっとも、cvsで確認すると

http://www.jp.freebsd.org/cgi/cvsweb.cgi/ports/www/apache22/files/apache22.sh.in

このミスの修正は、9月2日に行われていて、現在は、タイトルのようなエラーは出ません。

というわけで、このエラーが出たホストは、たまたま、中途半端な時期にportupgradeして、そのまま放置してあった、ということでした。

9月2日の前は8月31日に更新されているのですが、そういや、連日、立て続けにapache22のportsが更新されることがあって、もうつきあってられん、と思ったことがあったような気もします。

/bin/shで、標準出力と標準エラー出力をすべて捨てるためのリダイレクトは、「>/dev/null 2>&1」なんですけど、「 2>&1 > /dev/null」と書きたくなる気持ちは、よくわかります。私も、昔、間違えました。

「stderrをstdoutにくっつけておいてから、stdoutをすべてまとめて捨てる」って考えると、後者の書き方をしたくなってしまいます。

ソースコードは確認して無いですけど、前者の書き方になる理由ってのは、stdoutを/dev/nullにつけかえてから、stderrをstdoutにdupする、ってことなんでしょうか?

論外な間違い方として、ときどき、「1」という名前のファイルが出来てたりすることも…(笑)

最近はバッチファイルを書くこともなくなってしまいましたが、MS-DOS時代には、「NULL」という名前のファイルが出来てることがありましたねぇ。MS-DOSのデバイスファイル名は「NULL」じゃなくて「NUL」なのですが、Unixの癖で、どうしてもnullと書きたくなってしまう、っていうわけで。

sysctlのnet.fibsってなんだろう、と思って、ちょっと調べてみました。でも、手元のFreeBSDには、無いんです、そんなsysctlの変数。

7.0-RELEASEには無いし、しばらく前の7.0-STABLEにもない。

ちょっとネット検索した程度でわかったことですが、
/usr/src/sys/net/route.hに、fibなんとかっていうのがあって、それに関係しているらしいです。

extern u_int rt_numfibs;    /* number fo usable routing tables */

RELENG_7ブランチで見ると、7月24日のrevision 1.65.2.2から登場してます。

http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/sys/net/route.h?f=u&only_with_tag=RELENG_7&logsort=date

route.cの方で、sysctl変数の宣言(?)みたいのが見えますね。
たとえば、このあたり。

http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/sys/net/route.c?rev=1.120.2.6&content-type=text/x-cvsweb-markup&only_with_tag=RELENG_7

今うちにあるのは7.0-RELEASEなんですが、/usr/include/net/route.hは、revision 1.65.4.1。バージョン番号が戻ってるのか?と錯覚してしまったんですが、こっちは、RELENG_7_0ブランチなんですか。う~ん、ちょっと複雑。

http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/sys/net/route.h?f=u&only_with_tag=RELENG_7_0&logsort=date

で、結局、fibってなんなんだ?

FIB = Forwarding Information Base

というものがあるそうで、パケットのルーティングに用いる何からしいです。

そういえば、FreeBSDで、ルーティングテーブルを複数持てるようになる、とか、そんな話があったような…