非対応なのにNVMeブートすることはできるのか？

## ミッションインポッシブルじゃない？

とあるPCを「HDDにOSがインストールされた状態」から
「SSDにOSがインストールされた状態」に変更するミッションを行いました。
対象となったPCのマザーボードは、「NVMeにインストールしたOS」でブートすることに対応していません。
それなのにやろうとするなんて、無茶です。しかし、やってのけます。メーカーサポート対象外です。

## なぜやるのか？

### ボトルネック

ストレージの動作がボトルネックになっていたからです。
下記はウィンドウズ・エクスペリエンス・インデックス
（WEI : Windows Experience Index）のビフォーアフターです。
今回のミッションの結果を数値化してみました。
### 測定値の変化

```posh:Before
PS $env:userprofile> winsat formal
PS $env:userprofile> Get-CimInstance Win32_WinSat
CPUScore              : 8.7
D3DScore              : 9.9
DiskScore             : 5.5
GraphicsScore         : 6.1
MemoryScore           : 8.7
TimeTaken             : MostRecentAssessment
WinSATAssessmentState : 1
WinSPRLevel           : 6.1
PSComputerName        :
```

```diff_powershell:After
PS $env:userprofile> winsat formal
PS $env:userprofile> Get-CimInstance Win32_WinSat
CPUScore              : 8.7
D3DScore              : 9.9
+ DiskScore             : 8.9
GraphicsScore         : 6.1
MemoryScore           : 8.7
TimeTaken             : MostRecentAssessment
WinSATAssessmentState : 1
WinSPRLevel           : 6.1
PSComputerName        :
```

ご覧の通り、DiskScoreが5.5から8.9となっていることがわかります。
ゲームやCGをすることはないのでGraphicを除外すると、
アフターのほうは、だいたい8.5以上になっています。

### to be ストレスフリー

そして、最も大事なポイントは、
私のようなスマホ世代の人間には8.5以上でないと
ストレスで仕事にならないということです。

精神の安定のためにもやるしかありません。
というかPCのレスポンス速度が上がって、
仕事の隙間時間が１０分の１とか削減できるので、
「SSD化しない」ってのは怠惰だと思ってます。

「人間の思考読度は、書く速度に依存する」って、じっちゃんが言ってました。

## 基本的な概念

「ブート対応しているメディアからブートして、
SSDに居るOS君にバトンタッチする仕組み」を作ります。


## どんな環境なのか？

