tips/rhel/20091018

Last-modified: 2009-10-18 (日) 23:15:24

/etc/init.d/kdumpスクリプトのバグ?(64bitと32bit)


会社のRHEL5でkdumpの設定をして、ダンプを取得し、調べたところこんな出力が。

file vmcore

vmcore: ELF 64-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style


「カーネルは32bit版なのになんで64bitって出力されるんだろう」って思って
いろいろと調べてみました。(PAEでもない)


※実際に調べたのは家のCentOS5.2
2.6.18-92.el5
kexec-tools-1.102pre-56.el5_3.2


で見つけたのが
/etc/init.d/kdumpでの処理


load_kdump関数内でkexecを実行するのだが、この際にパラメータとして
"--elf64-core-headers"か"--elf32-core-headers"を付加する。


どちらを付加するかを決めるのがneed_64bit_headers関数


この関数の復帰値が1だったら"--elf64-core-headers",
それ以外だったら"--elf32-core-headers"


need_64bit_headers関数のコメントや処理を見るとどうやら
/proc/iomemから物理メモリ量が4G超の場合に1を返したいらしい。


しかしながらこの関数内の処理は問題があるようだ。
具体的にいうと以下の判定式
if (end >= 4194304) {
totalmem=totalmem+4194304;
}


この"end"には物理メモリの最終アドレスがバイト単位で入ってるのだが、
"4194304"という数値はKB単位だ。


この関数内での総物理メモリ量の計算がKB単位で行われていることによる
判定式のミスと思われる。


上記判定式をコメントにして、kdump再起動し、ダンプをとってみました

file vmcore

vmcore: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style


32bitになりました。
まあ、オプションをみるとヘッダの問題だけのようにみえるので大層な問題では
ないような気もしますが・・・。
一応、RHELのサポートに確認するか。