その時、 mass はぱにくった。
どつぼを力業でのりきった記録。自分用のメモ。
メインマシンの FreeBSD を何気なくアップデートした。 2004/11/7 0:00 頃 cvsup ものである。 2004/9/4 以来やね。今回は /usr/src/UPDATING を読み忘れた。
build 後、
# make installkernel KERNCONF=hogehogeして reboot 、 boot -s で panic しないので一安心。
# ls(たしかこんな感じ)
/libexec/ld-elf.so.1: /lib/libutil.so.4: Undefined symbol "_DefaultRuneLocale"
# pwd(違ったかも。ものによっては ld-elf.so.1 が直接ぶーたれるものもあった。)
/libexec/ld-elf.so.1: /lib/libutil.so.4: Undefined symbol "_DefaultRuneLocale"
うるさいだまれしね。
うぅ、やべぇ。ここまでやばいのは経験がない。(弱)
で、 Live CD で起動を試みるものの、うちの環境だと 5.3R も 5.2.1R も /boot/loader 以前に、 boot0 の選択画面 すら出ずにレジスタ値のようなものが画面いっぱいに怒涛のごとく流れて手も足も出ない。
※ acd0 に Live CD 、 M/B オンボードの SCSI に da0 / cd0 の構成。
なぜか cd0 が起動デバイスとして認識されず。
4.10R の disc2 なら起動したが、 5.3R の Live CD に入れ替えての Fixit はまともに動かず...
そんな時、 HDD 上に /rescue が存在したことを思い出す。素敵!!!
いろいろやってみると、どうやら /var を mount した時点からおかしいようだ。 /var 以下を退避してしらみ潰ししますか。
# mount /var/usr/tmp に退避したものを ディレクトリ第一層単位で
↑これ以降、 dynamic link な通常コマンド死亡
# /rescue/cp -Rp /var/* /usr/tmp/
# /rescue/umount /var
# /rescue/cp -Rp /usr/tmp/hogehoge /varとコピー。都度、 ls とか叩いて確認。
で、結局。
# /rescue/rm /var/run/ld-elf.so.hintsだけでよかったみたい。消しても作り直してくれるし。うゆー。
/usr/src/UPDATING の 20040728 あたりの問題なのかなぁ。でもそれは前回アップデートした時に踏んでるはずなんだけど...
恐いので念のため /usr/src/gnu/usr.bin で make install して、 kernel と userland 作り直して。で、めでたしめでたし。
そっかぁ、 /rescue の下ってクランチバイナリなんだっけ。かこいい。
でもアップデートを繰り返してると古いバイナリが i-node 違い size 違いで残っているのはちょっとかこわるい。
アップデートの時に不要な標準バイナリを消す機構ってないのかな? 対話式とかで。
参考リンク:
Program Library HOWTO - 3.2. ライブラリはどのように使われるか げ、 JF だ!
そっすかぁ、 ELF キャッシュってやつっすかぁ。よくわらかんっす。
ld-elf.so.1(1) と ldconfig(8) を読んで勉強しませう。
おれ、よくこんなんで CURRENT なんて使ってるなぁ。惰性なんだけどね。