QEMU는 UEFI(OVMF)로 부팅할 때 부팅 순서를 따르지 않습니다.

QEMU는 UEFI(OVMF)로 부팅할 때 부팅 순서를 따르지 않습니다.

QEMU를 사용하여 qemu-system-x86_64QEMU가 드라이브와 일부 연결된 가상 CDROM 드라이브 및 플로피 드라이브가 있는 가상 머신을 부팅하도록 하고 싶습니다. "cd/dvd에서 부팅하려면 아무 키나 누르지" 않고도 첫 번째 가상 CDROM 드라이브에서 자동으로 부팅하려면 이 기능이 필요합니다.

CDROM 드라이브를 다음과 같이 지정했습니다.

-drive "file=${WINDOWS_INSTALL_ISO},index=1,media=cdrom"

하지만 해당 매개변수로 무엇을 하든 -boot항상 "cd/dvd에서 즉시 부팅하려면 아무 키나 누르십시오..."라는 메시지가 약 5초 동안 표시된 다음 해당 CD에서 부팅되지 않습니다. 나는 다음과 같은 다양한 것을 시도했습니다.

-boot order=d -boot menu=on

그리고:

-boot d

그리고:

-boot "order=d,menu=on"

또한 시작 색인을 사용해 보았습니다.

-drive "file=${WINDOWS_INSTALL_ISO},index=1,media=cdrom,bootindex=1"

이로 인해 오류가 발생합니다.Block format 'raw' does not support the option 'bootindex'

부팅하려는 CDROM 드라이브에는 사용자 개입 없이 자동으로 설치되도록 구성한 Windows 10 설치 이미지가 포함되어 있습니다. 내 목표는 Windows VM을 자동으로 생성하고 사용자 상호 작용 없이 자동으로 Windows를 설치하는 bash 스크립트를 만드는 것입니다. 따라서 Windows 설치로 자동 부팅하려면 QEMU가 필요합니다.

편집하다:

나는 다음과 같은 동작을 재현했습니다.

sudo qemu-system-x86_64 \
    -smp 4 \
    -m 4G \
    -drive "file=/home/fedora/vm/windows10.iso,index=1,media=cdrom" \
    -boot order=d \
    -drive id=disk0,if=virtio,cache.direct=on,if=virtio,aio=native,format=raw,file=/home/fedora/Projects/misc/MobilePassThrough/vm-files/WindowsVM.img \
    -drive "if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd" \
    -drive "if=pflash,format=raw,file=/home/fedora/vm/WindowsVM_VARS.fd"

BIOS(SeaBIOS) 모드 대신 UEFI(OVMF) 모드에서 부팅을 담당하는 마지막 두 줄을 제거하면 실제로 해당 -boot매개변수가 적용됩니다. 하지만 UEFI 모드에서 가상 머신을 부팅해야 합니다. 그렇지 않으면 소용이 없습니다.

편집 2: 제가 올바르게 이해했다면 UEFI 세계에서는 비휘발성 저장소에 저장된 변수(제 경우에는 "home/fedora/vm/WindowsVM_VARS.fd")에 의해 부팅 순서가 결정됩니다. 이제 부팅이 실패하면 "UEFI 셸"로 들어갈 것 같습니다. 몇 가지 연구 결과, 쉘은 QEMU의 직렬 포트를 통해 노출되는 것으로 나타났으며 이론적으로는 "setvar" 및 "expect"를 통해 변수를 설정하는 것이 가능해야 합니다. 하지만 그 변수의 이름이 무엇인지, 그 값이 어떻게 보일지, 심지어 CD 드라이브를 어떻게 지정하는지조차 모릅니다. 나는 "setvar"와 "expect"가 어떻게 작동하는지조차 모릅니다.

답변1

/usr/share/OVMF/OVMF_VARS.fd의 새 복사본을 사용하여 이러한 매개변수로 QEmu를 시작하면 자동으로 CD가 부팅됩니다.

