memtest86+はふつうは公式サイト1等から出来合いのバイナリを入手してくれば充分だが、通常は VGA出力必須のためシリアルコンソールでのヘッドレス環境では実行できない。しかしソースコードには必要最小限ではあるがシリアルコンソール対応コードが含まれているため、ヘッダを修正して makeしなおせばヘッドレス環境で使えるmemtestバイナリを手に入れることができる。
注意点
memtestのシリアルコンソール対応は、既に充分にはメンテナンスされていないのか若干の不具合がある。例えば configurationメニューから抜けたあと画面が乱れるので起動後のテストオプションが事実上変更できないとか、ESCキーで終了したとき rebootではなく system haltで止まってしまうなどだ。とは言え VGAデバイスを持たない機材のメモリ健全性テストができるだけで充分な利用価値があったりする。
なお memtestバイナリは 32bit実行ファイルとなるので、64bit環境で buildするには /usr/include/gnu/stubs-32.h
が要求される。
CentOSの場合
まず必要なパッケージをインストールする。基本的な gccやライブラリの類は yum groupinstall "Development Tools"
で揃う。また memtestを makeするために 32bitバージョンの glibc-develもインストールする。
sudo yum groupinstall -y "Development Tools"
# 64bit環境の場合
sudo yum install -y glibc-devel-2.17-78.el7.i686
memtestの SRPMをダウンロードし、rpmコマンドで展開する。展開結果は ~/rpmbuild
ディレクトリ以下に現れる。
rpm -iv ftp://ftp.pbone.net/mirror/vault.centos.org/7.1.1503/os/Source/SPackages/memtest86+-4.20-14.el7.src.rpm
シリアルポートの設定は、memtestの condfig.hで行うので、これに対する patchファイルを用意する。SERIAL_CONSOLE_DEFAULT を1にするだけだが、これによって起動オプションとして console=CONFIGURATION
が記述できるようになる。
--- memtest86+-4.20/config.h 2011-01-24 03:11:04.000000000 +0900
+++ memtest86+-4.20/config.h.serial 2015-07-03 13:15:26.716441211 +0900
@@ -13,7 +13,7 @@
/* SERIAL_CONSOLE_DEFAULT - The default state of the serial console. */
/* This is normally off since it slows down testing. Change to a 1 */
/* to enable. */
-#define SERIAL_CONSOLE_DEFAULT 0
+#define SERIAL_CONSOLE_DEFAULT 1
/* SERIAL_TTY - The default serial port to use. 0=ttyS0, 1=ttyS1 */
#define SERIAL_TTY 0
次いで specファイルを修正する。元の memtest86+.specをコピーして、これらを適切な場所に追加する。
cp ~/rpmbuild/SPECS/memtest86+.spec ~/rpmbuild/SPECS/memtest86+-serial.spec
# Patch1指示を Patch0指示行の直後に追加
Patch1: memtest86+-4.20-serial.patch
# %patch1コマンドを %patch0コマンド行の直後に追加
%patch1 -p1 -b .serial
あとは rpmbuild
コマンドを叩けば、RPMパッケージが作成される。これをインストールすると /bootに展開されるが、LiveBootの場合必要なのは memtestバイナリ本体だけなので(LiveBoot環境で buildした場合は)出来上がった memtest.binを /run/initramfs/live/syslinux/mt86plus
にコピーして、syslinux.cfgを編集すれば事足りる。2
rpmbuild -bb rpmbuild/SPECS/memtest86+-serial.spec
ls -l ~/rpmbuild/RPMS/x86_64/memtest86+-4.20-14.el7.centos.x86_64.rpm
-rw-rw-r-- 1 liveuser liveuser 80616 Jul 2 18:31 rpmbuild/RPMS/x86_64/memtest86+-4.20-14.el7.centos.x86_64.rpm
ls -l ~/rpmbuild/BUILD/memtest86+-4.20/memtest.bin
-rwxr-xr-x 1 liveuser liveuser 176500 Jul 2 18:31 rpmbuild/BUILD/memtest86+-4.20/memtest.bin
cp ~/rpmbuild/BUILD/memtest86+-4.20/memtest.bin /run/initramfs/live/syslinux/mt86plus
# Troubleshootingメニューに追加
label memtest
menu label Test ^memory
kernel mt86plus
append console=ttyS0,115200n8
memtest.binは FDDブートイメージなので、FDDへはそのまま ddするだけでも使える。ただしそれでは今回のようなシリアルコンソール設定オプションを渡すすべがないので、syslinux等の汎用ブートローダーを利用して起動するほうが一般的だろう。
Ubuntuの場合
まず build環境を整える。apt-get build-dep PACKAGE
で指定パッケージを buildするのに必要なツール類がまとめてインストールされる。
sudo apt-get update
sudo apt-get install devscripts
sudo apt-get build-dep memtest86+
apt-get source memtest86+
memtestのシリアルポート設定は CentOSの場合と同様だが(memtest86+-4.20/debian/rulesを修正するのも面倒なので)config.hは直接修正する。その後はソースディレクトリの中で debuild -us -uc
を実行すれば memtest.binバイナリと、親ディレクトリに .debファイルが作成される。
cd memtest86+-4.20/
vi config.h
debuild -us -uc
ls -l memtest.bin
-rwxr-xr-x 1 ubuntu ubuntu 164216 Jul 3 02:57 memtest.bin
memtest.binは LiveBootフラッシュドライブの mt86plusと差し替えて使用する。
ls -l /cdrom/install/mt86plus
-rwxr-xr-x 1 root root 150024 Jun 22 16:11 /cdrom/install/mt86plus
cp memtest.bin /cdrom/install/mt86plus
label memtest
menu label Test ^memory
kernel /install/mt86plus
append console=ttyS0,115200n8
syslinuxのバージョンにもよるが kernel/appendコマンドに渡すファイル名に拡張子が付いていると正常認識されないことがあるので、CentOSでは慣習的に8文字以下の拡張子なしファイル名にすることが多い。 ↩