玄箱HGのDebianが起動しなくなった

このwebサーバーは、玄箱HGという小型の機械で動いている。モニターもキーボードも接続できない、単なるハードディスクをネットワークに接続するための機械である(一応)。その機械がネットワーク経由でアクセスできない状態になると、機械表面に付いている4つのLEDでしか状態を知る術が無くなる。
先週、その玄箱HGが全く応答しない状態に陥り、電源を抜いて再起動すると、赤色LEDが6回点滅して起動しなくなった。玄箱の説明書によると、赤点滅6回はハードディスク異常を意味するらしい。

この玄箱HGで動かしているOSはDebian Linuxである。2年前にインストールした後、起動しないというトラブルはこれまで一度も無かった。先週まで順調に動いていたものだし、OSが壊れたとは考えにくい。HDD自体が壊れたのだろう。
…と考えて、HDDを取り出して別のPCに接続して、Linuxを動かしてmountを試みると、何の異常もなくmountできて、fsckも無事に終わってしまった。しかし、そのfsckが済んだHDDを再度玄箱に接続しても、やはり赤点滅6回であった。
では玄箱が壊れたのか?と思って別のHDDを接続すると、エラーになること無く、EMモード(FROM内蔵のOS)だが正常に起動した。さらに、玄箱用のHDDのバックアップを取ってフォーマットして以前の手順でDebian(sarge)をインストールすると、問題無く起動した。
正常に起動するsargeのバックアップをddで取ってHDDをフォーマットしてddでリストアしてもsargeが正常に起動することを確認して、ddで元のシステム(lenny)をリストアしても、やはり起動しなかった。どうやらDebianが起動不能になってしまったらしい。

起動しなくなった原因のヒントを求めてネットサーフィンしまくった結果、初期の玄箱のファームウェアは2.6系であるLenny(Debian 5.0)のカーネルを起動できないのが原因であることが判明した。
この玄箱のDebianはインストール時には3.0(sarge)で、aptitudeで更新したら自動的にetch(4.0)になり、aptの設定ファイル(/etc/apt/sources.list)がDebianのstableなバージョンを参照する設定だったので、そのままaptitudeを使い続けたら、去年の3月に自動的に5.0(lenny)になってしまったのである。

という訳で、www.revulo.comの手順を参考にして、Lennyの起動に関連する部分だけ再構築することにより、思ったより楽に復旧できたので、その手順を記録する。

●旧Lennyシステムのバックアップ
 HDDを接続したLinuxを起動して、先頭のパーティションのディスクイメージを作成する。
 dd if=/dev/hdb1 of=/tmp/kuro-debian.img
 (HDDが/dev/hdbとして認識されている場合)

●MontaVistaのインストール
HDDの最初のパーティションにある2.6系のLinux kernelを起動するには、"U-Boot"というものを使う方法があるらしいが、FROMを書き換える必要があり、失敗すると玄箱が使用不能になるリスクがある。それに代えて、HDDの最初のパーティションに2.4系のカーネルを置いて、別のパーティションにある2.6系のカーネルを起動するという方法がある。www.revulo.comにあるのは、後者の安全な方法である。
そこで、まず先頭のパーティションにMontaVistaを再インストールする。

1. 玄箱をEMモードで起動
 先頭のパーティションを削除して玄箱を起動するとEMモードになる。
2. telnetで入る
 IPアドレスは玄箱のファームウェアダウンロードツール(付属CDとか玄人指向のサイトとかにある)の中のKuroBoxSetup.exeを起動するとわかる。
 出荷状態ではrootのパスワードはkuroadminである。
3. パーティション作成
 mfdisk -c /dev/hda とすると、懐かしいfdiskのUIが出て来る。
 dで全てのパーティションを削除した後、nでプライマリパーティションを
  hda1: 256M(MontaVista用)
  hda2: 256M(swap用)
  hda3: 4G(Lenny用)
  hda4: 残り
 と作り、tでhda2のタイプを82にしてwでHDDに書き込む。
4. ファイルシステム作成
 mkswap /dev/hda2
 mke2fs -j /dev/hda1
 mke2fs -j /dev/hda3
 mke2fs -j /dev/hda4
5. hda1をmountする
 mount -t ext3 /dev/hda1 /mnt
6. MontaVista一式の圧縮ファイルを転送
 玄箱のファームウェアの中のimage.zipの中にあるtmpimage.tgzを/mnt/にFTPで転送する。
7. MontaVistaを展開
 cd /mnt
 tar xvfz tmpimage.tgz
8. EMモード終了
 echo -n "OKOK" > /dev/fl3
 reboot

●Lennyのインストール
1. インストーラー一式を転送
 www.revulo.comにある以下のファイルを/tmpに転送する。(hda1が256MでMontaVistaをインストールした直後なら全て/tmpに入る)
 debian-lenny-installer-kuroBOX-20090317.tgz
 debian-lenny-kuroBOX-20090317.tgz
 kuro-bootsel2-debian.tgz
 kuro-bootsel2.20080419.tar.gz
 loader.o
 kernelimage-2.6.25.1-kuroHG.tgz
 modules-2.6.25.1-kuroHG.tgz
2. インストーラー実行
 cd /tmp
 tar xvfz debian-lenny-installer-kuroBOX-20090317.tgz
 sh debian-lenny-installer-kuroHG.sh
3. 電源長押しで再起動
 Lennyが起動していることを確認する。

●旧システムのリストア
1. バックアップを転送
 FTPなりsambaなりで/mntに転送する。FTPでもsambaでも、何らかの設定が必要である。
 別のパソコンにHDDを繋いで4番目のパーティションにコピーしても良い。
 今回はaptitudeを使ってsambaをインストールし、このためだけの設定を行った。
2. ディスクイメージをマウント
 mkdir /mnt/hda1-org
 mount -o loop /mnt/kuro-debian.img /mnt/hda1-org
3. ディスクイメージを展開
 cd /mnt/hda1-org
 tar cf - (dev, proc以外の全て) | (cd /; tar xvf -)
 例: tar cf - bin boot etc home lib opt root sbin selinux sys usr var | (cd /; tar xvf -)
4. 電源長押しでシャットダウン
5. 電源を抜いて差して再起動


LEDの赤点滅を見て、ApacheからMovableTypeまで全てセットアップし直しかとげんなりしたが、簡単な解決方法があって助かった。
設定ファイルもデータも全て残っているとはいえ、莫大な手間をかけて構築してきたこのシステムを1から再構築するのは大変なロスである。全てを先週と全く同じ状態にすると起動しなくなる訳であるから、再起動可能かどうか試しながら少しずつやり直さないといけない。のべ20時間は軽くかかりそうな骨の折れる作業である。諦めてその準備も始めていたのだが、未練深く神頼みの実験を繰り返してシステム再構築の重荷から解放された瞬間の喜びは、小さいながらも久々に感じた幸せであった。

このDebianがLennyになったのは1年以上前である。もしLenny化が原因なら、その次から再起動できなかったはずである。しかしLenny化から1年以上そんなトラブルは無かった。だから、原因はそれではないだろう。
と思ったせいで、無駄に時間を費やしてしまった。このwebサーバーはaptitudeを使って頻繁に更新しているにも関わらず、Lenny化してから1年以上、なんと1度も再起動を要すること無く連続で動いていたのだ。恐るべしDebian。