-drive file=${WINDOWS_INSTALL_ISO},format=raw,if=none,media=cdrom,id=drive-cd1,readonly=on \
-device ahci,id=achi0 \
-device ide-cd,bus=achi0.0,drive=drive-cd1,id=cd1,bootindex=1

(이것들은 스크립트에서 가져온 것입니다.qemu-ovmf-secureboot, Python 스크립트에서 UefiShell.iso를 실행하고 명령을 파이프합니다). 첫 번째 줄은 장치를 추가하고, 두 번째 줄은 어댑터를 추가하며, 세 번째 줄은 장치를 어댑터에 연결합니다.

그러나 Windows 설치 프로그램 자체에서는 "CD 또는 DVD에서 부팅하려면 아무 키나 누르십시오."라는 메시지를 표시하고 시간이 초과되면 부팅을 계속합니다(이로 인해 EFI 셸로 진입하게 됩니다). 이는 원래 컴퓨터를 처음 재부팅할 때 설치가 다시 실행되는 것을 방지하기 위해 수행되었으며 미디어에 autounattend.xml 파일이 있는 경우에도 이 현상이 발생한다고 생각합니다.

문제의Windows는 키를 누르지 않고도 iso 파일을 부팅할 수 있습니다., CD의 디렉터리에 efisys_noprompt.binefisys.bin을 대체할 수 있는 파일이 있다고 언급했습니다. EFI\Microsoft\Boot설치 미디어 구성의 일부로 이 작업을 수행할 수 있습니다.

ISO를 수정하지 않아야 한다는 엄격한 요구 사항이 있는 경우 AutoUnattend.xml 및 EFI 파티션만 포함하는 작은 이미지를 만든 다음 bcdedit를 사용하여 부팅 데이터베이스를 수정하고 EFI\Microsoft\Boot\BCDramdisksdidevice 부트 로더 옵션을 설정하여 다음에서 설치 프로그램을 로드할 수 있습니다. CD(실제로 작동하는지 잘 모르겠습니다. 아직 시도하지 않았습니다.)

-no-reboot설치할 때 QEmu의 옵션을 사용하십시오. 시스템이 재부팅되면 스크립트로 돌아가서 다른 부팅 인덱스를 사용하여 다시 시작할 수 있습니다.

하드 드라이브와 함께 bootindex를 사용하려면 다음과 같이 QEmu에 추가하면 됩니다.

-drive file=${TARGET_IMAGE},format=raw,if=none,media=disk,id=drive-hd1,readonly=off \
-device virtio-scsi-pci,id=scsi0 \
-device scsi-hd,bus=scsi0.0,drive=drive-hd1,id=hd1,bootindex=2

(이 어댑터는 물론 필요합니다.가상 IORedHat 드라이버가 설치됨)

답변2

나는 Edit2에 대한 당신의 조언을 따랐고 이것이 내가 찾은 것입니다.

실제로 -boot [order=drives][,once=drives] ...옵션은 BIOS/레거시 부팅에만 적용됩니다. 확인해보면QEMU 문서이 옵션에서는 EFI에 대한 설명이 없음을 알 수 있습니다.

QEMU에서 EFI 부팅 동작을 변경하려면 이 파일을 편집해야 합니다. VM_VARS.fd제가 올바르게 이해한 경우 이 파일은 EFI 표준에 지정된 부팅 매개변수가 포함된 플래시 SPI 메모리와 동일합니다. 직접 편집 할 수도 있지만 VM_VARS.fd솔직히 그 방법을 살펴보지는 않았습니다. 대신 UEFI Shell을 사용하고 있습니다. 내가 취한 단계는 다음과 같습니다.

1) 기본 구성을 복사합니다.

`$ cp /usr/share/OVMF/OVMF_VARS.fd ~/my_vars.fd`

2) QEMU를 실행하고 UEFI 셸에 액세스합니다.

