次のページ 前のページ 目次へ

7. トラブルシューティング,または挫折の苦しみ

ブートディスクを作ろうとする場合,最初の何回かが失敗するのはよくあるこ とです.ルートディスクを作成する際によく用いられる方針は,手持ちのシス テムから部品を取り出してフロッピーベースのシステムに詰め込み,コンソー ルにメッセージが出るまで試行錯誤を繰り返すことです.メッセージさえ出れ ば半分勝ったも同然です.後はシステムが文句を言わなくなるまで,一つ一つ 問題を解決していけばよいのです.システムが何のメッセージも出さずにハン グする場合は,その理由を調べるのは大変です.何とか表示が出る段階に達す るには,いくつかの部品がちゃんと揃っていて,正しく設定されている必要が あるのです.システムが何も言ってくれないような問題を見つけるためのお勧 めの手順を以下に示します:

  • 以下のようなメッセージが出力されるかもしれません:
    Kernel panic: VFS: Unable to mount root fs on XX:YY
    
    これはありがちな問題ですし,原因もごく限られています.まずデバイス XX:YY をデバイスコードのリストで確認してください.これが正しいルー トデバイスですか? 正しくなければ,rdev -R の実行を忘れたか,間違っ たイメージに対して rdev -R を実行したと思われます.デバイスコード が正しければ,次にデバイスドライバがカーネルに組み込まれているかどうか をしっかり調べてください.フロッピーディスク,RAM ディスク,ext2 ファ イルシステムのサポートがカーネルに組み込まれていることを確かめてくださ い.
  • ルートディスクに意図したディレクトリが本当に含まれているか,しっ かり確認します./bin でなく /rootdisk/bin の ような間違ったディレクトリにコピーしてしまうということなどがありがちで す.
  • /lib/libc.so があることと,/lib ディレクト リのリンクがハードディスクと同じになっていることを確認します.
  • 現在のシステムの /dev ディレクトリにおけるシンボリック リンクがルートディスクのファイルシステムにも存在していることを確認しま す.またリンク先がちゃんとあることも確認します.特に /dev/console を忘れがちなので気を付けてください.
  • ルートディスクに /dev/tty1, /dev/null, /dev/zero, /dev/mem, /dev/ram, /dev/kmem があることを確認します.
  • カーネルの設定を確認してください. ログインするまでに必要なシス テムリソースのドライバが全て組み込まれているでしょうか(モジュールでは だめ). RAM ディスクのドライバはカーネル組み込みでなければなりません.
  • カーネルのルートデバイスと RAM ディスクの設定が正しいかどうか確 認します.

以上のような一般的な点が確認できたら,次に示すようなファイルをチェック してみましょう:

  1. init が /sbin/init または /bin/init として存在しており,実行可能になっていることを 確認する.
  2. ldd init を実行して, init の使うライブラリを確認してく ださい.通常は libc.so だけでしょうが,それでもチェックしてください. 必要なライブラリやローダがディスクに入っていることも確認します. 使っているライブラリに合ったローダがあることを確認します. a.out 形式ならば ld.so ですし,ELF 形式ならば ld-linux.so で す.
  3. ブートディスクの /etc/inittab を見て, getty (あるいは agetty, mgetty, getty_ps 等の getty と同等のプログラム) の呼び出し方を調べてください. これらの記述をハードディスクの inittab と念入りに比べてください.ちゃんと意味を持った記述になっているか,お使 いのプログラムのマニュアルページも参照してください.inittab はお そらく最も難しい部分です.なぜなら文法や内容が,使っている init プログラムやシステムの作りによって変わってしまうからです.inittab を正しく書くための手段はただ一つ,initinittab のマニュア ルページを読んで,現在のシステムがブート時にやっていることを解き明かす ことです. /etc/inittab を見て,そこにシステムの初期化を 行っているエントリがあることを確認してください.このファイルにはシステ ム初期化のために実行するスクリプトが書かれているはずです.ここで指定さ れているファイルは存在していなければなりません.
  4. init に行ったのと同じように, getty に対して も ldd を実行し,必要なライブラリを表示させます.そしてそのライブ ラリのファイルとローダがルートファイルシステムに入っていることを確認し ます.
  5. rc スクリプトを全て実行できるシェルプログラム(例: bashash)があることを確認します.
  6. レスキューディスクに /etc/ld.so.chace がすでに存在して いるようでしたら,作り直してください.

init が起動しても次のようなメッセージが出力されることがあります:

        Id xxx respawning too fast: disabled for 5 minutes  

これは init が出すもので,お使いの getty または login が起動してすぐに異常終了したことを示しています. gettylogin の実行ファイル,そしてそれらが依存しているラ イブラリをチェックしてください. また,/etc/inittab から の呼び出し方が正しいかどうかも調べてください. getty がおかしなメッ セージを出力する場合は,おそらく /etc/inittab からの呼び 出し方が間違っています.getty のオプションはプログラムによって違 います.また agetty ではバージョンによって互換性がない場合さえあ るそうです.

ログインプロンプトが現われ,正しいログイン名を入力したのに,即座に次の ログインプロンプトをシステムが出す場合には,PAM か NSS に問題があると 思われます. PAM と NSS の節をご覧ください.シャ ドウパスワードを使っているのに /etc/shadow をブートディス クにコピーしていない場合にも,この問題が出ることがあります.

何かの実行ファイル(例えば df)をレスキューディスクから起動したとき に, df: not found のようなメッセージが出る場合には,次の 2 点を 確認してください: (1) バイナリがあるディレクトリが PATH に含まれているか. (2) プログラムが必要とするライブラリ(とローダ)があるか.


次のページ 前のページ 目次へ

[