seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

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
(..以下略..)

適用してみる。

./setup.plを実行してドライバを作ってみると、問題なく完了した。

これでリブートをかけると、今度はちゃんと起動することが確認できた。

uname -rで見ると、たしかに新しいバージョン"2.6.18-164.11.1.el5"を差しているので古いバージョンで起動しました、というオチではないのは確かだろう。

レガシーではない仮想ネットワークと仮想SCSIバイスを有効にしているのでLinux-IC2が動いていないと不味いのだが、どちらも正常に動作しているようだ。


無事にアップデートできたようだ。

ネットに情報に感謝。

*1:aliasを使ったら?という説もある。でも、未来のカーネルバージョンを返すのはunameのセマンティクスではないよね。