내 경우에는 SATA 장치에서 부팅하고 싶기 때문에 -drive id=disk ...다음 설정은 내 설정에만 적용되므로 필요한 대로 변경해야 합니다.

sudo qemu-system-x86_64 \
          -cpu host --enable-kvm \
          -drive "if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd" \
          -drive "if=pflash,format=raw,file=~/my_vars.fd" \ 
          \
          -drive id=disk,file=fat:rw:rootfs,if=none \
          -device ich9-ahci,id=ahci \
          -device ide-drive,drive=disk,bus=ahci.0 \
          -nographic \
          -no-reboot \

UEFI Shell로 돌아갈 때까지 기다립니다. 처음에 네트워크를 통해 부팅을 시도하는 경우 몇 분 정도 걸릴 수 있습니다. 당신은 여기에서 끝날 것입니다 :

UEFI Interactive Shell v2.2
EDK II
UEFI v2.70 (EDK II, 0x00010000)
Mapping table
      FS0: Alias(s):HD1a65535a1:;BLK3:
          PciRoot(0x0)/Pci(0x4,0x0)/Sata(0x0,0xFFFF,0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)
     BLK0: Alias(s):
          PciRoot(0x0)/Pci(0x1,0x0)/Floppy(0x0)
     BLK1: Alias(s):
          PciRoot(0x0)/Pci(0x1,0x0)/Floppy(0x1)
     BLK2: Alias(s):
          PciRoot(0x0)/Pci(0x4,0x0)/Sata(0x0,0xFFFF,0x0)

Press ESC in 1 seconds to skip startup.nsh or any other key to continue.
Shell> 

이것을 참고하시면 됩니다광범위한 목록EFI 셸 명령 또는 기타 UEFI 문서. 나는 이것을 찾았다기사Arch는 시작 항목을 추가, 삭제 및 이동하는 방법을 보여 주므로 매우 유용합니다.

3) 시작 항목을 수정합니다. 다음과 같이 실행할 수 있습니다.

Shell> bcfg boot add 0 FS0:\EFI\boot\BOOT_X64.efi "my_boot"

분해:

bcfg boot add- 새로운 시작 항목을 추가합니다.

0- 삽입할 위치(0이 첫 번째임)

FS0:\EFI\boot\BOOT_X64.efi- [device_mapping]: [경로/to/efi/payload/in/device]. map매핑을 나열하려면 이 명령을 사용합니다 . FS0은 내 SATA 장치입니다.

"my_boot"- 귀하의 항목에 대한 별칭입니다.

그게 다야. 수정사항은 에 저장됩니다 my_vars.fd. 이후의 모든 QEMU 호출에 이를 추가하는 것을 잊지 마세요.

답변3

게스트에서 CD-ROM/DVD-ROM을 수동으로 부팅하면 도움이 될 수 있습니다.

  • TianoCore 시작 화면이 나타날 때까지 기다립니다.
  • ESC 키를 누르세요
  • 부팅 관리자 옵션을 사용하여 DVD-ROM에서 부팅

답변4

~에 따르면fedoraproject.org/wikiUEFI 셸로 부팅하려면 "UefiShell.iso"가 필요합니다.

OVMF에는 SecureBoot 키가 설치되어 있지 않으므로 MS 인증 UEFI 컴퓨터와 함께 제공되는 키를 모방하기 위해 일부 키를 설치해야 합니다. 이제 OVMF는 기본 키 세트를 설정하는 데 필요한 바이너리와 함께 제공됩니다. 가장 쉬운 방법은 /usr/share/edk2/ovmf/UefiShell.iso에 제공되는 UefiShell.iso를 사용하는 것입니다. 이 파일을 CD-ROM 이미지로 사용하여 UEFI 셸로 부팅해야 하는 가상 머신을 부팅하세요. 프롬프트를 따르십시오.

관련 정보