サーバ復旧 — あるいは,記憶を取り戻せ

土曜日,自宅のサーバが故障した。NFS マウントしたビデオデータを Mac OS から観ていると頻繁に停止する。挙げ句,サーバ接続が切断される。FreeBSD サーバのログを確認すると,LBA read(LBA とは Logical Block Addressing の略で記憶装置内のセクタ番号)に失敗した旨のエラーメッセージが大量に出力されている。南無三宝,ディスクがぶっ飛んだらしい。サーバをリブートしたところ,ハードウェアの probe(ハードウェア診断)のあと fsck(file system check)で回復不能エラーを検知して起動が停止してしまった。

「エッチな映画ばかり観てるからバチが当たったのよ」とは妻。じつに正しい。教訓その1:NFS サーバにエッチな映画を入れて楽しむのはやめよう。(2012.11.8 付記:2012 年 10 月 1 日施行・著作権法改正により,DVD のリッピングやインターネットからの動画の違法ダウンロード行為が禁止された。よって「やめよう」ではなく「やってはならない」になった。法律には従うしかない)

ハードディスクを買って来て,交換し,FreeBSD をインストールし,Apache やらなにやら大量のプログラムをインストールし,サーバ環境を整え,... と考えると気が遠くなった。しかし,このバカブログもパーか,これまで多大な労力をつぎ込んで来た自作サーバプログラムもパーか,などなど考えるにつけ,記憶喪失の疑似体験をしたような気分になった。記憶を取り戻せ。「しようがないなー」とサーバ復旧に着手したのである。おかげでこの連休はほとんどパーになってしまった。

日曜日,娘の学園祭を見に行ったあと,川崎駅前ヨドバシカメラで Hitachi Global Storage Technology 社製の SATA2 7200 rpm 1TB HDD バルク品を 5,000 円足らずで購入。帰宅して,サーバ筐体を開ける。外したカバーに手を触れて静電気を逃す。で,HDD を交換しようとしたら,なんと,壊れた既設の HDD が取り外せない。このベアボーン PC は,HDD を装着したネジを覆うように,特殊な方法で電源を固定していたのである。「じゃ増設」と考えたんだけど,予備の SATA 用電源コネクタがひとつも空きがない。しかも,SATA 用ケーブルもない。私の知らないうちに(PC を自分で組立てるなんてもう 15 年くらいやっていない) PC の世界も当然ながら様変わりしているわけで,内蔵 HDD の電源コネクタはいまや 4pin ならず,マザーボードとの接続も IDE ケーブルならぬ SATA ケーブルなんである。昔悩んだ IDE プライマリ/セカンダリのジッパ設定から解放されたのは嬉しかったんだけど。ふたたびヨドバシカメラに逆戻りして,4pin-SATA 電源変換ケーブル,SATA ケーブルを追加購入しなければならなかった。教訓その2:内臓周辺機器を増設するときは,あらかじめ筐体内部を確認し,追加の必要なケーブル類を洗い出しておこう。

20110920-pcsata.png
4pin-SATA 電源変換ケーブル(上・右の黒が新,左が旧)/SATA コネクタ(下・黄色の結線部)

取得してあったシステムのバックアップは何ヶ月か前のものであり,ブログをはじめ日々更新されるデータは最新状態ではない。教訓その3:バックアップはこまめに取得し DVD-R などに焼いておこう。ディスクを「増設」するついでに,壊れた HDD 内のまだ生きているデータを漁って,使えるものは使おうということにした。今日はその苦肉の方法のメモを残しておく。

まずは SATA のプライマリソケットに再度旧 HDD をつないでブートする。当然,fsck で悲鳴を上げて,次のメッセージとともに停止する。

Automatic file system check failed; help!
ERROR: ABORTING BOOT (sending SIGTERM to parent)!
Sep 18 16:03:45 init: /bin/sh on /etc/rc terminated abnormally, 
going to user mode
Enter full pathname of shell or RETURN for /bin/sh:

help! は機械のお前じゃなくこっちのセリフじゃ! これに対し,Enter キーを押して,シングルユーザモードでログインする。自作プログラム,文書,ブログ記事など大事なデータを格納しているディスク・パーティションをマウントしてみる。/etc/fstab を参照し,デバイス名とマウンティングポイントを特定する。これらは利用者のインストールの仕方によって変わるので注意。