|項目|値|
| :--: | :--: |
|メーカー|[Dell](https://www.dell.com)|
|型番|Optiplex 3020 SFF|
|CPU|[i3 4150](https://ark.intel.com/content/www/us/en/ark/products/77487/intel-core-i3-4150t-processor-3m-cache-3-00-ghz.html)|
|チップセット|[Intel H81](https://ark.intel.com/content/www/jp/ja/ark/products/75016/intel-h81-chipset.html)|
|SSD|[SP512GBP34A60M28](https://www.silicon-power.com/web/product-P34A60)|
|M.2 PCIe変換|[適当にその辺のアダプタ](https://www.amazon.co.jp/gp/product/B07SJRZ346/ref=ppx_yo_dt_b_search_asin_title)|
|インストールしたいOS|[Windows10](https://www.microsoft.com/ja-jp/software-download/windows10)|

元はSATA接続のHDDにWin7がインストールされていました。
上記のようにSSDを取り付けます。
※HDDの型番は~~どうでもいいので~~記載しません。

PC専門リサイクルショップとかに行くと、
DELLのこの辺の型番がゴロゴロ中古で置いてあります。
法人の一括リース契約などから流れてきた商品でしょう。

## そもそもなぜブート対応していないのか？

「[知ってる？ 知らない!? 最新SSDのキホン](https://akiba-pc.watch.impress.co.jp/docs/dosv/664862.html)」で知ったのですが、
M.2方式SSDでの起動に必要な要件として、

- SSD側にOption ROMを搭載しているか？
- マザー側がPCI Expressからのブートに対応しているか？
    - [チップセットのバージョンが鍵らしいです](https://www.arcbrain.jp/support/NVM_Express/compatible_motherboard/)

という条件のいずれかに対応している必要があるといいます。
ところが、わたしの前においてあるPCはどちらも満たしていませんでした。

## エウレカ！した最初のタイミングは？

長いこと死んだ魚のような目をしていました。
「option ROM ってなんだよ！買う前に教えろよ！」とか思っていました。

改めて様々なSSDを再度調査しました。
「OptionROM」搭載の SSD ってどのくらいあるの？って視点です。
ところが、Amazon や価格ドットコムなどの商品仕様、
さらには製造元の詳細仕様にも「OptionROM」なんて言葉は見つかりません。
どうやらマザーボード側で対処するのが推奨なようです。

ところが、このデバイスドライバの問題を回避するために、
Clover EFI というものをUEFIとWindows10との間に挿む方法を発見したのです。
その瞬間から、水を得たように手が動き出しました。

## これであとはブートするだけ？

手順はたったこれだけです。

1. CloverEFIを用意
1. インストールメディアを通常どおりUEFI形式でブートさせます。
1. そのままWindowsをSSDにインストールします。
1. そして上手いこと***インストール完了直後の自動再起動を止めます***。
1. そして***Clover EFI 経由にてUEFI形式でWindowsを初回ブート***します。
1. それ以降はずっとClover EFI 経由でWindowsをブートさせます。

## Clover EFI を配置

※Clover EFI は ~~[ここ](https://sourceforge.net/projects/cloverefiboot/)~~　[ここ](https://github.com/CloverHackyColor/CloverBootloader/releases/)からISOをダウンロードして、USBメモリやSSD移行前のHDDに焼いてください。ISOを焼く細かい手順は省きます。ISOファイルを更に圧縮していてファイル名も良く変更になりますが、ダウンロードするときのファイル名にISOが含まれるものを何度か解凍するとISOファイルになります。

※2021/07/12 追記 書き忘れてましたが、プロジェクトリポジトリが移動したようですね。[ここ](https://github.com/CloverHackyColor/CloverBootloader)が最新です。

### Rufus で書き込む

画像だけ載せておきます。USBメモリなどのリムーバブルメディアからEFIをブートする場合は[rufus](https://rufus.ie/)で書き込むといいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/15a85877-b2f8-90f1-1945-ab50be879dd4.png)
▼
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/b05a82f1-5675-4186-65bf-54b6c96de6a0.png)
▼
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/f79e4e44-d45f-7b40-74e7-73eaaa1f4702.png)

ESPモードにすると、隠しドライブになるのでオシャレです。ただし、ESPモードは一度取り外すと、Windowsからは見えなくなるので、
初めての場合はトラブルシューティングがしやすいようにイメージモードにすることをオススメします。

また、rufus は [chocolatey](https://chocolatey.org/) によるバージョン管理が簡単です。

### bootdiskutilityで書き込む

HDDからEFIをブートする場合はRufusではなく、[bootdiskutility](http://cvad-mac.narod.ru/index/bootdiskutility_exe/0-5)を使うのも良いかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/57afee81-8a64-0792-d820-324a4c76a519.png)

公式ページもSSL未適用だし心もとないですが、機能は優秀です。
HDDを選んであげると、Format Disk ボタンを押すだけで、CloverISO のダウンロードも、パーティション設定も勝手にやってくれます。

![image](https://user-images.githubusercontent.com/16986253/182006426-6047de9a-c450-4b37-9d10-3aaa8db8ec71.png)

## 古い HDD を Clover EFI Boot 用にするときの Tips

Clover EFIのISOを焼く時、HDD を SATA でつなぐのは手間がかかります。
そのため、[変換ケーブル](https://www.amazon.co.jp/dp/B001K97W56)などを使って**USBドライブとして認識**させています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/91b684c4-b396-88bb-40b2-11e329d8447b.png)

また、ISOを焼くときに、USBやCD/DVDドライブしか認識されないという問題を挙げているブログが散見されます。
これは[**Chocolateyにて26万回のダウンロードを誇る**](https://chocolatey.org/packages?q=rufus) **Rufus** を利用すれば解決します。カタカナ読みすると「ルーファス」だそうです。公式サイトは[ここ](https://rufus.ie)です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/458231c6-4909-f093-f3c9-26f6e2997d46.png)
画像の中で赤枠で囲んであるように、詳細なドライブプロパティがあります。この中に、「**USB接続のHDDを一覧表示**」というチェックボックスがあります。

### ISOを焼くときにもとに戻したい！

RufusなどでISOを焼くと認識しなくなってしまうことがあります。これは、Bootドライブとして認識されているためです。正しい動作なので、HDD や USB メモリが壊れたわけではありません。しかし、焼くと元に戻せないのは困ります。

そんな時は、次の手順を実行します。

1. 管理者権限でcmdかpowershellを開く
1. `diskpart`コマンドでディスク管理CLIに入る
1. `list disk`でディスク一覧を表示し、それっぽいのを探す
1. `select disk`で対象のディスクを選ぶ
1. `clean`コマンドでパーティション削除
1. `exit`でCLIを出る

これで、Rufusから書き込めるようになります。

## 接続方式による違い

ちなみに、SSDをSATA接続しても大して速くならないのでお金がもったいないです。
なぜかというと、SATA の最大速度が 6 Gb/s で激遅だからです。
SSDにするなら、M.2直刺しか、PCIe刺しでNVMe接続しましょう。

もう一つ、M.2でも、切り欠き１つのほうが速いです。切り欠き２つのやつは遅いです。

## 図解

図内のHDDは、USBメモリに置き換えたり、SSDのパーティションに置き換えたりすることができます。
![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/809135e0-3527-a577-679f-3aaedde8c48e.png)

## なぜオフになっている？

さっそく、Windowsをブートしてみましたが、なんと起動しません。
Clover EFI の画面にあるブートディスク一覧のいずれを選んでも、
ずっと画面は真っ黒。そして頭は真っ白。

なんと、この一覧の中にSSDは表示されていなかったのです。
SSDがClover EFIのブートメニューに表示されなかったのは、
Cloverの初期設定で、NVMeドライバーが無効になっていたからでした。

Clover EFIが入ったブート用HDD内のディレクトリ構成は以下のようになっています。

```diff:tree
  /
  ├─??
  ├─EFI
  │  ├─BOOT
  │  └─CLOVER
  │      ├─doc
  │      ├─drivers
  │      │  ├─BIOS
+ │      │  ├─off
+ │      │  └─UEFI
  │      ├─kexts
  │      │  └─Other
  │      │      └─FakeSMC.kext
  │      │          └─Contents
  │      │              ├─MacOS
  │      │              └─_CodeSignature
  │      ├─themes
  │      └─tools
  ├─??
```
ここで注目すべきは、
`/EFI/CLOVER/drivers/off/NvmExpressDxe.efi`です。
これがPCIeによるNVMe SSDブートに必要なのですが、
なぜか「off」というフォルダに入っているではないですか！
これを`/CLOVER/drivers/UEFI/NvmExpressDxe.efi`に移動させます。

※この時、ESPモードでISOを焼いた場合は、普通にexplorerから変更することはできません。CUIか、notepad.exeの「開くダイアログ」などから実行します。アクセス設定を一時的に触るため、後述するESPの項目をご覧ください。

※この作業をMacで行う場合には、[Clover Configurator](https://mackie100projects.altervista.org/download-clover-configurator/) が便利です。

## CLOVER EFIをブートメニューに登録

CLOVER EFIが ブートメニューの一覧に無い！そんな時は、`/EFI/CLOVER/CLOVERX64.efi`をブートメニューに新規登録してあげます。Dellだと、下記のような感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/5b15c045-4052-840e-b4f2-47351080c438.png)
これにより追加される項目と同列に「Windows Boot Manager」があります。~~目障りなので~~使わないので消しておきます。もちろん、残しておいても問題ありません。

## ESPモードでISOを焼いたときの設定変更

ESP(EFI System Partition)モードで焼くと、一般ユーザーからは存在を認知できません。そのため、不特定多数が利用したり、お子様に利用させたりする場合に利用したいモードです。


### 作業前準備

Windows10インストール完了後に`diskmgmt.msc`を開くと、(ディスク?パーティション?)のようになっていて、ボリュームレターがない状態です。このままだとWindows上からは全くアクセスできません。そこで、ボリュームレターを割付してあげます。

::: note
ISOを焼いたPCで設定変更する場合は、この作業は不要です。この部分は、焼き終えたCloverで起動したまま<code>/EFI/CLOVER/config.plist</code>を書き換えたい場合の方法を記しています。
:::

```bat
DiskPart
List Volume
```

と管理者権限のコマンドプロンプトでコマンドを打つと

```bat
Volume  ### Ltr Label Fs Type Size Status Info

-----------------------------------------------------
Volume 0   EFI   FAT32  Partition 256MB 正常 システム
Volume 1   C     FAT32  Partition 256MB 正常 システム
```

となっています。ここで、Volumeの`0`にアクセスしたいので、

```bat
Select Volume 0
```

を実行します。すると、ターゲットがVolumeの`0`になります。
次に、空いているドライブレターを付けます。ここでは`D`を割り当てます。

```bat
Assign Letter=D
```

正常に割り当てられたら、`exit`します。


### 目的の作業

管理者権限でコマンドプロンプトを開き、先ほど設定したドライブレターの位置に移動してみます。

```bat
cd d:
```

ここで上手く移動できれば、

```bat
notepad .\EFI\CLOVER\config.plist
```

とかで設定を編集できたりします。

### 作業後のお掃除

設定作業が終わりましたら、キレイに戻しましょう。

先ほどとほぼ同じ手順ですが、ドライブレターを外します。
ボリュームレターとボリューム番号は適宜置き換えて、下記のコマンドを実行します。

```bat
Diskpart
List Volume
Select Volume 0
Remove Letter=D
List Volume
Exit
```

１回目の`List Volume`と2回目とで、ドライブレターが外れている確認が出来ると思います。

## Warning メッセージの解決

::: note warn
Clover EFI ver. 4000番台の内容です。最新版では解決済みの可能性があります。
筆者は5000番台になってからはエラーメッセージを見ていません。
:::

`/EFI/CLOVER/config.plist`の中身を書き換えます。

### FixHeaders

> Warning : FixHeaders Exist in ACPI and ACPI/DSDT/Fixes. Delete FixHeader from ACPI/DSDT/Fixes.

[ドキュメント](https://sourceforge.net/p/cloverefiboot/wiki/ACPI/#fixheaders:~:text=FixHeaders%20Rev%204427-4429)によれば、`FixHeaders`というキーが重複しているために出るメッセージとのこと。`ACPI/FixHeaders`と`ACPI/DSDT/Fixes/FixHeaders`があり、`ACPI/DSDT/Fixes/FixHeaders`は互換性のために残されているだけなので不要です。そのため、「`ACPI/DSDT/Fixes`側の`FixHeaders`を消した方がいいよ」と注意してくれているそうです。

### ProductName

> Warning : ProductName is not defined whole smbios dict is ignored at line 1194.

[ドキュメント](https://sourceforge.net/p/cloverefiboot/wiki/SMBIOS/#productname)によれば、Cloverはモデル名に応じて残りのパラメーターを自動的に調整するため、設定作業を省略できるとのこと。ただし、Windowsをインストールするので、何でもいいです。とりあえず`#`を消してコメントアウトを解除します。

```diff_xml
- <key>#ProductName</key>
+ <key>ProductName</key>
  <string>iMac13,2</string>
```

デフォルトで`iMac13,2`が設定されていますが、Windowsなので設定は無視されます。何でもいいので、そのまま残します。

## 結果

### ※2020/06/22追記

[CrystalDiskmark](https://crystalmark.info/ja/software/crystaldiskmark/)を使用してベンチマークテストを実施しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/43d83af6-e151-56b5-d097-376a8249d871.png)
※Chromeタブ２０個くらい、VirtualBoxでLinux１つ、リモートデスクトップ接続２つを立ち上げながら測定しました。本来もう少しいいスコアがでると思います。

### ※2021/03/29 追記

同機種PCでまた作業する機会がありましたので、載せておきます。
SSDは[ASX8200PNP-512GT-C](https://www.xpg.com/jp/feature/583/)を使用しています。
Amazonでお買い求めの場合はこちら→https://www.amazon.co.jp/dp/B07MT89VLM
※SSDの性能が持てあまされております。
※アフィリエイトリンクではありません。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/fc73cd55-0eb6-3039-b0a8-820adf2fd9f3.png)

### ※2021/07/13 追記

また作業する機会がありましたので、
型番など載せておきます。
SSD : [ASX8100NP-512GT-C](https://www.amazon.co.jp/dp/B07YNGCZCD)
Adapter : [MHQJRH M.2 NVME SSD to PCIe 3.0 x4](https://www.amazon.co.jp/dp/B0838NGDB9)
CPU : Intel(R) Xeon(R) CPU E5-1620 v2
GPU	NVIDIA Quadro 4000
chipset : Intel(R) C600/X79 series

```posh
 wmic MEMORYCHIP get BankLabel,DeviceLocator,Capacity,Speed
BankLabel  Capacity    DeviceLocator  Speed
           4294967296  DIMM1          1600
           4294967296  DIMM2          1600
```

```posh:After
PS $env:userprofile> winsat formal
PS $env:userprofile> Get-CimInstance Win32_WinSat
CPUScore              : 8.9
D3DScore              : 9.9
DiskScore             : 8.75
GraphicsScore         : 8.2
MemoryScore           : 8.9
TimeTaken             : MostRecentAssessment
WinSATAssessmentState : 1
WinSPRLevel           : 8.2
PSComputerName        :
```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/1d18039e-e660-1f76-1ab5-8b5472fb14df.png)
今回使用したSSDは前回の型落ち品なのですが、シーケンシャルリードで倍以上の速度が出ています。
やはり、CPUとマザボがしっかりしていないと、SSDだけ早くてもモッタイナイかもですね。

## つまずきやすいポイント解説

つまづきポイントのおさらいです。

- BIOSがLeagacyブートのみの場合はCloverEFIのサポート対象外
  - BIOSがUEFIブートに対応している必要がある
- PCIeスロットにSSDを挿してWindowsをブートするとき
  - マザーボードがブート対応しているか確認
  - SSDにoption ROMが載っているか確認
- NVMeでの起動のためにClover EFIを使用するとき
  - NvmExpressDxe.efiがONかどうか確認
- **SSDがClover EFIに認識されるのはWindowsインストール後から！！**
- BIOSでPCIeの現状接続情報にMassStrageってあればたぶん行ける
  - BIOSからは記憶域として認識できるけど、**ブートドライブとしてだけ認識していない状態**
  - CloverEFIやWindowsInstallMediaから認識できればOK

## 参考ページ

[Guide] NVMe-boot without modding your UEFI/BIOS (Clover-EFI bootloader method) | win-raid forum
https://www.win-raid.com/t2375f50-Guide-NVMe-boot-without-modding-your-UEFI-BIOS-Clover-EFI-bootloader-method.html
NVME非対応マザー（？）で改造無しにブートしようとした顛末 | CRES&ROCK3SIDEGUIDE WebLog
https://cresrock.wordpress.com/2017/05/17/nvme-boot_with_nvme-unsupported-uefi/
【誰得】NVMe非対応の環境でNVMe SSDからブートする【魔改造ではない】| 続：低速PC鈍行記。
https://row-thermit.blogspot.com/2019/02/nvmenvme-ssd.html
Boot Disk Utility
http://cvad-mac.narod.ru/index/bootdiskutility_exe/0-5

## 原典

Clover EFI bootloader
https://sourceforge.net/projects/cloverefiboot/
Clover EFI bootloader Wiki
https://sourceforge.net/p/cloverefiboot/wiki/Home/
Clover EFI Github
https://github.com/CloverHackyColor/CloverBootloader

Note : Clover EFI は Hackintosh の界隈で有名らしいです。Clover EFI の次に来るのは、その後輩の [OpenCore](https://github.com/acidanthera/OpenCorePkg) なようです。

## ちなみに

私はUSBメモリを挿しっぱなしにするのは嫌だったので、
もともと装備されていたHDDにClover EFIを配置しました。

Clover EFI が読み込まれるのは起動時なので、
USBメモリよりは起動が遅いかもしれません。
しかしデスクトップPCなので常時起動だから気になりません。

そもそも、マザーボードが新しければ、こんなに苦労しません。

## もうひとつおまけ

SSDはGPT形式にフォーマットしたほうがいいです。
詳細は省きますが、Windowsインストールメディアでのインストール実行中に以下の手順を実行するだけです。

1. Shift+F10でコマンドプロンプト起動
1. `diskpart`コマンド
1. `list disk`でインストール対象のSSDを確認
1. 上で確認したdiskに対して`select disk`
1. `clean`する
1. `convert gpt`する
1. `exit`×２する

参考：[Docs / Windows コマンド / サーバーの役割別のコマンド / diskpart](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/diskpart)

# 関連

https://www.panhage.com/pcie2-nvme-ssd/

https://www.k-pmpstudy.com/entry/2020/03/01/m2ssd

https://maruainfo.com/pcie20-nvme/

# まとめ

それでは、最後まで読んでくださった皆さんに感謝と幸運を。
ステキなSSDライフを満喫できますように！！！！！！！！

::: note warn
<a href="https://support.microsoft.com/en-us/windows/ways-to-install-windows-11-e0edbbfb-cfc5-4011-868b-2ce77ac7c70e">Windwos 11 の登場</a>により、この記事の方法は旨味が無くなりました。Windows 11 に必要なTPM2.0に対応していない CPU が多いです。
:::

**Excelsior!**