BSD

pthreadの後方非互換とpkgsrc/lang/perl5

いろいろ新しくなったついでにOSのバージョンも上げたら apache が動かなくなった(笑)。

どうも,pthread が非互換らしい。再コンパイルで解決。

…なんだけれど,perl だけ何度再コンパイルしても libpthread.so.0 をリンクした状態になる。(libpthread.so.1 だけリンクしてほしい)

ちゃんと調べていないけれど,どうも既にインストールされている /usr/pkg/lib/perl5/5.10.0/x86_64-netbsd-thread-multi/CORE/libperl.so の参照先に引っ張られている模様。インストールしてある状態で再コンパイルせずに,pkg_deleteした後に再コンパイルしたらうまくいった。

このへんの関係なのかな?

cc  -Wl,-R/usr/pkg/lib --whole-archive -shared  -L/usr/pkg/lib なんたら.o 
-o ../../../lib/auto/なんたら/なんたら.so -L../../..
 -Wl,-R/usr/pkg/lib/perl5/5.10.0/x86_64-netbsd-thread-multi/CORE
 -Wl,-R../../../lib/CORE -lperl

bge その後

NetBSDのメーリングリストで,同じBCM5722のDELLのサーバで,bgeにtso4オプションをつけているとその症状になる(tso4を外せば問題ない)と教えていただきました。やってみたら確かに正常動作。
tso4 Enable hardware-assisted TCP/IPv4 segmentation on interfaces that support it.
BCM5721なら問題ないので,BCM5722の「hardware-assist」の部分に不具合があるんですかね。

BCM5722

テキトーにBCM5755なbrgphyと同じように認識するようにmiidevsとbrgphy.cを直してみた。それらしく起動したが症状は改善せず。
テキトーすぎたのでFreeBSD, OpenBSD, Linux のソースをあたってみる。
FreeBSDとOpenBSDは,BCM5722の識別だけして,特に処理はなし。
Linux (net/tg3.c) は,BCM5722 (とBCM5756) を識別した条件分岐があるが,他の ASIC BCM5755 その他系の TG3_FLG2_PHY_JITTER_BUG フラグを立てる部分を回避してるだけ。
TG3_FLG2_PHY_JITTER_BUG がある場合の処理は,NetBSD の brgphy.c でいうところの bcm5755_load_dspcode そのもので,これを回避しているということは,結局特別な処理は何もいらないっぽい。
うーん,調子が悪いのは別の原因か。

HP ProLiant ML110 G5 で NetBSD (その2)

ネットワークまわりがどうもひっかかる感じ。

$ dmesg | grep bge
bge0 at pci4 dev 0 function 0: Broadcom BCM5722 Gigabit Ethernet
bge0: interrupting at ioapic0 pin 17
bge0: ASIC BCM5755 C0 (0xa200), Ethernet address (略)
bge0: setting short Tx thresholds
ukphy0 at bge0 phy 1: Generic IEEE 802.3u media interface

こんなNIC。
適当なPCのターミナルからsshして cat で長いファイルを流すと,最初は順調だがフロー制御が入ったあたり(?)からガタガタに(間欠的に)なる。そしてたまに,

bge0: watchdog timeout -- resetting
bge0: block failed to stop: reg 0x1400, bit 0x00000002

こんなエラーを吐く。
よくみたらukphyじゃん…。これが悪い?
ちなみに,問題の起きていないML110G4 (NetBSD 4.0_STABLE) は,こんなかんじ。

$ dmesg | grep bge
bge0 at pci3 dev 0 function 0: Broadcom BCM5721 Gigabit Ethernet
bge0: interrupting at ioapic0 pin 17 (irq 12)
bge0: ASIC unknown BCM575x family (0x4201), Ethernet address (略)
bge0: setting short Tx thresholds
brgphy0 at bge0 phy 1: BCM5750 1000BASE-T media interface, rev. 0

HP ProLiant ML110 G5 で NetBSD

NetBSD 3.x は,キーボード周りで止まる。

G4 のときは BIOS で 8042 Emulation Support を切ると起動したが,G5 はその設定が見当たらない。
NetBSD 4.x は,G5 だと起動しない。

http://mail-index.netbsd.org/port-i386/2008/11/22/msg000932.html
NetBSD 5.0_BETA は,今のところ問題なし。

current は,これから。

でまあ,G4 も G5 もなんかやたらと HDD が遅いのだが,

# dkctl wd0 setcache rw

で,普通の速さに。今は rc.local で無理やり全部のディスクを設定している。
あってるかどうかわからないけど,G4で1年間動かしたが特に問題なし。

ipfilter の keep state がうまく働かない

ipfilter で、外部からの接続をすべて拒否しつつ、内部からは何でもアリな以下のような感じの ipf.conf の設定(本当はもっといろいろ書いてあるけど)をしたとき,普通うまくいくんだけど,うまくいかないサーバが一台だけあった(NetBSD/amd64 4.0)。

block in on bge0 all
pass out quick on bge0 proto tcp from any to any 
flags S/SAFR keep state

まだちゃんと追ってないので原因はよくわからないけど、これでなおった。

ifconfig bge0 -tcp4csum

(/etc/ifconfig.bge0 で tcp4csum 指定してたので削除した)
wm とか re は tcp4csum 付きでも大丈夫っぽいんだけど、bge固有の問題?

