読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

Linuxカーネルコンパイル その2

前回の続きです。今回はカーネルパニックに陥った方の対処です。 カーネルパニックになったとき表示された kernel panic: VFS: Unable to mount root fs on...... ですが、これはinitrdがないために起きていました。 まずはinitrdについて説明します。 ◆なぜinitrd(Initial RamDisk)が必要か カーネルは開発当時は小さかったため、新しいドライバや機能はどんどん付け加えられていきました。しかしそれが今になっては膨大な量となったため、ドライバ等はモジュールとしてカーネルとは別で管理されるようになりました。 しかしここで問題が起きます。 起動時にカーネルが読み込まれます。次にハードディスクをマウントするわけですが、ドライバがモジュール化されているためロードされずHDDを認識できません。 そこでinitrdの出番です。 initrdはマウントするための最低限のモジュールを包括していて、grubで指定すればカーネルと同時にinitrdも読み込み展開されるためきちんとHDDを認識、マウントしてくれるようになります。 11.04では自動でinitrdも作成してくれたので問題なく起動できましたが、なぜか10.04の時は作成してくれないために起動できませんでした。なので自分で作る&grubで指定する方法を書きます。 ◆initrdの作成&grubの設定 $ cd /boot/ $ sudo mkinitramfs -o initrd.img-xxx xxx ファイル名 バージョン の順に指定します。xxxの部分は.debファイルで出力したファイルの通りです。覚えていない場合は/lib/modules/ でモジュール群を読み込むので、そこに書いてあるフォルダ名を見ればいいです。 次にgrubの指定です。 $ cd /boot/grub/ $ sudo emacs -nw grub.cfg で、下の方にブート時のメニューが出てきます。これはブート時に「e」を押したら出てくる設定です。 この中で「xxx」について書かれているもの(多分メニューの一番上に書かれているはず)だけがinitrdの記載が無いことが分かります。 なのでそこに他のカーネルの設定にならって initrd /boot/initrd.img-xxx と書いて保存します。ただ書き込み不可になってる可能性があるので、その場合はあらかじめ $ sudo chmod 644 grub.cfg としておけばいいです。編集後は元のパーミッションに戻しておきましょう。 この状態で再起動し、カーネルを選択するとちゃんと起動できるようになります。 ◆補足:カーネルパニックから自動で再起動 カーネルパニックに陥るとマジックSysReqキーも効かないので基本的にリセットボタンくらいしかありません。 ですがあらかじめ設定しておくと自動で再起動してくれます。 $ sudo emacs -nw /etc/sysctl.conf 最終行に追記します。例として10秒後に再起動することにします。 kernel.panic = 10 保存後反映させます $ sudo sysctl -p 確認したい時は $ cat /proc/sys/kernel/panic とすればいいです。デフォルトでは0で、この時は再起動してくれません。 ソース: Linuxのinitrdファイルって何? Ubuntu 10.04 でカーネル再構築 カーネルパニック時の再起動