UEFIファームウェアが付属しているDellOptiPlex 9010というコンピューターを使用していますが、PCI-ExpressNVMeデバイスからの起動はサポートされていません。
[〜#〜] duet [〜#〜] を使用してこれを回避し、USBスティック上にEFIブートパーティションを作成します。このパーティションにはNVMeドライバーがロードされ、実行されます。 OSのEFIブートプログラム。
これを行うためのコマンドは現在手動で入力されています。プロセスは次のとおりです。
EFI Shell version 2.31 [4.653]
_)map
コマンドは、DUET USBスティックが_fs0:
_に自動的にマウントされることを示しています)load fs0:\EFI\Drivers\NvmExpressDxe-64.efi
_map -r
_を使用してボリュームマッピングの更新をトリガーします。このコマンドは問題なく正常に完了します。fs1:
_として表示されることもあれば、_fs0:
_として表示されることもあります)fs1:\EFI\Boot\Bootx64.efi
_コマンドを_startup.nsh
_スクリプト(DOSの_autoexec.bat
_に相当するEFI)内に配置することにより、これを自動化しようとしました。
私のスクリプトはこれです:
_echo Step 1
load fs0:\EFI\Drivers\NvmExpressDxe-64.efi
echo Step 2
map -r
echo Step 3
fs0:
echo Step 4
fs0:\EFI\Boot\Bootx64.efi
echo Step 5
_
(このスクリプトは、_fs0:
_の代わりに_fs1:
_を使用します。これは、_startup.nsh
_が実行されると、NVMeドライブが_fs0:
_に再マップされるためですが、コマンドをインタラクティブに実行すると、代わりに_fs1:
_。なぜ、どのようにこれが起こるのかわかりません)。
起動してシェルに_startup.nsh
_を実行させると、次の出力が得られます。
_startup.nsh> Step 1
startup.nsh> load fs0:\EFI\Drivers\NvmExpressDxe-64.efi
load: Image fs0:\EFI\Drivers\NvmExpressDxe-64.efi loaded at D7C3F000 - Success
startup.nsh> Step 2
startup.nsh> map -r
Device mapping table
fs0 :PciRoot(0x0)/Pci(0x1c,0x4)/...
fs1 :PciRoot(0x0)/Pci(0x1c,0x4)/...
blk0 :PciRoot(0x0)/Pci(0x1c,0x4)/...
...
Shell: Cannot read from file - No Media
Shell> _
_
したがって、_map -r
_が_startup.nsh
_内から実行されると、実行されますが、「ファイルから読み取ることができません-メディアがありません」エラーで失敗し、スクリプトの残りの部分の実行が中止されます( _echo Step 3
_出力)、ただし、手動で_fs0:\EFI\Boot\Bootx64.efi
_コマンドを入力すると、Windowsは正常にロードされます。
EFIシェルコマンドのドキュメントを確認しましたが、try
、_on error resume next
_、_on error goto :label
_のようなコマンドが見当たらないため、スクリプトは失敗する運命にあります。
map -r
が起動スクリプトを壊していることを確認できます。
これは、再マッピングによってスクリプトの場所が変更され、シェルが次に実行するコマンドを読み取れないために発生します。これは、EFIシェルモードを変更し、マッピングの更新方法を使用することで修正できます。
つまり、map -r
の代わりに、次のことを試してください。
connect -r
set -v efishellmode 1.1.2
map -u
私見、あなたのアプローチは非常に複雑です。コンピューターの組み込みEFIのCSMを使用して、外部ディスクから2番目のEFI実装を実行し、2番目のEFI実装にEFIドライバーをロードしています。私にはいくつかの選択肢があります。
とはいえ、あなたの直接の質問に対する答えはわかりません。これは明らかに、新しいドライバーをロードしたときにデバイスが再マッピングされ、シェルから「ラグが引き出される」ことが原因です。