スポンサーサイト
投稿日時 : -------- --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-------- --:-- | スポンサー広告
kernelアップデートでmenu.lstが勝手に書き換えられて起動不能に
投稿日時 : 2008-02-06 06:01

■kernelアップデート後に再起動すると起動できなくなった

 Ubuntu7.10のsynapticで2.6.22.14へのkernelアップデートを実行して再起動したら、GRUBメニューから選択後、
root (hd0,7)
Filesystem type is ext2fs, partition type 0x83
kernel /boot/vmlinuz-2.6.22.14-generic root=UUID=xxx-xxxx....
ro quiet splash locale=ja_JP

Error 15: File not found

Press any key to continue. . .
という表示が出て起動できなくなった。違うパーティションのFedora8からmenu.lstを見てみたが、おかしいところが見当たらない。menu.lstのkernelのパスと実際のパスがずれてるわけでもないし、UUIDが間違ってるわけでもない。3時間ほど悩んだあとに初歩的なミスに気づいた。Ubuntuのルートデバイスが/dev/sda7なのにmenu.lstにはroot (hd0,7)と書いてあった。

■誰がmenu.lstを書き換えたのか

 root (hd0,6)に書き換えて再起動するとあっさり起動。3時間気づかなかった自分にがっかりして苦笑したが数秒後におかしなことに気づいた。もとからroot (hd0,7)だったとしたら今まで起動できていたことが説明できない。そういえばkernelが入れ替わるということはmenu.lstに記述されているkernelのパスも書き換えないとならない。kernelアップデート時に何らかの原因でroot (hd0,6)とすべきところをroot (hd0,7)とされてしまったようだ。検索すると似たような現象が見つかった。
 
Ubuntu日本語フォーラム
カーネルのアップデート時は、古いカーネルがmenu.lstの中に残らないように自動で編集する機能があります。もし、menu.lstが変な状態になっていた場合はこの機能でmenu.lstが元に戻る可能性はあります

 思い返してみると確かに邪魔なコメント行を削除した覚えがある。それにUbuntuのインストール後にパーティション構成を変更し、rootをdev/sda7から/dev/sda6にし、menu.lstのrootもroot (hd0,7)からroot (hd0,6)に書き換えたことを思い出した。おそらくコメント行削除か、rootの書き換えのどちらか、もしくは両方が「変な状態」とみなされた原因だということがわかってきた。
 

■menu.lstの編集はupdate-grubに認めてもらえるか

 それにしてもこの「変な状態」の定義がよくわからない。menu.lstをリセットするのはupdate-grubというプログラムらしいが、こいつがどういった条件でリセットを実行するのか謎なので調べてみた。以下が現在のmenu.lst。
/boot/grub/menu.lst
## ## End Default Options ##
 
title    Ubuntu 7.10, kernel 2.6.22-14-generic
root    (hd0,6)
kernel    /boot/vmlinuz-2.6.22-14-generic root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro quiet splash locale=ja_JP
initrd    /boot/initrd.img-2.6.22-14-generic
quiet
 
title    Ubuntu 7.10, kernel 2.6.22-14-generic (recovery mode)
root    (hd0,6)
kernel    /boot/vmlinuz-2.6.22-14-generic root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro single
initrd    /boot/initrd.img-2.6.22-14-generic
 
title    Ubuntu 7.10, memtest86+
root    (hd0,6)
kernel    /boot/memtest86+.bin
quiet
 
### END DEBIAN AUTOMAGIC KERNELS LIST
 
# This entry automatically added by the Debian installer for a non-linux OS
# on /dev/hda1
title    Windows NTLDR(hd0,0) chainloader
root    (hd0,0)
savedefault
makeactive
chainloader +1

