CentOS5.4 on Hyper-V でカーネルアップデートするときの注意点
yum updateをかける
久しぶりにメンテしようと
Linux Integration Components Version 2 for Hyper-Vで動作させているCentOS5.4のアップデートをかけてみた。
yum check-updateでかなりの更新があり、カーネルの更新もある。
今回は、"2.6.18-164.el5"から"2.6.18-164.11.1.el5"へのアップデートである。
大丈夫かなーと思いつつ、updateをかけてrebootしたら、案の定、起動しなくなってしまった。
(起動時に1つ古いカーネル"2.6.18-164.el5"を指定すれば起動できる。)
スナップショットした時点まで巻き戻してLinux-IC2を再適用してみたが症状は変わらず。
ここで変だなと気がついて、ネットを探したら、ちょうどいい記事が見つかった。
http://www.devplace.nl/blog/updating-hyper-v-drivers-after-kernel-upgrade-on-centos
ここによると、Linux-IC2のスクリプトに含まれる"uname -r"を、アップデートしたカーネルのバージョンを差すようにechoで書き換えてやればいいよ、ということらしい。
つまり、Linux-IC2のスクリプトは"uname -r"を使ってカーネルバージョンを見てドライバを作っているらしいのだけれど、
再起動する前なのだからuname -rが返すのは現在のカーネルなので更新しようがない。
新しいカーネルで起動しようとするとLinux-IC2が新しいカーネルに対応していないものだから起動もできない、ということなのだろう。
じゃあ、どうしたらいいの?と聞きたくなる。
なんという設計!
(いや、もしかして./setup.plのオプションに何かあるのかもしれないが、それは調べていない。でも、各所でuname -rを使っているのは確認したので、たぶん、なにも考えてなかったのだろう。)
uname2とかいうのを作ってみる
こうゆう作業は二度目もあるだろうと思い、Linux-IC2にechoでバージョンを何度も直書きするのもイヤだな、と思いechoではなくuname2とかいうスクリプトを仕込むことにした。
grep "kernel /vmlinuz-2.6" /boot/grub/grub.conf | cut -f 2 -d ' ' | sed -n '1 s/^.*vmlinuz-//p'
grubのユーテリティとか、sedの文法とか詳しく知らないので、
とりあえず/boot/grub/grub.confの最初に見つかったlinuz-2.6.xxxxのバージョンを返すことにした。
ためしに実行すると、
[linux_ic_rtm]# uname2 2.6.18-164.11.1.el5 [linux_ic_rtm]#
という感じに、アップデートしたカーネルのバージョンを差している。
これをLinux-IC2のフォルダに対して"grep -rl 'uname -r'"で見つかった、すべてのファイルのuname -rをuname2 -rに書き換える。(9ファイルぐらいある。)*1
ちなみに、現在のgrub.confは、こんな感じ。
default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18-164.11.1.el5) root (hd0,0) kernel /vmlinuz-2.6.18-164.11.1.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet notsc divider=10 hda=noprobe hdb=noprobe initrd /initrd-2.6.18-164.11.1.el5.img title CentOS (2.6.18-164.el5) root (hd0,0) kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet notsc divider=10 hda=noprobe hdb=noprobe initrd /initrd-2.6.18-164.el5.img (..以下略..)