# cat /etc/fstab
# Device  Mountpoint FStype Options Dump Pass#
/dev/ad4s1b  none    swap   sw      0    0
/dev/ad4s1a  /       ufs    rw      1    1
/dev/ad4s1g  /home   ufs    rw      2    2
/dev/ad4s1h  /shared ufs    rw      2    2
/dev/ad4s1f  /tmp    ufs    rw      2    2
/dev/ad4s1d  /usr    ufs    rw      2    2
/dev/ad4s1e  /var    ufs    rw      2    2
/dev/acd0 /cdrom  cd9660 ro,noauto  0    0
linprocfs /compat/linux/proc linprocfs rw 0 0

私の目的とするデータは /usr/home にあるので,この二つに対応するファイルシステムだけをもう一度 fsck -y でチェックし,そのあとで mount してみる。幸いにもこれらパーティションは無事だったようである。vi などの基本ツールは /usr/bin にあるので,それらを使う場合も /usr ファイルシステムをマウントしておく必要がある。もし単一パーティションで FreeBSD を導入していたらすべてのデータがパーになっていたところである。こういうことがあるので,用途に応じてパーティションを分けておく意味がある。

# fsck -y /dev/ad4s1d
# fsck -y /dev/ad4s1g
# /sbin/mount /dev/ad4s1d /usr
# /sbin/mount /dev/ad4s1g /home

必要なデータをアーカイブする(ここでは省略)。上記マウントができれば当該ファイルシステムは書き込みも可能なはずである。ルートパーティションはおそらく書き込み不可なので,アーカイブはマウントしたファイルシステムに格納する。アーカイブデータを別のコンピュータにコピーするには,ネットワークが使えないといけない。この時点ではネットワーク通信の準備ができていないので,次にこれを行い,取得したデータを scpftp でもよい)で別マシンに転送する。以下では anotherpc のユーザ user のホームディレクトリにコピーしている。anotherpc 上でも ssh が動作可能でなければならない。Mac OS など UNIX 系 OS なら OK である。

# ifconfig msk0 inet 192.168.1.4 netmask 255.255.255.0
# scp mydata-archives.tar.gz user@anotherpc:/Users/user/

msk0 はネットワークインタフェース名であり,利用する LAN カードによって変わって来る。忘れてしまっていたら,/etc/rc.conf 中に ifconfig_XXX=... なる行があるはずなので,その XXX をネットワークインタフェース名に指定する。IP アドレスは使っていたものをそのまま使うのがよい。詳細は ifconfig のマニュアルを参照。

教訓その4:HDD が壊れた!と思ってあきらめてはいけない。全壊しているとは限らない。パーティションを分けておけば救われるデータもある。必要なデータをすべて別マシンに転送し終わったら,ほっと一息。煙草を燻らせて一服し,コーヒーでも飲もう。システムをシャットダウンし,電源コードを抜く。新しく追加した HDD の SATA ケーブルをプライマリに,旧い HDD のケーブルを DVD ドライブの次のソケットあたりに繋ぎ直す。ついでに筐体内部に溜まりまくったホコリをエアスプレーで吹き払っておく。とくに冷却ファンの近辺を念入りに。これで PC の騒音がピタリと止む。

ここからは新しい HDD に最新バージョンの FreeBSD を導入する作業となる。私は Mac で,FreeBSD 8.2-RELEASE の DVD イメージをダウンロードし,ディスクユティリティで DVD-R に書き込んで,このメディアでインストールを行った。とにかく真っ先に sendmail,POP 環境を整えた。その後,上で取得したコピーデータを再度新環境に転送してからもろもろの復旧を行った。まだまだ入れ込めていないプログラムもたくさんあってうんざりである。もう二度とやりたくない。けれども,3 年に一度はやるはめになる。次はもうやる気力が起こらないかも知れない。教訓その5:自宅でサーバ運用なんてやめたほうがよい。

最後に。警告その1:上記方法がいつもうまく行くとは限らない。 

*** Post Scriptum ***

復旧中に,misima 旧字旧仮名変換支援サービスを使ってくれている友人から「つかえなくなっちゃったけど,どうしたの? 体調でも悪くしてサーバ運用やめちゃったの?」とのメールをもらった。もちろん,これを読んだのはサーバ復旧のあとのこと。エラーでなかなか届かなかったのがリトライで着信したのだろう。ありがとう。四苦八苦しながらもリカバリしましたよ! 教訓その6:へたに自作プログラムの公開などしないほうがよい。