この状態でupdate-grubを実行する。もちろんroot権限が必要。
$ sudo update-grub
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.22-14-generic
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done
menu.lstを確認すると見事に修正したばかりの(hd0,6)が(hd0,7)に戻されていた。その他kernelオプションやtitleの変更、改行の追加まであらゆる変更が元に戻される。結局分かったことは
### END DEBIAN AUTOMAGIC KERNELS LIST
の部分までは一切の変更を認めなてくれないということ。このコメントを削除することもタブー。このコメント行を削除すると、これより下に書いてあったものがごっそり削除されてしまうので注意。しかしこのコメント行より下は何を書いてあろうが、半角だろうが全角だろうがそんなの関係ないらしい。実際、文法完全無視で適当に入力した文字列も修正されなかった。
### END DEBIAN AUTOMAGIC KERNELS LIST
hffd;:jghsgsgtgtgg gjirgperg hjoshgrhtrhththt rhtうわ、何をすくぁwせdrftgyふじこlp;@
これも通ってしまった。
 

■デフォルト設定を変更する

 grub-updateの挙動は大体分かったが、このままだとkernelアップデートのたびに(hd0,6)が(hd0,7)に戻されてしまう。man grub-updateしてみると、menu.lst自体のコメント行にデフォルト設定が書いてあるっぽい。デフォルトのルートデバイスの設定もあるということなので実際見てみると、72行目付近に
/boot/grub/menu.lst 72行目付近
## default grub root device
## e.g. groot=(hd0,0)
# groot=(hd0,7)
という記述があった。このデフォルト設定には癖があって、このコメント行を表す「#」は削除せず、そのまま編集しなくてはならないらしい。
/boot/grub/menu.lst 56行目付近
## DO NOT UNCOMMENT THEM, Just edit them to your needs
なので、
## default grub root device
## e.g. groot=(hd0,0)
# groot=(hd0,6)
なんか気持ち悪いがこれで設定完了ということになる。この状態でupdate-grubを再度実行してみると、今度はちゃんと(hd0,7)を(hd0,6)にしてくれた。他にもデフォルトのkernelオプションなども同じように設定できるようになっている。
/boot/grub/menu.lst 59-66行目付近
## default kernel options
## default kernel options for automagic boot options
## If you want special options for specific kernels use kopt_x_y_z
## where x.y.z is kernel version. Minor versions can be omitted.
## e.g. kopt=root=/dev/hda1 ro
##      kopt_2_6_8=root=/dev/hdc1 ro
##      kopt_2_6_8_2_686=root=/dev/hdc2 ro
# kopt=root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro

■update-grubの動作

$ man update-grub
It works by looking in /boot for all files which start with "vmlinuz-". They will be treated as kernels, and grub menu entries will be created for each. (中略) It will also add initrd lines for ramdisk images found with the same version as kernels found.
/bootディレクトリにある"vmlinuz-"で始まるファイルをkernelとして扱い、それぞれについてGRUBメニューを生成する。(中略)見つかったkernelと同じバージョンのramdiskイメージもinitrd行としてメニューに追加される。
ということでファイル名を元に自動的にkernelやramdiskを認識してメニューに追加するということらしいです。
 
GRUBを新規導入する際は以下参照
GNU GRUB ハードディスクから起動する為の設定
 

■まとめると

 synapticによるkernelアップデート時はupdate-grubが必ず自動実行されて、menu.lstがmenu.lst自体に記述されているデフォルト設定を元に書き換えられる。このとき「### END DEBIAN AUTOMAGIC KERNELS LIST」のコメント行が防衛線になってくれ、それ以下に書かれた内容は無条件に保持される。この行がなかった場合、それ以下に書かれた内容がすべて削除されることになるので注意が必要。
 
 起動できなくなったのは、Ubuntuインストール後にパーティションをいじってルートデバイスを変更したからだった。そういう変なことをしなければmenu.lstが初期化されても起動には問題なかったと言える。しかしもしルートデバイスを変更した場合でもmenu.lstのデフォルト設定をその時に変更しておけば、synapticによるkernelアップデートの際にも起動不能に陥ることはない。
 
スポンサーサイト
2008-02-06 06:01 | Linux | Comment(0) | Trackback(0)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。