2008-09-04

FreeBSDのjail内でdhcpdを動かす

今のところFreeBSD-7.0のjailではbpfが動かないが、net/isc-dhcp3-serverにはDHCP_SOCKETSオプションがあり、bpfを使わずに動作するバイナリがビルドできる。しかし、これをjail内で動かすだけで、dhcpサーバとして働くかというと、そうもいかなかった。

まず、jail内ではbroadcastパケットを受信できないようで、dhcpリクエストの中継サーバが外に必要らしい。jail(8), jail(2), ハンドブックを探したが、broadcast受信の制約は見かけなかった気がする。jailの制約はときどき変わったりするので、どこかにまとめてあればいいんだけど。

そこで次に、net/isc-dhcp3-relayをホスト側で動かしてみた。そうすると確かに、dhcpdのログにはリクエストの到着とレスポンス内容が記録されるが、そのレスポンスパケットが外に出ていっていない。jail内のdhcpdからlo0経由でホスト側に来たパケットをdhcrelayが見ていない感じである。dhcrelayに -i lo0 を指定するとエラーになるので、無理やりIFF_LOOPBACKをスキップしないようコードを修正してみたが、それもうまくいかなかった。

というわけで、dhcrelayを完全に別のホストに設置してみたところ、あっさりと双方向に中継されて、dhcpクライアントが動くようになった。つまり、同じホスト内でパケットを中継するということをdhcrelayが想定していないせいなので、うまくいじれば直せる問題だと思う。

とすると、他の実装では動く可能性があるということなので、試しに、net/dhcprelay と net/dhcprelya をホスト側で動かしてみたら、どちらも、*_ifaces に lo0 を追加指定するだけで、問題なく中継できてしまった。そこで最終的に、これらのうち、高負荷ルータ用と銘打っている dhcprelya を採用。

ちなみに、dhcpdには、ホスト側で起動してbpfを掴んだのちに、chrootやjailに入るというオプションもあるようだが、美しさというか整合性の都合で採用を見送った。

中継サーバがいらなくなるであろう、vimageの正式採用にとても期待。

追記(9/11)

dhcprelyaを動かしていたら、数秒に1回
wrong ether type -- packet ignore
と出ていた。わずらわしいだけだが、dhcprelayだと出ないようなので、こちらに採用変更。

2008-08-26

javavmwrapperで特定のJavaVMを選択させる自分用メモ

わけあって手元のFreeBSDマシンに複数のJDKをインストールしたが、どのJavaVMを使うかどうやって指定すればいいか調べても、なかなかクリーンヒットしなかったのでメモ。javavmwrapperのスクリプトを読んではみたが、はじめは解読できなかった。

次のように環境変数を二つ指定することで、目的のJavaVMが選択できる。

JAVA_VENDOR=freebsd JAVA_VERSION=1.6 → java/diablo-jdk16
JAVA_VENDOR=freebsd JAVA_VERSION=1.5 → java/diablo-jdk15
JAVA_VENDOR=bsdjava JAVA_VERSION=1.6 → java/jdk16

JAVA_VENDOR にはblackdown, ibm, sunも指定しうる。空白をあけて複数指定すれば、適当なのが選ばれる。JDKとJREを同時に入れてたらどうなるかは不明。

JAVA_HOMEを指定しても選択できるが、openoffice.orgのビルド時に指定するなと言われる。ついでに、openoffice.orgのビルドでは、JAVA_VENDORなどを環境変数で指定しても上書きされるので、makeのオプションで指定する。

2008-06-10

FreeBSD 6.3のSMPではOpenOffice.orgのビルドができない(もしくは不安定)

このところ、OOoのPORTREVISIONが上がったときの更新などでうまくportupgradeが終わらず、Ctrl-Cで止めてもidlcというよくわからないプロセスが残ってkill -9しないと死んでくれないなど、ビルドのトラブルが続いていた。かといって、まったくできないわけでもなく、何度か試してみると通ったりもする。規則性もよくわからなかったが、今回の更新で3-4回やってみても通らないので、何か報告がないか調べてみた。

すると、日本語ではパっとした情報はなかったが、freebsd-openofficeにidlc loops building openoffice.org-2 on FreeBSD 6.3-RELEASEとか、freebsd-smpにopenoffice build loops - seemingly only on SMP machinesとかいった投稿があり、SMPのスケジューリングがあやしそうな雰囲気。

そこで、/boot/loader.confに kern.smp.disabled="1" を加えて再起動し、ビルドしてみたら1回で通った。まさにSMPの問題らしい。OOoのビルド前後にいちいち再起動するのは面倒だなぁ。7.0とかULEとかで問題がなくなるのかどうかは、時間ができたら調べてみる。

ところで、ついでにccacheの効果を計ろうと、まずccache -Cしてからビルドしてみると、Core 2 Duo (当然Solo状態) E6600 で4時間半かかった。そして、そのまま2回目を行うと2時間10分ほど。ccacheそのもののオーバヘッドは測定できていないが、ほとんど半分にまで減っていることになる。PORTREVISIONがちょっと増えただけでビルドし直しというportsも多いわけで、今後はどのportsもccacheを使うようにしてみようかな。


追記 (8/26)

いろいろ試したので、まとめ。CPUはCore 2 Duo。スケジューラはデフォルト。
6.3/i386 + SMP → ×
6.3/i386 (UP) → ○
6.3/amd64 + SMP → ○
7.0/i386 + SMP → ○
7.0/amd64 + SMP → ○

ま、6系は6.4で最後らしいし、7に移行すればいいか。

2008-06-09

FreeBSD 6.3でnvidia-driverがビルドできなくなってはまる

gettext祭りのついでに更新されてたnvidia-driverをビルドしようとして、warningしか出てないのに途中で止まっておかしいなとか思いながら、何かのはずみでpkg_deleteしてしまい、バカなことにそのことを忘れて再起動したものだから、Xが動かなくなってあせる。

ヘッダ内のプロトタイプが合わないせいでwarningが出るのに、CFLAGSに-Werrorがついてしまっているのが原因なのはすぐ判明。しかし、static inlineの定義を宣言に合わせて書き直すのは面倒なので、-Werrorを無効化したい。

-Werrorをつけてる箇所を探して、とりあえず/usr/share/mk/bsd.sys.mkにそれらしいのがあったので、応急で/etc/make.confにNO_WERROR=yesをつけてみたがダメ。

さらに調べると、/usr/src/sys/conf/kmod.mkでWERRORが定義されてなければWERROR=-WerrorにしてCFLAGSに加えている。これって、WERRORを無効化することを考えていないわけか?しかたないので、無害なところでWERROR=-Wallを定義してみたら、とりあえずビルドに成功。

次に、無条件には無効化したくないので、portconfを利用して、/usr/local/etc/ports.confに書いてみたが、portsのMakefileではなく、サブディレクトリにあるsrc/Makefileで有効にするには、ワイルドカードで指定しなければいけないようだ。

x11/nvidia-driver*: WERROR=-Wall
でしのぐ。

とかやっていたら、同じようなタイミングで、ports/124407が出ている。いずれちゃんと修正されるんだろう。-Werror無効化なんていうハックじゃなくて、warningが出ないようにしてくれればいいんだけど。