HDDクラッシュ ver.2

投稿者: | 2006年3月9日

2006/03/03(金)

何か、先月同じような事を書いたけどまたLinuxマシンが起動しなくなりました。実は、20GBのディスクの方も正常ではないことが判明したので、結局新しいディスクにベースシステムを作り直したんです。/homeだけ古い環境から引き継いで。一応、念のために古い環境を分離したパーティションに入れてあって、/backupにマウントしています。で、怪しげな20GBのHDDにWindowsXP環境を入れたんです。コイツはいつでも捨てられるようにディスクごと分離したわけです。
本来なら、そういう怪しげなディスクは使うとしてもプライマリマスターは避けるべきです。何と言っても、BIOSが真っ先に探しに行くのが1台目のHDDのMBRですから、新しいHDDを導入したのならそれを1台目にするのが筋ってもんです。分かっていたんですけど、その、面倒臭かったんでそのままそいつがプライマリマスターに納まったままにしてありました。電源を入れた時、結構な確率でHDDからぎこちないシーク音が聞こえてブートに失敗していましたが、何回かやったらブートできるのでそのまま使っていました。一度起動してしまえば、敢えてアクセスしない限りそっちのディスクに用はないので問題なく使えていたのです。念のために、GRUBを入れたブート用のフロッピーだけは作っておきました。
異変が起こったのは昨晩です。通常なら、電源を入れると「カリカリカリ…」というシーク音が聞こえます。ぎこちない時は「カリッ…カリッ…」という感じで、ブートに失敗したりします。それが、メモリチェックが終わった途端に「カリッ、ブキューン」というあからさまにヤバい音を出してハードウェア検査に失敗し、BIOSが止まってしまったのです。設定画面で確認するとプライマリIDEを一切認識していません。こういう時のために作っておいたブート用フロッピーで起動しようとしても、「hd1なんかない」と怒られます。試しにWindowsを起動しようとすると、hd0がうんたらかんたら、ファイルシステムがext2だから何たらかんたらと文句を言って、結局起動しません。どうも、GRUBではハードディスクを認識した順番にhd0、hd1、と名付けていくので、本来hd1であるべきLinuxが入ったディスクがhd0に繰り上がってしまったようです。
その場は眠かったのと面倒臭かったのでそのまま放置し、ブートフロッピーだけ編集するため出勤用の鞄に放り込みました。で、職場で休み時間に編集しておきました。Linuxが起動した後のデバイスの振り方がどうなっているか分からなかったのですが、そこはそのままにしておきました。そこが変わるのなら、/etc/fstabをそのまま解釈するのでどちらにせよディスクのマウントはできないでしょう。そうなったら、いや、そうならなくても一度は筐体を開けてHDDの物理的な接続を替えてやらにゃならんでしょう。あーもう面倒臭いなあ。

2006/03/06(月)

その後、色々試してみたんですが、既にプライマリIDE自体を認識できない状態になっているようです。生きている方のHDDも見つけてくれません。仕方なく、筐体を開けて御臨終のHDDを取り出し、生きている方をプライマリマスターに繋ぎ換えます。GRUBのブートフロッピーを別のWindowsマシンで編集し、Linuxのrootをhd0、マウントファイルを/dev/hda1に変更します。これでとりあえずカーネルを読み込んで起動し、ルートをマウントするところまでできるはずです。他のマウントポイントまでは弄れないので、この状態でGRUBのメニューからメンテナンスモードを選んで起動しました。rootのパスワードを求められ、無事にログオンできました。この状態でviが使えるのかどうか不安でしたが、やってみるとすんなり通って/etc/fstabの編集ができました。そう言えば、今回は/usrを分けていませんでした。本来なら、こういう時のためにviなり何なり、使い慣れたエディタの実行ファイルのコピーをルートに置いておくべきなのでしょう。
再起動すると、ちゃんと元の環境でLinuxが起動してくれました。毎回フロッピーで起動するのも面倒なのですが、GrubをMBRにインストールするのはWindows環境を入れてからにします。/backupを置いてあったパーティションをWindowsに使うことにします。/backupのデータは、念のため容量に余裕のある/home/pub/の下にコピーしておきます。あとは、Windowsのインストールを済ませてGRUBを書き戻せばとりあえずの作業は完了です。
ところが、簡単だと思っていたWindowsXPのインストールに意外と苦労します。まず、Windowsを入れようと思っていたパーティションのファイルシステムをそのままにしていたためWindowsのインストーラーでパーティションを切り直そうとすると拡張パーティションごと消されてテーブルがぐちゃぐちゃになったので、Linux上で一旦FATフォーマットしました。で、無事にインストール作業にかかれます。この時点でファイルシステムはNTFSにしておきます。時間がかかるのでしばらく放っておいて後から見に行くと、再起動しようとして止まっています。Grubのフロッピーを使って起動しようとしましたが、何やらエラーを出しています。問題は、シリンダ1024の壁でした。以前は当たり前のように全てのOSのブートセクタはHDDの前の方に寄せて置いていましたが、最近BIOSもブートローダーも賢くなっていたのでいつの間にか気にしなくなっていました。ブートローダーを介してもダメなんですね。
さしあたって、不要不急のWindows環境はお預けにします。面倒臭いもん。