たかがビルドでハマりにハマる

何台かでソースからビルドした NetBSD の /usr/bin/ld のうち一台だけ動かない。

$ ld
ld:built in linker script:1: ignoring invalid character `20' in expression
ld:built in linker script:1: ignoring invalid character `37777777646' in expression
ld:built in linker script:1: parse error

それぞれバージョン違いで,動かないのは netbsd-4 のツリーをビルドしたもの。netbsd-4 のバグかと思い,別のマシンにもたまたま netbsd-4 のソースが展開してあったのでビルドするとうまく動く。
あれこれやって,生成された eelf_x86_64.c がおかしいところまでは突き止めたが,何故おかしくなるかわからないので,ビルドログを比較してみると,エラーが出ているのを発見。

 #    create  ld/eelf_x86_64.c
unset MACHINE || true;  LIB_PATH=/usr/lib
/bin/sh /usr/src/gnu/usr.bin/binutils/ld/../../../dist/binutils/ld/genscripts.sh /usr/src/gnu/usr.bin/binutils/ld/../../../dist/binutils/ld /usr/lib "/usr"  x86_64--netbsd x86_64--netbsd x86_64--netbsd  elf_x86_64 /usr/lib no elf_x86_64 "x86_64--netbsd"
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory
+sed: stringify.sed: No such file or directory

その手前で stringify.sed が作られていない模様。

-#    create  ld/stringify.sed
-rm -f stringify.sed
-ln -s /usr/src/gnu/usr.bin/binutils/ld/../../../dist/binutils/ld/emultempl/astring.sed stringify.sed

で,結局あれこれいじっていると,/usr/src/gnu/usr.bin/binutils/ld/stringify.sed (シンボリックリンク)があるのを発見。既に存在するので作られないが,実行時に使われる /usr/obj/gnu/usr.bin/binutils/ld/stringify.sed がないというオチ。
結論としてはこんなかんじ。

  1. 何かの拍子に(過去に)ソースツリー内にシンボリックリンクを作ってしまった。(多分自分のミス)
  2. オブジェクトのディレクトリがソースのディレクトリとは別(NetBSD本体のビルドでは常にそうなる)であってもソース側にターゲットが存在してしまっているとオブジェクト側に作られない。(makeの仕様)
  3. ビルド中に使っている binutils/ld/genscripts.sh の中でエラーを起こしてもビルドが止まらない。(?)
  4. 結果として出来上がった eelf_x86_64.c が壊れているにも関わらず,コンパイルが通ってしまう。具体的には char * で内蔵 ldscript を返す関数が,stringify.sed がないせいで何も作られず,return; となってしまっているのにエラーにならない。(?)
  5. 存在しない戻り値(メモリのどこか)を ldscript だと思って読み込むが,当然ぐちゃぐちゃなのでエラー。

まあ発端は自分が悪いんだけど,バグで同じようなことが起きる可能性も考えると,ツール類も -Wall … -Werror つきでコンパイルできると本当はいいんだろうねえ。

IBM System x3105 で NetBSD 4.0 が起動しない件

NetBSD 3.1 は動いてた。
4.0 にしようとしたら,

viaide2: couldn't map sata regs

といわれてwd0, wd1 が見つからずに死亡。
PR #38011 がそれっぽい。
http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=38011
手で viaide.c にパッチ当ててみると wd0, wd1 は見つかったものの,正しく動いてないのか起動時の init が呼ばれるあたりで固まる。
ちなみにチップセットは NVIDIA nForce Professional 2000 MCP らしいんだが,nForce4 でいいんだよねこれ?(少なくともSATA周りは)
とりあえず 3.1 に戻す。
続く (?)

工事とPMTUなんたら問題

休暇をとってネットワーク工事やサーバ設定など。
相手によって通信できたりできなかったりと,どうも調子が悪いと思ったら Path MTU Discovery Black Hole Problem を踏んでた模様。
NetBSD の in-kernel pppoe と ipfilter, ipnat を使っていたので,とりあえず
ipnat.conf

map pppoe0 10.1.0.0/16 -> 0/32 proxy port ftp ftp/tcp mssclamp 1414
map pppoe0 10.1.0.0/16 -> 0/32 portmap tcp/udp 40000:60000 mssclamp 1414

といった感じで mssclamp で回避。
あと,いまいち速度が出ない問題もあるが,こっちは未解決。それでも今までよりは速いのだが…。
(2007-08-31 追記)
NAT経由はこれでよかったが,ゲートウェイ本体と外部の直接の通信が稀にコケることが判明。
sysctl.conf

net.inet.tcp.mss_ifmtu=1

忘れてた…。

NetBSD/macppc 4.99.25 on MacMini

4.0_BETA からアップグレードというか人柱度アップというか。
GENERICで起動すると,起動中に画面真っ黒。シリアルとかないので何が起きているのか不明。
仕方がないので,何度か再起動して目を皿のようにして見ていると,radeonfb という文字列が最後に見えた。そこで,radeonfb を外した kernel を作ってやると無事起動。

#radeonfb*      at pci? function ?      # ATI Radeon. R3xx is problematic

Radeon 9200 って R3xx より前のやつだよね?よく知らんけど。