カーネルアップデート危機一発
最近はkernelパッケージをアップデートすると、カーネルがインストールされ、GRUBの設定が更新され、さらにはデフォルトの起動カーネルまで変更されます。
あれは昔、MIRACLE V2.0の頃の手順といえば、
1. kernelパッケージをinstall
2. lilo.confを手動で書き換え
3. /sbin/liloを実行
という手順が必要で、3を忘れた日には新しいカーネルで立ち上がらず「撃沈!」な場面に遭遇することがありました。rpmのオプションで-Uvhなどで完全に置き換えてしまった日には、とても悲しい出来事となったりもしました。
それでは最近のkernelパッケージはどこが変わったんでしょうか? 実際にkernelパッケージをインストールした時に、何が行われているか見てみましょう。
で、いきなりですかkernelパッケージのインストールスクリプトの内容を見てみます。
-----
# rpm -q --scripts kernel
preinstall scriptlet (using /bin/sh):
/sbin/modprobe loop 2> /dev/null > /dev/null || :
exit 0
postinstall scriptlet (using /bin/sh):
[ -x /usr/sbin/module_upgrade ] && /usr/sbin/module_upgrade
[ -x /sbin/new-kernel-pkg ] && /sbin/new-kernel-pkg --package kernel --mkinitrd --depmod --install 2.6.9-11.19AX
preuninstall scriptlet (using /bin/sh):
/sbin/modprobe loop 2> /dev/null > /dev/null || :
[ -x /sbin/new-kernel-pkg ] && /sbin/new-kernel-pkg --rminitrd --rmmoddep --remove 2.6.9-11.19AX
-----
中身を整理すると、pre, post, preunの3箇所のスクリプトが設定されていることが分かります。
1. pre
loopモジュールをmodprobeでロードしているだけのようです。
2. post, preun
module_upgradeというコマンドとnew-kernel-pkgというコマンドを実行しています。
new-kernel-pkgでは、カーネルのバージョンが指定されていますので、カーネルのアップデートには、このコマンドが大きく関わっていそうです。こんなときには、迷わずfileコマンドです。
-----
# file /sbin/new-kernel-pkg
/sbin/new-kernel-pkg: Bourne-Again shell script text executable
-----
ラッキー! シェルスクリプトなら、いろいろ手間をかけずにそのまま読めてしまいます。思い立ったが吉日ということで、早速眺めてみます。
-----
install() {
# XXX kernel should be able to be specified also (or work right on ia64)
if [ ! -f $bootPrefix/$kernelName-$version ] ; then
[ -n "$verbose" ] && echo "kernel for $version does not exist, not running grubby"
return
fi
...
----
さっそくinstall()から始まる関数があります。たぶんインストール時に実行されるのでしょう。
さらにinstall()の中を見ると...
------
if [ -n "$cfgGrub" ]; then
[ -n "$verbose" ] && echo "adding $version to $grubConfig"
if [ -n "$banner" ]; then
title="$banner ($version)"
elif [ -f /etc/asianux-release ]; then
title="$(sed 's/ release.*$//' < /etc/asianux-release) ($version)"
else
title="Asianux ($version)"
fi
/sbin/grubby --add-kernel=$bootPrefix/$kernelName-$version $INITRD \
--copy-default $makedefault --title "$title" \
--args="root=$rootdevice $kernargs" \
--remove-kernel="TITLE=$title"
else
[ -n "$verbose" ] && echo "$grubConfig does not exist, not running grubby"
fi
------
ということで、ConfigファイルがGrubだったら...の条件文がありました。この中で、grubbyというコマンドにたくさんのオプションを指定しています。どうやらこのgrubbyコマンドが重要な役割を担っているようです。
よく知らないコマンドが出てきたときには、manコマンド。これ常識ですね。
-----
$ man grubby
-----
をすると、
-----
GRUBBY(8) GRUBBY(8)
NAME
grubby - command line tool for configuring grub, lilo, and elilo
SYNOPSIS
grubby [--add-kernel=kernel-path] [--args=args]
[--bad-image-okay] [--boot-filesystem=bootfs]
[--bootloader-probe] [--config-file path]
[--copy-default] [--default-kernel] [--grub]
[--info=kernel-path] [--initrd=initrd-path]
[--lilo] [--make-default] [-o path]
[--remove-kernel=kernel-path]
[--set-default=kernel-path] [--title=entry-title]
DESCRIPTION
grubby is a command line tool for updating and displaying information
about the configuration files for the grub, lilo, elilo (ia64), and
yaboot (powerpc) boot loaders. It is primarily designed to be used
from scripts which install new kernels and need to find information
about the current boot environment.
-----
最初の概要だけでも読んでみると... GRUBの設定を行うコマンドラインツールということみたいです。おそらくこのコマンドがGRUBの設定の更新とかを行っているみたいですね。
ということで、kernelパッケージのアップデートにはgrubbyコマンドが大きく関わっているということが分かりました。
あとは、manを読むなり、実際に実行してみるなりして、何をするコマンドか調べてみると良いでしょう。

コメント