Hyper-V上のLinuxのkernel updateの落とし穴

今回は最近ハマっていた内容を記事にしたいと思います。

皆さんは仮想環境を構築・運用することはありますか?
そういう場合も物理環境とほぼ同じ感覚で運用していませんか?

今回の例はMSのHyper-VとLinuxの組み合わせでしか起こらない問題です!
痛い目を見た筆者の体験をご覧ください。
まずは問題が発生し一段落するまでの流れです。



1、Hyper-VにCentOS 5.5 64bit(gui付き)を構築

2、最近ふとメンテを思い立ちyum update

3、直後は問題なし、再起動のタイミングでkernel panic発生!

4、CentOSのboot画面(GRUB)でupdate前の古いkernelを
  選択すると無事起動。

この3発生後4確定までが一番冷や汗をかきました。
が、しかし起動成功して挙動に問題がないことが確認できたので
あとは原因の追究です。
kernel updateが問題の一番表層なのはわかっています。
が、CentOS & RHEL 5.10相当のkernel自体に
updateするとkernel panicになるレベルのバグがあったら
もっと話題にならないとおかしいので
条件付きなんだろうなぁとアタリをつけた上で
キーワード「CentOS Hyper-V」で
ネットの海に情報を求めました。

最初に見つけたページ
↑こちら真っ先に出てきましたがCentOS 5.6相当の
 kernelへの更新問題で今回は関係ありませんでした。

これを踏まえCentOS 5.10というキーワードに切り替えると
全然引っかからないんです。
次にkernelのバージョンの 2.6.18-371で調べてみましたが
やっぱり引っかからず。
ここで一旦間をあけることにしました。

改めて「Hyper-V CentOS panic」で検索して
最初の5件に含まれていたのが下記ページでした。
最後に見つけたページ
ここに理由から、対処法まで書いてあるのですが意訳すると
Hyper-V Integration Services 3.1モジュールが
CentOS 5.9以降のkernelには含まれていて
boot時に読み込まれる必要がある。
これは5.5(というより5.8まで全部)の時には
存在しなかったモジュールなので、
起動イメージを作るmkinitrdを5.5(~5.8)環境で行うと
モジュール設定が行われない。
そのためmkinitrdにて明示的にモジュール設定を行う必要がある。
(注、5.9以降を初期インストールする際には
自動でモジュールが有効化されるので問題は起こらない。)

で、実際の手順ですがkernel panicが出る前ならyum update直後に、
kernel panicが出てしまった後ならば古いkernelで起動したのちに
コマンドを流してください。
kernelのバージョンとかは各々の環境ごとに異なりますが
2.6.18-371.1.2.el5だった場合、旧起動イメージを退避して
作り直すやり方は下記です。

mv /boot/initrd-2.6.18-371.1.2.el5.img /boot/initrd-2.6.18-371.1.2.el5.img.old
mkinitrd --with=hid-base-hv --with=hid-hyperv --with=hv_utils --with=hv_vmbus --with=hv_storvsc --with=hv_netvsc /boot/initrd-2.6.18-371.1.2.el5.img 2.6.18-371.1.2.el5
うちの環境ではこの後、再起動すると無事
新kernelでも起動できるようになりました。

CentOS 5.5ではHyper-Vのレガシーネットワークしか
使えなかったのですが、kernel updateすることで
普通のネットワークが使えるようになり
通信速度が体感レベルで上がりました。

ただし5.5でなくても、kernel updateを行うと
linux側のネットワークアダプタ認識が確実にリセットされます。
dhcp自動設定になっていない場合は再設定する必要がありますので
ご注意ください。

最後に、2014/09/17にRHEL 5.11がリリースされましたので
近いうちにCentOS 5.11もリリースされ、
yumからも新しいkernelが取得できるようになるでしょう。

その際にこの一連の流れを繰り返す必要がある方も
おられそうですので、ご覧になられた方の
役に立つことがあれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。