Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

syscall 53問題踏んだ

この記事はTumblrで公開されていました

ふとした気の緩みで、大きく時間が取れるまで待っていたsyscall 53問題を踏んでしまった。syscall 53問題というのは、5月の中旬ごろに発生したnsec(2)がライブラリからシステムコールに変更されたことによって起こるエラーで、愚直にアップデートしただけでは

bad sys call number 53

というエラーでコマンド類が動かなくなる現象のことを言う。

カーネルのソースだけアップデートしようと計画していたのだけれど、

% replica/pull -s sys/src/9 /dist/replica/network

を実行してしまって、コマンド類も全部ベル研が配布するバイナリにアップデートされた。結果、新しいバイナリはnsecシステムコールを期待するけど、replica/pullした直後はまだカーネルが古く、カーネルリビルドするまではnsec()がエラーになる。なのでそのままでは新しいカーネルコンパイルさえできない。

解決方法としてはいくつか9fansに挙がっていたけど、replicaは古いバイナリを_からはじまる名前で残しているので、こっちを使って新しいカーネルコンパイルするのが簡単だと思う。

% for(cmd in mk ar date ramfs)
> bind /bin/_$cmd /bin/$cmd
% ramfs
% cd /sys/src/9/pc
% mk 'CONF=pccpuf'
(コンパイルが終わったら)
% _dossrv
% mount -c /srv/dos /n/9fat /dev/sdC0/9fat
% mv 9pccpuf /n/9fat/

これについて、replicaでバイナリもアップデートされるのが問題だ、とか、アップデート時にカーネルも含めて依存関係を解決すべきだ、とか9fansで話があったような気がする。