事前にメモリの異常を検知できたら便利なので、
ECC(error checking and correcting)エラーを検出する「EDAC」を試してみることにしました。

EDAC Project: http://bluesmoke.sourceforge.net/ によると、
kernel 2.6.16よりメモリのECCイベント(エラーが起こったこと)の検出が可能になったようです。

1.準備

$ su

# dmesg
# lspci
でハードウェアの情報を確認することができます。
実験に使用したサーバのCPUは、「Intel Xeon 3040 1.86GHz X 2」でチップセットは、「Intel i3000」です。
 

2.EDACドライバの確認

# cd /usr/src/linux-2.6.21.5/drivers/edac
# ls -la

 Kconfig
 Makefile
 amd76x_edac.c
 e752x_edac.c
 e7xxx_edac.c
 edac_mc.c
 edac_mc.h
 i82860_edac.c
 i82875p_edac.c
 r82600_edac.c

3.パッチの適用

i3000用のパッチを「www.kernel.org」のmm patchより入手しました。
「kernel 2.6.21.5」でmm patchを当てたところ、エラーで先に進めることができなくなりました。

どうやら、パッチを適用する順番をまちがえたようです。

「prepatch」 とは、安定版のカーネルのプレパッチで「-rc」は完全版になるかもしれないという意味らしいです。
パッチの当て方は、「patch-2.6.22-rc6」を「kernel 2.6.21.5」に当てるのではなく、「kernel 2.6.21」に当てるようです。
その次に、mm patch「2.6.22-rc6-mm1」を当てることで最新になるようです。
 
kernel 2.6.21 でカーネルを再構築し、パッチ patch-2.6.22-rc6.bz と.6.22-rc6-mm1.bz2を適用することにしました。

# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2

展開
# tar xjf linux-2.6.21.tar.bz2

ディレクトリを移動

# cd linux-2.6.21

パッチをダウンロードする

# wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc6.bz

# wgethttp://www.kernel.org/pub/linux/kernel/people/ akpm/patches/2.6/2.6.22-rc6/2.6.22-rc6-mm1/2.6.22-rc6-mm1.bz2

展開
# bzip2 -d patch-2.6.22-rc6.bz

# bzip2 -d 2.6.22-rc6-mm1.bz2

パッチを当てる

# patch -p1 < patch-2.6.22-rc6.bz

# patch -p1 < 2.6.22-rc6-mm1

コンフィグをコピーする
# zcat /proc/config.gz > .config

# make menuconfig

Device Drivers
  [*} EDAC - error detection and reporting (EXPERIMENTAL)
    [*] Debugging
    <*> Main Memory EDAC (Error Detection And Correction) reporting
    <M> Intel 3000/3010
    <M> Intel Greencreek/Blackford chipset

# make -j 5

# make modules

# make modules_install

# make install

ブートローダの追加

kernel /boot/vmlinuz-2.6.22-rc6-mm1-kt01 root=/dev/sda2 ro

reboot

起動成功!!

モジュールの確認
# lsmod

Module                  Size  Used by
thermal                13640  0
fan                     5316  0
button                  8464  0
processor              33160  1 thermal
ac                      5700  0
battery                12296  0
psmouse                36624  0
i2c_i801                9104  0
serio_raw               7172  0
i2c_core               24192  1 i2c_i801
evdev                   9856  0
i3000_edac              7176  0
rtc                    12952  0

i3000_edacがロードされています。

ログの確認
# cd /var/log
# less messages

kernel: EDAC MC: Ver: 2.0.4 Jun 29 2007

kernel: EDAC MC0: Giving out device to i3000_edac i3000: DEV 0000:00:00.0
kernel: EDAC PCI0: Giving out device to module 'i3000_edac' controller 'EDAC PCI
 controller': DEV '0000:00:00.0' (POLLED)

4.テスト
 
使用したメモリ

  • 512MB DDR2 Memory 240Pin DIMM DDR2-533 ECC

 
メモリがビットエラーを起こすようにするには、
http://bluesmoke.sourceforge.net/testing.htmlにより、メモリの12番プレートをマスクします。

実験に使用したサーバは、ネットブートでmemtestが可能なので、あらかじめエラーが検出できるか
テストすることにします。

  • BIOSの設定でネットブートが最初に起動するように変更

 

  • ネットブートの際、boot: プロンプトで、memtestと入力


メモリのチェックが始まり、エラーを検出した場合は、画面にエラー訂正過程が出力されます。

memtestではエラーを検出できず、そのままOSを起動し、ログを確認しましたが、
それらしき記録はありませんでした。

何度か実験を繰り返しましたが、今のところECCエラーを検出できていません。