EFI 시작 셸 스크립트의 오류 처리 셸을로드합니다 ( EFI Shell

UEFI 펌웨어와 함께 제공되는 Dell OptiPlex 9010 컴퓨터를 사용하고 있지만 PCI-Express NVMe 장치에서 부팅을 지원하지 않습니다.

DUET 을 사용하여 USB 스틱에 EFI 부팅 파티션을 생성하고로드 된 NVMe 드라이버가있는 OS의 EFI 부팅 프로그램을 실행 하여이 문제를 해결했습니다 .

이를 수행하는 명령은 현재 수동으로 입력되었습니다. 과정은 다음과 같습니다.

  1. 컴퓨터가 꺼져 있습니다.
  2. DUET USB 스틱을 USB 포트에 꽂습니다 (항상 항상 플러그를 꽂아 둡니다)
  3. 컴퓨터를 켜십시오
  4. (UEFI는 항상 해당 USB 스틱에서 먼저 부팅하고 내가 연결 한 다른 드라이브의 부팅 로더는 무시하도록 구성되어 있습니다)
  5. DUET USB 스틱은 EFI 셸을로드합니다 ( EFI Shell version 2.31 [4.653])
  6. (이 map명령은 DUET USB 스틱이 자동으로에 장착되어 있음을 나타냅니다 fs0:)
  7. NVMe 드라이버를로드합니다 : load fs0:\EFI\Drivers\NvmExpressDxe-64.efi
  8. 로 볼륨 매핑 새로 고침을 트리거하면 map -r이 명령이 문제없이 성공적으로 완료됩니다.
  9. (이제 때때로 NVMe 볼륨이 나열 fs1:되지만 때때로 fs0:)
  10. 다음을 실행하여 Windows로 부팅합니다. fs1:\EFI\Boot\Bootx64.efi
  11. Windows 시작 화면이 나타나고 컴퓨터가 Windows 부팅을 재개합니다

명령을 startup.nsh스크립트 (DOS의 EFI에 해당) 에 넣어서이를 자동화하려고했습니다 autoexec.bat.

내 스크립트는 다음과 같습니다

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

(이 스크립트는 실행될 때 NVMe 드라이브가에 다시 매핑 되기 때문에 fs0:대신에 사용 되지만 대신 대화식으로 명령을 실행할 때는에 매핑됩니다 . 왜 또는 어떻게 발생하는지 모르겠습니다).fs1:startup.nshfs0: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

답변

IMHO, 귀하의 접근 방식은 지나치게 복잡합니다. 컴퓨터의 내장 EFI CSM을 사용하여 외부 디스크에서 두 번째 EFI 구현을 실행 한 다음 두 번째 EFI 구현에서 EFI 드라이버를로드하고 있습니다. 몇 가지 대안이 나에게 발생합니다.

  • 컴퓨터의 기본 EFI에서 EFI 셸을 실행하고 거기서 스크립트를 실행하여 EFI 드라이버를로드 할 수 있습니다. 그러면 CSM과 두 번째 EFI 구현이 중단되어 부팅 시간이 단축되고 안정성이 향상됩니다. 즉,이 옵션은 현재보고있는 것과 동일한 문제를 일으킬 가능성이 높습니다.
  • 컴퓨터의 기본 EFI에서 rEFInd 를 실행하고 rEFInd 가 자동으로로드되는 드라이버로 드라이버를 구성 할 수 있습니다. 이것에 대한 큰주의는 rEFInd의 드라이버 로딩 코드는 파일 시스템에 대해 잘 테스트되었지만 다른 유형의 드라이버로는 테스트되지 않았으므로 드라이버를로드 할 것이라고 약속 할 수 없습니다. 또한 드라이버를로드 한 경우에도 이미 발생한 것과 유사한 문제가 발생할 수 있습니다.
  • 기본 EFI에서 읽을 수있는 미디어에 부트 로더 및 필요한 경우 OS 커널을 배치 할 수 있으므로 NVMe 드라이버가 필요하지 않습니다. 이미 DUET에 USB 플래시 드라이브를 사용하고 있으므로 사용할 수 있습니다. 또는 컴퓨터가 다른 유형의 하드 디스크를 지원하므로 기본 스토리지 유형이 아닌 경우에도 하드 디스크 중 하나를 사용할 수 있습니다. Windows 전문가가 아니기 때문에 Windows를 배치하는 방법을 구체적으로 제안 할 수는 없습니다.

즉, 귀하의 직접적인 질문에 대한 답변을 모르겠습니다. 새 드라이버를로드 할 때 장치에서 다시 매핑되기 때문에 발생합니다. 이는 쉘에서 “러그를 당깁니다”.