memtest86をEFI経由で起動する方法

(2017/02/28追記。最新版 MemTest86 V7.3 Free Edition に合わせて記事を更新しました)

memtest86EFI 経由で起動する方法が予想以上に便利だったので設定方法を紹介します

この方法を使うと Linux 側で以下のコマンドを実行するだけで

$ sudo efibootmgr -n 2

PCの再起動後は自動で memtest86 が起動します

そしてmemtest86終了後も再起動するだけで,元のLinuxが起動します

設定方法

大まかな方針は

  • memtest86.com から USBブート用のイメージをダウンロード
  • このイメージはEFI経由で起動するようにできているので必要なファイルだけ HDD にコピー
  • efibootmgr で マザーボード上の EFI設定を書き換える

だけです



設定は予めEFIブートを有効にしておいた debian で行いました.EFIブートが有効なっていれば 他のディストーション,つまり ubunturedhat でも同じ手順で作業できるはずです


まずUSBブート用のイメージをダウンロードします.

2017/02/28の時点で、最新版は MemTest86 V7.3 Free Edition になります

http://www.memtest86.com/から memtest86-usb.tar.gz を落とします

$ wget http://www.memtest86.com/downloads/memtest86-usb.tar.gz

展開します

$ tar xvfz memtest86-usb.tar.gz
memtest86-usb.img
README

memtest86-usb.img がUSBメモリ用のイメージファイルになります.fileコマンドを使い,中身を確認します

$ file memtest86-usb.img
memtest86-usb.img: DOS/MBR boot sector; partition 1 : ID=0xee, start-CHS (0x0,0,2), end-CHS (0x13,31,12), startsector 1, 307199 sectors

パーティションテーブルを確認します

$ /sbin/gdisk -l memtest86-usb.img 
GPT fdisk (gdisk) version 1.0.1
(省略)
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          102400   49.0 MiB    0700  MemTest86
   2          104448          307166   99.0 MiB    EF00  EFI System Partition

パーティションが2つあります.必要なのは 2番めのパーティションの中のファイルです.2番目のパーティションは104448 セクタから始まり 307166セクタで終了していることがわかります.

2番目のパーティションだけマウントします.

ディスクイメージから特定のパーティションを選んでマウントする方法はたくさんありますが,一番簡単なのはおそらく次の方法です.

$ sudo mkdir -p /mnt
$ sudo mount -o loop,offset=$((104448*512)) memtest86-usb.img /mnt/

loopデバイス経由で memtest86-usb.img を /mnt にマウントします.この時 offset オプションを併用することで memtest86-usb.img を先頭から使わずに, 104448*512 バイト後ろにずらした領域をマウントします.これで第2パーティションが /mnt にマウントできます

マウントしたパーティションを覗いてみます

$ cd /mnt
$ find

ファイルがたくさん表示されます

./EFI
./EFI/BOOT
./EFI/BOOT/BOOTIA32.efi
./EFI/BOOT/Benchmark
./EFI/BOOT/BOOTX64.efi
./EFI/BOOT/unifont.bin
./EFI/BOOT/mt86.png
./help
./help/MemTest86_User_Guide_UEFI.pdf
./license.rtf
./src
./src/memtest86-src.tar.gz
./syslinux
./syslinux/memtest
./syslinux/boot.txt
./syslinux/isolinux.bin
./syslinux/syslinux.cfg

必要なファイルは EFI/BOOT ディレクトリの中身だけです

コピー先ディレクトリを作ります

EFIのシステムパーティションは /dev/sda2 とします

まだマウントしてない場合は マウントします。マウントポイントは /boot/efi とします

$ sudo mount /dev/sda2 /boot/efi

memtest という名前で新しくディレクトリを作ります

$ sudo mkdir /boot/efi/EFI/memtest

先程展開した EFI/BOOTの中身だけ、memtestにコピーします

$ sudo cp -r EFI/BOOT/* /boot/efi/EFI/memtest

以上でインストールは終了です.

設定

まず efi に memtest を登録します.登録も Linux のコマンドで行います

まずブートイメージの登録状況を確認します

$ efibootmgr -v

たとえば次のような出力の場合は,2つ登録があることになります

BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000,0001
Boot0000* debian        HD(2,GPT,省略)/File(\EFI\debian\grubx64.efi)
Boot0001* Hard Drive  省略

このリストにmemtest86を追加します

/dev/sda2 に対応するオプションが --disk /dev/sda --part 2 になります

$  sudo efibootmgr -c --disk /dev/sda --part 2 --loader /EFI/memtest/BOOTX64.efi --label "memtest"

意味は

という意味です

確認します

$ sudo efibootmgr -v
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0002,0000,0001
Boot0000* debian        HD(2,GPT,省略)/File(\EFI\debian\grubx64.efi)
Boot0001* Hard Drive  省略
Boot0002* memtest       HD(2,GPT,省略)/File(\EFI\memtest\BOOTX64.efi)

Boot0002 で memtest のエントリが増えたことがわかります

この出力の BootOrder が起動順になります.このままではデフォルトが memtest,つまり電源を入れるとデフォルトでは memtest が起動してしまいます.

デフォルトを debian に戻します

$ sudo efibootmgr -o 0,2,1

以上で設定はすべて完了です


使い方

再起動時に debian と memtest のどちらが起動するかは 以下のコマンドで確認できます

$ sudo efibootmgr -v
BootCurrent: 0000
BootOrder: 0000,0002,0001
Boot0000* debian        HD(2,GPT,省略)/File(\EFI\debian\grubx64.efi)
Boot0001* Hard Drive  省略
Boot0002* memtest       HD(2,GPT,省略)/File(\EFI\memtest\BOOTX64.efi)

なら debian が起動します

ここで

$ sudo efibootmgr -n 2

を実行すると,次回の再起動時だけ memtest が起動します. もう一度再起動すると debian が起動する状態に戻ります