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文字以下の拡張子なしファイル名にすることが多い。 ↩
