Seishi Ono's blog

Fugaces labuntur anni. 歳月人を待たず

CentOS7のkernelアップデートが失敗する

CentOS

思わぬできごと

旅行から帰ってきたら、どこかにぶつけたように右足の親指の付け根が痛い。最初は飛行機の機内で寝ぼけてどこかにぶつけたんだろうくらいに思っていたが、親指の付け根という典型的な場所だけにこれは痛風では無いかと思い至って、翌日病院に行って薬を処方して貰った。この歳まで痛風とは縁が無く、生まれて初めての経験だったが、旅行先で水分を余り採らないまま、かなり歩き回り、その上で、夜にはいつもより多めにお酒を飲んだことがトリガーとなったようだ。痛いことは痛かったのだが、最近はロキソニンのパルス療法で痛みもかなり緩和されるようになったようで、話に聞くほどの辛さも無く、靴が履けないほど腫れ上がる経験もせずに済み、良い時代に痛風になったものである。

それでも多少安静にしていなければならないようなので、この機会に仕事をさぼって、懸案だったCentOS7のkernelアップデートの課題に挑戦してみた。丁度解約済みのsakuraのVPSがあったので実験材料にはよい。

1 CentOS7へのバージョンアップ後の課題*1

VPS上でのバージョンアップ時の問題

今回の課題は、VMwareなどのVPS上で、CentOS6から7にバージョンアップしたサーバーのカーネルをアップデートするとカーネルパニックすることがあることである。この現象は、大きな規模のVPSでのみ観測されるように見える。例えば、VMware Fusionとかの小さな環境では再現しなかった。

GRUB2へのバージョンアップの失敗

また、CentOS6から7にバージョンアップしたときにGRUBがGRUB2になっていない場合に限り、このような現象が見られる。そもそも、GRUBのアップデートがなされないのにはなぜだろうと言う問題もある。全く同じVPS環境でもGRUB2にアップデートされているものもある。それなりの理由があるはずだが、今回はそこまでは追求せずに、とりあえずカーネルパニックをなんとかするのが目標である。

ネット上での調査結果

この現象をGoogle先生に聞いた限りでは、他の人で同じように困っている人には出会わなかった。私がやる限りどのVPSでも発生したのは、何か私のオペレーションに問題があるのかもしれない。CentOSもそれなりに便利だが、その分プロセスが見えなくなって、私のように想定外のへぼいことをするアマチュアにはそれなりに敷居が高い。もちろん昔のようなOSでは、管理しきれないだろうし、どっちもどっちなのだが。

原因を追及するのが面倒で、やがてカーネルのバージョンアップでそのうち直るだろうと放っておいたのであるが、そういうことは期待できそうに無いと観念したものである。

2 問題の発見

半日ほどいろいろいじり回して、最後に、/etc/grub.confの該当のバージョンに"initrd"の行が書き込まれていないという単純な事実に気がついた。もう一度Google先生に聞くと、再インストールすれば修正されるとの記述もみつかるが、今回はそれもだめで、結局手動で書き込まなければならなかった。結局以下のように記述した。

CentOS Linux (${version}.el7.x86_64) 7 (Core)
root (hd0,0)
kernel /vmlinuz-${version}.el7.x86_64 ro root=UUID=${UUID_NUMBER}
rd_NO_LUKS rd_NO_MDquiet rhgb crashkernel=auto KEYBOARDTYPE=pc
KEYTABLE=jp106 LANG=ja_JP.UTF-8 rd_NO_LVM rd_NO_DM
initrd /initramfs-${version}.el7.x86_64.img

しかし、これで何台かカーネルアップデートを諦めていたサーバーの問題は、あっさり解決した。まあ、お役御免になるサーバーの最後のご奉公で問題が解決できたことは、ちょっとうれしい。ただ、yumがなんでこんな失敗をするのか想像もつかない。

3 CentOS7への今後のバージョンアップの問題点

 CentOS7の最初のバージョンのカーネルでは、このようなyumの失敗は起こらなかった。ところが最新のカーネルでは、yumが失敗する。こうなると、今のタイミングでCentOSを6から7にバージョンアップしてしまうと、アップデート中に最新カーネルが導入され、yumがこの悪さをして、bootに失敗するはずである。試しに実験してみたら、案の定の結果になった。その場合には、VPSのコンソール画面から以下のような手間をかけることになる。

  1. レスキューモードで立ち上げ、rootでログインして/etc/grub.confにinitrd行を追加。(なお、バージョンアップが中途でハングアップしているためsudoは効かない。rootのパスワードが無いとここで困ったことになりそうだ。)
  2. バージョンアップが中途でハングアップしているため、yumコマンドのバージョンがあがらないまま、ライブラリのバージョンがあがって仕舞う現象が起こるようで、yumは起動しない。そこで、新しライブラリをシンボリックリンクして取り敢えず誤魔化す。
    cd /usr/lib64; ln -s libsasl2.so.3 libsasl2.so.2
  3. また、リポジトリの掃除をしないとel6のデータベースが残っているようだ。
    yum clean all
  4. アップデートの継続
    yum update
  5. アップグレードしたOSの/etc/grub.confにまた initrd行を追加
    initrd /initramfs-${version}.el7.x86_64.img
  6. 再起動

つまりこれからはバージョンアップは、コンソール無しには出来ないと言うことを意味している。コンソールが扱えない環境のサーバーはそれなりにあるので、また課題が増えた。

*1:この問題は新しいバージョンでは解決されているようだ。よかった。