2006/03/07(火)

確か、容量の少ない古いHDDがどこかに転がっていたはずだと思い出しました。2GBとかだったら使い道もないけど、8GBくらいあればWindowsXPのシステムドライブには十分なります。探してみると、果たして8GBのHDDが出てきました。早速プライマリのスレーブに取り付けてみます。BIOSでの認識もOK。もう何度目か分からないWindowsXPのインストールをします。ファイルコピーが終わり、再起動がかかったところで一旦Linuxを立ち上げ、GRUBを更新してインストールします。再起動して、GRUBからWindowsを立ち上げようとするとこれがまた立ち上がりません。シリンダ制限だけの問題じゃなかったようです。MBRを上書くのを早まったのでしょうか。インストーラーが再起動をかける時点でブートローダーがMBRに書き込まれると思っていたのですが。切り分けの意味でも、一度Windows環境を完成させないといけないようです。面倒臭いな。そんなことより、Linux環境で音が鳴らない問題とか、日本語入力がやり難い問題とかを先に何とかしなければ。

2006/03/09(木)

面倒だ面倒だといいながら、このところ毎晩のようにWindowsを弄ってます。本当は好きなんじゃないかと思われるかも知れませんが、その通りです。てへ。いや、別にWindowsが好きなわけじゃありませんが。むしろ、知れば知るほどヘボさ加減にはあきれています。とりあえず、デュアルブート環境は完成しました。結局、シリンダ1024の制限(これはWindowsのせいじゃない)、ブートローダーの書かれるタイミングは思ったとおりでした。更に、Windowsは最初のHDDからしか起動できないことも判明しました。折角なので経緯を記録しておきます。

まず、古いHDD(プライマリスレーブ)にWindowsXPを改めてインストールします。このとき、ヘンなドライブレターがつくのが嫌だったのでBIOSの設定でプライマリマスターのLinuxが入っているHDDを無効にしました。更にHDDの起動順序も選べたのでプライマリスレーブが1番になるように設定しましたが、結果的にこれは必要なかったようです。狙い通り、システムドライブはCドライブになりました。一旦OSが起動するとBIOSに頼らずに自分のドライバーでハードウェアにアクセスするので、もう1台のHDDに作ってあるFAT32のパーティションもちゃんと見えてDドライブになっています。BIOSの設定がこの状態だと普通に電源を入れたらスレーブの方のHDDからブートするので、ちゃんとWindowsが立ち上がります。GRUBのフロッピーを入れておくとメニューが出て、Linuxを立ち上げることもできました。Windowsがメインならこの状態でも特に問題なさそうですが、私の場合メールを含めてメインの環境はLinuxです。毎回フロッピーで起動というのも間抜けな話です。折角高機能なGRUBを使っているのですから、第1HDDのMBRに入れたGRUBからメニューで選択してLinuxもWindowsも立ち上げられるようにします。

