Z87系マザーのUEFIにNVMeドライバをロードした件

2015.07.09追記

UEFI2.3.1以上ならOptionROMのドライバをロードすればいい

 

sosoru.hatenablog.jp

 

 

テスト投稿です.

動機

先週ぐらいにHDD内蔵のPS3で遊んでいて,ロード時間の長さに辟易としていました.ロード中はアクセスランプが点灯していたので,ストレージをSSDに変えればだいぶ改善されそうと考えていました.

ちょうど,メインで使っていたPCのSSDも3年ほど稼働していて,空き容量も逼迫していました.こいつをPS3に流用して,メイン機に入れるSSDを新調すれば,まぁまぁ無駄なく部品を生かせるじゃないかなぁ,と思い,新規にSSDを購入することにしました.

時代はSATAからM.2に移行してきているようなので,新規にSATAは買いたくないなぁと思い,折角なのでPCIExpressなSSDにしてみました.

選択したのが,Intel 750 シリーズの400GB版(SSDPEDMW400G4R5),GB単価もそこまで高いわけではないので,奮発して買ってしまいました.2015年7月8日ぐらいに秋葉原のBUYMORE(元TWOTOP?)で49,980円でした.特価扱いでした.

ここまで,あまり調べずに750を買ってしまったのですが,実はメイン機のZ87マザーはNVMeブートに対応していませんでした.それまで使っていたSSDPS3送りにしたかったので,メインのストレージは750に絞りつつ,何か対応策を考えることになりました.

メイン機の状況

マザーボード ASRock Z87 Extreme3
BIOSバージョン American Megatrends Inc. P2.50, 2014/07/08
UEFIバージョン 2.3.1
旧ストレージ Samsung SSD 830
OS Microsoft Windows Server 2012 R2 Standard
OS2(問題解決・ビルド用) Arch Linux

UEFI向けNVMeドライバーのビルド

対応策は幾つかありますが,この記事ではUEFIにNVMeデバイスをロードすることで解決します.

UEFIのバージョンは2.3.1なのでNVMeドライバを組み込むことが可能なはずです.UEFI向けのNVMeドライバは EDK II に組み込まれているようで,リポジトリをビルドすればドライバが作成されます.

私は Using EDK II with Native GCC · tianocore/tianocore.github.io Wiki · GitHub を参考にビルドしました.詰まった点をいくつか挙げます.

  • 一部のスクリプトがPython2ベースで書かれているので,Python3系が入ってる場合にはシンボリックリンクの修正が必要かもしれません.
  • edksetup.shの実行について,
    bash$ . edksetup.sh BaseTools
    とあります.間違っても./edksetup.sh BaseTools としてはいけません.buildが通らなくなります.
  • NVMeドライバはMdeModulePkg/MdeModulePkg.dscをターゲットにすればビルドされます.私はgcc 5.1.0でビルドしましたが,TOOL_CHAIN_TAGが対応してない(?)ようなので,GCC49を指定してビルドしました.アーキテクチャX64としました.
  • ACTIVE_PLATFORM       = MdeModulePkg/MdeModulePkg.dsc
    TOOL_CHAIN_TAG        = GCC49
    TARGET_ARCH           = X64
    

ビルドするとNvmExpressDve.efiが作成されます.これをEFI ShellでloadすることでNVMeデバイスの認識を試みます.ドライバーをUSBメモリに移動しておきます.

ドライバーのロード

コンピュータを再起動してEFI Shellに入ります.UEFIのブートメニューにShellを起動するメニューがありますが,ファイルを見つけてくれませんでした.とりあえず,Arch LinuxセットアップディスクがEFI Shellの実行ファイルを持っていたので,こいつをUEFIブートしてEFI Shellを起動します.

mapと打って現在認識されているディスクとパーティションを確認します.(ASrock Z87 Extreme3はなんとNTFSを認識するようです.ext4はだめっぽいのに)NVMeデバイス上のパーティションは認識してくれません.

load fs0:\NvmExpressDve.efi のようにドライバをロードします.(fs0はコンピュータの構成によって変わるはずです)

このあと,map -r と打って,NVMeデバイスが認識されているか確認します.パーティションも自動で認識されるはずです.

私はWindowsをブートするために,bcdboot.exeでブートファイルを準備しておきました.diskpartコマンドでお膳立てする必要がありましたので,Windowsインストールディスクのウィザードの途中でNVMeドライバを読み込み,ディスクを認識させました.

無事,EFI Shellでパーティションが認識されたら,fs0:\EFI\Boot\bootx64.efi のようにブートローダーを起動することができます.diskpartでちゃんとドライブ文字やアクティブパーティション等を設定すれば,Windowsをちゃんと起動することが出来ます.(起動時のロゴがおかしいですが)

おわり

Linux環境を起動する場合,カーネルにNVMeドライバを組み込めるので,ブートローダさえ外に置いておけば,UEFIの操作なしに問題なくルートディレクトリとして使うことができます.

Windowsも同様にドライバを組み込めそうですが…よくわかってないです.

調査当初,UEFIのドライバ組み込みは出来ると思ってなかったので,アイデア出しの@baumkuchen_i氏に感謝します.