ASUS H97I-PlusでのNVMeデバイスからのブート改造

今更ながらにM.2 NVMeとやらを触ってみたのでメモ。

20210710-writer3.JPG

従来のM.2がSATA接続であったのに対して、NVMeでは雑にいうとPCI Expressに直接Flash繋がる構成になって居ると理解。
(昔のC-Busに搭載した、LIM-EMSやIOバンク方式のメモリみたいなものなのですかね?)
OSにドライバがあれば、ストレージデバイスとして利用可能(そりゃそうだ)
OS起動前はBIOS(UEFI)で認識する必要がある。BIOSで、認識・起動できればNVMeから起動させることも出来る。
SATA接続の場合 単純にコネクタが変わって居るだけなので問題が少ないがNVMeの場合は、PCI接続のFlashを認識する必要がある。

従って、マザーボードにM.2 NVMe対応のSSDを載せても、起動できるとは限らない!!!

ということが解りました。

今回は、この仕様と戦ったお話。

環境と目標

環境

  • マザーボード:ASUS H97I-Plus(ITX マザー)
  • M.2 NVMe:KIOXIA KBG40ZNS128G(どこかのマシンから取り去った)

SSDは、2230タイプでした、短かすぎて本来搭載できない長さだが、テスト用途なので、電気的には問題なかろうとテープで止めて無理矢理搭載

現状

  • SATAに繋いだ他のDiskから起動したり、OSインストーラーからは、NVMeを認識できる。 (接続に問題はないと考えられる。)
  • UEFIでドライブとして認識されておらず。ブートドライブに設定出来ない。
  • 最新のFirmware(3602)に更新なども試してみるが、状況変わらず。
  • このMBでは、UEFIが、NVMe SSDを認識出来る機能を持っていない?

目標

  • M.2 NVMeからブートしたい
  • USB Flashや、他のSATAドライブなどを介さずに、直接NVMeからブートしたい。

改変ファームウェア(UEFI)の準備

ネット上を調べて居ると、ファームウェアを改変することで、NVMeからのブートに対応させることが出来る様です。 ここに詳しい手順が書かれています。

https://www.win-raid.com/t871f50-HowTo-Get-full-NVMe-support-for-all-Systems-with-an-AMI-UEFI-BIOS.html

ここも参考にしました。

https://datyotosanpo.blog.fc2.com/blog-entry-175.html?id=ASUS#ASUS

大まかな流れとしては

  • ASUSのBIOSファイル(*.cap)から、UEFIToolsを使ってBIOS本体を取り出す
  • 取り出したファイルをUEFIToolsまたはMMToolsを使ってCSMCOREモジュールに別途ダウンロードしたNVMeブート用のモジュール(NvmExpressDxe_4)を組み込む
  • モジュールを組み込んだファイルを書き出す。
  • 既存のBIOSをIntelFPTを使ってバックアップする。
  • FD44Editorを使いバックアップしたBIOSから、個別情報(UUIDやNICのMACを取り出す)
  • FD44Editorを使い改変したBIOSファイルに、取り出したUUIDとMACアドレスを書き戻して保存する。

ファームウェアの書き込み(失敗)

完成した改変BIOSをマザーボードに書き込めば完成!の筈だったのですが。
通常の書き込みの仕方では、署名されていないためエラーで弾かれます。
前項のURLに、この制限を回避して書き込みを出来る様にする手順が色々と書かれて居るのですが、うまく行きませんでした。足掻いて居るとROMを完全に飛ばしてしまい。マザーボードがブートしない状況になってしまいました。orz

Flashライターを使った直接書き込み(成功)

書き込むBIOSファイルのサイズをみて居ると、きっちり8MB... なんか、Flashんチップに直接書き込めば、動く様な気がしなくもないです。
どうせ壊れたなら、もうちょっと遊んで見ましょうと言う事で、改めてマザーボードを眺めてみます。

Flashチップの特定

MiniPCI Expressスロットの横に、Winbondの25Q64FVSIQというSPIフラッシュのチップを発見。
64Mbit(=8MB)で、サイズも一致します。これに書き込めば復活するのでは?
20210710-flash1.jpg

CH341AというFlashライター

ROMを書くにはROMライターが必要な訳ですが。
手元に転がっていた怪しげなライター(SP200SE)の仕様を確認すると、5V系のみの対応みたいですね。似た様な安価なものはないかと探していたらありました!
CH341Aという製品で、千円ぐらいでamazonで売られてます。これは試してみるしかない?
ちょうど都合の良いことにSOP8のICクリップがセットになったものもありました。これはチャレンジしてみるしか...
20210710-writer2.JPG

書き込み実行

MiniITXマザーで、所狭しと部品が並んでおり、MiniPCIeスロットにクリップが引っかかります。仕方ないのでICクリップ側を少し削ってチップをつかませたのが冒頭の写真です。
書き込みのためには、回路設計にもよりますが、最悪マザーボードからFlashチップを外す覚悟はしてましたが。SPIですし、ひょっとしたら行けてしまうんじゃなかろうかと、強引にクリップで掴んだ状態で書き込みを試みましたが、結論から行くと問題なく書き込めました!

きちんと、再度ブートする様になりました。
BIOS画面でも、NVMeが起動ドライブとして表示される様になりました。
20210710-boot-order.JPG
なんか、ソフトウェアプロテクトをなんとか回避して書き込もうの2〜3日悩みましたが、直接書き込んだ方が一撃で終わるというのが腑に落ちない気がしましたが...

CH341Aで、下記2つのプログラムを使いました。(ドライバとプログラマ)

  • CH341PAR.EXE
  • AsProgrammer_1.4.1.zip

おまけ1

今回のNVMeではなく、追加搭載したSATA接続のSSDの方にWindowsをインストールしようとしたのですが、なぜかWIndowsのUEFIブートローダーですが、UEFIの設定にかかわらず、NVMeにブートローダーを書き込んでしまう始末。
NVMe側のOSのブートローダーを破壊してしまいます。

https://qiita.com/rerymd/items/638a4fcf8f23ce8aab2d

  • 200MB程度のパーティションを作り
  • FAT32でフォーマットし ormat quick fs=fat32 label="ESP"
  • BCDBOOTコマンドでブートローダーを書き込む bcdboot C:\Windows /s P: /f UEFI

という手順で好きなドライブに、ブートローダを書き込める様です。
(はて?どのブートパーティションからブートするかはどこで設定してるのだろう?まぁ、うまく動いてるからよしとしますか・・・)

おまけ2

このCH341というプログラマ ROMの抜き差し用にZIF(Zero Insertion Force)のソケットがついて居るのですが。
これ高いんですよね。1,000円ぐらいした記憶があります。
20210710-writer.jpg
よく1,000円のROMライタに、こんな部品使えるなぁ。と眺めて居るとTEXTOOLのロゴが見えました。一流品じゃないですか! コスト的にあり得ないよね???
20210710-tfxtdol.jpg
よーーく虫眼鏡で見ると。TFXTDOLでした。勝手な空目なので偽物じゃないかも知れないけど。そこまでしなくても良いだろと、久々に笑いました。
このセンス、嫌いじゃないw