WindowsNT系のブートローダーはNTLoaderで、この実行ファイルとboot.iniなどいくつかの参照ファイルさえあればフロッピーからでも起動できます。今、私の環境ではこのファイルは第2HDDの先頭セクタにあります。GRUBはchainloadをサポートしていて、他のブートローダーを呼び出すことができます。相手がLinuxならchainloadに留まらず各種パラメタ-を渡したりもできるのですが今はNTLoaderさえ呼び出せればいいでしょう。
root (hd1,0)
で第2HDDの先頭パーティション(番号は0から始まる)を指定します。メニューからの起動では問題ないのですが、コマンドから指定するとファイルシステムがNTFSの場合何か文句を言ってきます。煩いと思ったら、rootnoverifyとすることでマウントせずに指定だけできます。
chainloader +1
続いて別のブートローダーを見つけて制御を引き渡します。”+1″は”0+1″の略で、先頭(0)から1セクタ(512b)だそうです。これで、ntldrが呼び出されます。以前はこれで問題なく起動できていたのですが、今回はntldrは起動しているようですが先に進みません。ntldrが参照するboot.iniファイルを見てみると、起動するディスクやパーティションの情報が書いてありました。書式のルールがよく分からないまま、適当に編集して再起動してみました。やはり起動しません。しかも、編集前はBIOS設定で第1HDDを無効にして立ち上げることができたのにそれすらもできなくなってしまいました。色々調べた結果、NTLoaderは第1HDD意外からはOSを起動できないことが分かりました。boot.iniには multi(0)disk(0)rdisk(0)partition(1) というエントリがあって、いかにも別のディスクからでも立ち上げられそうですがこれはハッタリでしょうか。結果論ですが、インストール時にBIOSで第1HDDを隠したのは必須だったのです。そうしないと、システムは第2HDDに入るのにブート関係だけは第1HDDに入り、第1HDDにあるNTLoaderはどう頑張っても第2HDDのOSを起動できないのです。ヘボだなぁ。
GRUBは、そんなヘボなブートローダーに代わって第2HDDからWindowsを起動する仕組みをちゃんと持っています。仕組みというか、単にBIOSを騙すだけですけど。私の場合メインはLinuxなので、デフォルトではLinuxが起動します。GRUBはGNU生まれですから、Linuxについては何も心配しなくても問題なく起動してくれます。以前LILOで苦労したのはそのうちオジサンの昔話になるのでしょう。メニューからWindowsXPを選ぶと、rootを指定した後でmapというコマンドでBIOSのハードウェアマップを入れ替えます。この場合、hd0をhd1に、逆にhd1をhd0に入れ替えます。(2行必要)その後で指定したrootからchainloaderで第2HDDのブートセクタにあるntldrを呼び出します。そこで制御がntldrに渡され、ntldrはboot.iniを読んで起動プロセスを開始します。この時点ではまだ自分のいるのが第1HDDだと騙されていてくれるので、boot.iniもそのままでいいのです。ここで正直にdisk(1)とかすると起動してくれません。バカだから。Windowsが起動すると、ドライバを読み込んでハードウェアを探しに行きます。ここで別のHDDの存在に気付きますが、相変わらず自分が1番だと信じているので新しいHDDに自分が読めるファイルシステムが見つかると2番目以降のドライブとして追加していくわけです。

これで、HDDクラッシュに始まって環境の移行、デュアルブート環境の構築と進んだ一連のイベントは完了です。今回のことがあるまで、GRUBの中身を見たことはなく、デバイスの指定方法なんかが独特で分かり難い、という印象しかありませんでした。それなりに手に馴染んでいるLILOに換えようかとまで思っていました。今回、その実装や起動プロセスを詳しく見て、合わせてWindowsの起動プロセスについても勉強した結果、GRUBの美しさにほとんど感動すら覚えました。Linuxの起動プロセスは今回関係なかったのですが、これは以前たっぷり研究したことがあります。全てが優れているわけでは決してありませんが、何でもブラックボックスのWindowsと比べると設計の思想が分かるというのはやはり好印象です。Windowsは、知れば知るほど「なんでやねん」とツッコミを入れたくなることが増え、好きになれません。そういっても使わないわけにはいかないんですけどね。
とにかく、解決です。終わりました。正直、寝不足です。こういう、直接役に立たないことに一生懸命になる性格は昔からで、今でも妻の人によく怒られています。今回もバレたら怒られるんだろうな。ごめんなさい。でも、楽しかったんです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です