Netinfoで大事故


事故の背景

ASCII 社発行 MacPeople 2004年8月号の記事を見て、個人持ちの
PewerBook G4 12 inch 上のMac OS X 10.3 Panther
で Gimp 使おうと思い、記事を見ながら FinkCommander で kinput2 をソースからコンパイルしてインストールしようとした。しかし canna のコンパイル後のインストールの段階で失敗する。原因は "canna" という名前のユーザーがいないので引数に "canna" という文字列を与えて実行する chown が失敗することだった。

事故の様子

ユーザーを追加しようと、
/Applications/Utilities/Netinfo Manager.app

を起動し、うろ覚えで "users" の項目に "canna" を追加しようとした。細かい手順は忘れたが、
"users" という項目が "canna" という項目に変更された。

直後にあらゆるユーザー認証が失敗するようになった(ように見えた)。shell 上で su もできないし、キーチェインも使えなくなった。しかし OS 側での認証を要しない作業は普通にできた。メイルも読めたし、web も見られた。 少なくとも、
一度ログアウトしたらもう二度とログインできない

と思われた。 shell を起動するとプロンプト文字列が「ユーザー名が分かりません」 というワーニングになっている。しかし cd すると自分のホームディレクトに移動する。なんにしても、古典的 UNIX のユーザー認証も無効になったように思われた。

復旧

事故現場の特定

とりあえず数時間、 ビールとアテネ・オリンピックの中継とモーツァルトのレイクエムでリラックスして、 冷静さを取り戻してから、 Netinfo Manager がどのファイルに変更を加えたかを探した。

find / -mtime 1 -print > f1 && bin/u2e f1 > f2

u2e は UTF8 を EUC に変換する自作 perl スクリプト。リダイレクトしとかないと、 permission がありませんよワーニングで画面が埋まる。-mtime 1 にしたせいで、5848個ヒットしたファイルのほとんどは Caches、Fink、iTunes、iPhoto など無関係なものだったが、一つだけそれっぽいものがあった。
/private/var/db/netinfo/local.nidb

これはディレクトリで、見てみようとすると owner が root、permission が 700 で見られない。su もできない。現場はおおよそ分かったが、
一般人は立ち入り禁止だった。

現場へのアクセス

しばらく現実逃避した後、PowerBook を FireWire の

ターゲット・モードで起動

してみることにした。 一度シャットダウンするともう二度とログインできないかもしれない、 という危機感はあったが、やってみたい好奇心の方が強かった。 シャットダウンを開始すると FileVault が未使用領域を回復するかどうか聞いてきた。「回復」を選んだが、 いつまでたっても終了しない。のであきらめて電源ボタン長押しで終了した。

キーボートのTを押しながら電源ボタンを押してターゲットモードで起動した後、 妻が使っている iBook に FireWire で接続。マウントした後ターミナルを起動して

cd /Volumes/マウントしたディスク/private/var/db/netinfo/local.nidb

してみると、あっさりできた。ディレクトリの owner は iBook でログインしている妻のアカウントになっている。 しかし私のホームディレクトリは見えない。FileVault でセキュリティが守られている現場を初めて見た。

cd した先で ls すると、事故発生時刻当たりで変更があったのは

Score.128

というファイルだけだった。他にもいくつかファイルがあり、 更新時刻がこれよりも新しいものもあるので、
現場到着が遅れたら、どれが事故現場かわからなくなる

可能性もあった。このファイルはバイナリだったが、
むりやり vi で編集。

/canna で詳細な事故現場を探し、幸い1カ所しかなかったので、そのまま users に書き換えて :wq!。 文字数がcannaとusersで一致していたのも幸いだったのかもしれない。

復旧確認

vi を終了して PowerBook を再起動。何事もなかったかのようにログインでき、 キーチェインも su もできる。幸せを実感。