がらくたネット


kernel 2.6.37...

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