(2019/12/18追記。最新版 MemTest86 V8.3 Free Edition に合わせて記事を更新しました)
(2017/02/28追記。最新版 MemTest86 V7.3 Free Edition に合わせて記事を更新しました)
memtest86 を EFI 経由で起動する方法が予想以上に便利だったので設定方法を紹介します
この方法を使うと Linux 側で以下のコマンドを実行するだけで
$ sudo efibootmgr -n 2
PCの再起動後は自動で memtest86 が起動します
そしてmemtest86終了後も再起動するだけで,元のLinuxが起動します
設定方法
大まかな方針は
- memtest86.com から USBブート用のイメージをダウンロード
- このイメージはEFI経由で起動するようにできているので必要なファイルだけ HDD にコピー
- efibootmgr で マザーボード上の EFI設定を書き換える
だけです
設定は予めEFIブートを有効にしておいた debian で行いました.EFIブートが有効なっていれば 他のディストーション,つまり ubuntuや redhat でも同じ手順で作業できるはずです
まずUSBブート用のイメージをダウンロードします.
2019/12/18の時点で、最新版は MemTest86 V8.3 Free Edition になります
http://www.memtest86.com/から memtest86-usb.tar.gz を落とします
$ wget https://www.memtest86.com/downloads/memtest86-usb.zip
展開します
$ unzip memtest86-usb.zip memtest86-usb.img readme.txt imageUSB.exe
必要なファイルは 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 (0x3f,188,61), startsector 1, 1023999 sectors, extended partition table (last)
パーティションテーブルを確認します
$ /sbin/gdisk -l memtest86-usb.img
GPT fdisk (gdisk) version 1.0.4 (省略)Number Start (sector) End (sector) Size Code Name 1 2048 512000 249.0 MiB 0700 MemTest86 2 514048 1023966 249.0 MiB EF00 EFI System Partition
パーティションが2つあります.必要なのは 2番めのパーティションの中のファイルです.2番目のパーティションは514048 セクタから始まり 1023966セクタで終了していることがわかります.
2番目のパーティションだけマウントします.
ディスクイメージから特定のパーティションを選んでマウントする方法はたくさんありますが,一番簡単なのはおそらく次の方法です.
$ sudo mkdir -p /mnt $ sudo mount -o loop,offset=$((514048*512)) memtest86-usb.img /mnt/
loopデバイス経由で memtest86-usb.img を /mnt にマウントします.この時 offset オプションを併用することで memtest86-usb.img を先頭から使わずに, 514048*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
必要なファイルは 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 が起動する状態に戻ります