kernel 2.6.37...
CentOS5.5でkernelを2.6.37-2にアップデートした時の苦労話。 とある理由で、kernelをアップデートする必要が生じた。 それで、elrepoさんのリポジトリを利用する事にしたのだが思わぬことに… そうそう、archはc86_64です。つまり64ビット環境。
elrepo
elrepoはCommunity版Enterprise Linux RepositoryでRHELベースのリポジトリです。とくにkernel-mlと呼ばれるkernelがあってkmod-関係のモジュールが揃ってるので重宝します。
そこにあったkernel-2.6.37-2を導入
yum install kernel-ml-2.6.37-2
まぁ当然ながら普通にインストールできる。ww
んでこのkernelで起動した場合、2つのエラーに遭遇する。ww
1つ目 dm-region-hash.koのエラー
起動時に
insmod: error inserting '/lib/dm-region-hash.ko': -1 File existsって表示される。
この直前に実はdm-rejion-hash.koは正常にロードされてて、なんで??となる。
他の人たちは無視ってる様子。確かに無視っても問題全くなし。
気になる…ww
これは、mkinitrdでramdiskが作成されるときにinitスクリプトが書き込まれるんだけどそいつが重複してモジュールをロードしているのが問題なのです
なので、この重複箇所を取り除けばOKなんだなー。
まず作業ディレクトリを作成 mkdir temp;cd temp kernelのバージョンを確認して間違えないよーに uname -a cp /boot/initrd-2.6.37-2.el5.elrepo.img ./ initrdはgzip圧縮したcpioアーカイブです mv initrd-2.6.37-2.el5.elrepo.img initrd-2.6.37-2.el5.elrepo.gz gunzip initrd-2.6.32-2.el5elrepo.gz mkdir temp2 cd temp2 一気に解凍しますー cpio -id < ../initrd-2.6.37-2.el5.elrepo でもって問題のinitを編集 vi init ........... echo "Loading dm-region-hash.ko module" insmod /lib/dm-region-hash.ko echo "Loading dm-mirror.ko module" insmod /lib/dm-mirror.ko echo "Loading dm-zero.ko module" insmod /lib/dm-zero.ko echo "Loading dm-snapshot.ko module" insmod /lib/dm-snapshot.ko echo "Loading dm-region-hash.ko module" ← この行を消す insmod /lib/dm-region-hash.ko ← この行を消す ............ 新しいinitrdを作成します find . | cpio --create --format='newc' > /root/temp/newinitrd cd .. そしてgzipで圧縮 gzip /root/temp/newinitrd imgファイルとしてリネーム mv newinitrd.gz newinitrd.img 本来あるべき場所に移動 mv newinitrd.img /boot mv newinitrd.img initrd-2.6.32-2.el5.elrepo.img reboot
これで直るのです。
2つ目 udevd-eventのエラー
起動時に
Starting udev: udevd-event[940]: wait_for_sysfs: waiting for '/sys/devices/pci0000:00/0000:00:1f.5/host4 ... udevd-event[903]: wait_for_sysfs: waiting for '/sys/devices/pci0000:00/0000:00:1f.5/host3 ... udevd-event[904]: wait_for_sysfs: waiting for '/sys/devices/pci0000:00/0000:00:1f.5/host2 ...とか複数行でて、普通に何事もなかったかのうように起動してくる。
これも無視っても問題なし。
気になる…ww
これはudevのルールファイルにバグ?があるかららしい。
ってことなので直してしまいましょ。参考情報
対象ファイル:/etc/udev/rules.d/05-udev-early.rules 修正前:ACTION=="add", SUBSYSTEM=="scsi", WAIT_FOR_SYSFS="ioerr_cnt" 修正後:ACTION=="add", SUBSYSTEM=="scsi", KERNEL=="[0-9]*:[0-9]*", WAIT_FOR_SYSFS="ioerr_cnt"これでOK。
--- 05-udev-early.rules 2011-03-08 13:01:42.000000000 +0900 +++ 05-udev-early.rules.mod 2011-03-08 13:02:51.000000000 +0900 @@ -1,7 +1,8 @@ # sysfs is populated after the event is sent ACTION=="add", DEVPATH=="/devices/*", ENV{PHYSDEVBUS}=="?*", WAIT_FOR_SYSFS="bus" ACTION=="add", SUBSYSTEM=="net", WAIT_FOR_SYSFS="address" -ACTION=="add", SUBSYSTEM=="scsi", WAIT_FOR_SYSFS="ioerr_cnt" +#ACTION=="add", SUBSYSTEM=="scsi", WAIT_FOR_SYSFS="ioerr_cnt" +ACTION=="add", SUBSYSTEM=="scsi", KERNEL=="[0-9]*:[0-9]*", WAIT_FOR_SYSFS="ioerr_cnt" # ignore these events until someone needs them SUBSYSTEM=="drivers", OPTIONS="ignore_device"パッチファイル作ってみたさ。
3つ目 mcelogのエラー
1時間毎にcron君からエラーメールが飛来する
件名:Cron <root@localhost> run-parts /etc/cron.hourly 内容: /etc/cron.hourly/mcelog.cron: mcelog: warning: record length longer than expected. Consider update.
mcelogをアップデートしないといけないんだって。
mcelogはなんだかずっとpreってバージョンらしい。
ソースで導入するのは簡単だけど、パッケージ管理したいのでSPECファイルを探して
パッケージ化してしまう。
choon.netからソース落とす wget http://mirror.choon.net/choonrpms.choon.net/centos/5/choonrpms/SRPMS/mcelog-1.0pre3-0.2.choon.centos5.src.rpm rpmbuild --rebuild mcelog-1.0pre3-0.2.choon.centos5.src.rpm rpm -Uhv /usr/src/redhat/RPMS/x86_64/mcelog-1.0pre3-0.2.x86_64.rpm
makeの際に
Makefile:86: .depend: No such file or directoryってなエラーが発生しているが、Makefile自体でのエラーになってて他に情報がみつからないので放置プレイ。
4つ目 hardware clockのエラー
停止時とか再起動時にコンソール上にエラーがでる
Syncing hardware clock to system time Cannot access the Hardware Clock via any knouwn method. Use the --debug option to see the details of our search for an access method. [FAILED] がーん。なんでしょうか?これは?
でさぁ。よくよく確認すると起動時に時間を設定してるのだがBIOS上で日本時間を設定しているのね。
でもって、CentOS5.5が起動してくるとそれをUTCと認識した状態で設定しているんだよ。ダメぢゃん…
コンソール上のエラーはhaltスクリプト内のhwclockが出している。
elrepoにこの件について報告がある。
まずは/sbin/hwclock –debugを実行してみる。で、どんな方法でもハードウェアclockに接続できないと表示されていたらパッチを適用するのです。
--- rc.sysinit.distro 2010-07-02 16:16:45.000000000 +0100 +++ rc.sysinit 2010-12-18 16:34:13.000000000 +0000 @@ -269,6 +269,18 @@ if [ "$PROMPT" != "no" ]; then echo fi +### ELREPO: See if the RTC driver is built-in, otherwise load it +if [ ! -f /proc/driver/rtc ]; then + action $"Loading rtc_cmos driver: " /sbin/modprobe rtc_cmos +fi + +### ELREPO: Make the newer device nodes to accomodate hwclock +RTC_MAJOR_NO=`/bin/awk '/rtc/ { print $1 }' /proc/devices` +if [ -n "$RTC_MAJOR_NO" ]; then + action $"Creating /dev/rtc0: " /bin/mknod /dev/rtc0 c $RTC_MAJOR_NO 0 + action $"Creating /dev/rtc: " /bin/ln -sf /dev/rtc0 /dev/rtc +fi + # Set the system clock. update_boot_stage RCclock ARC=0