QEMU(kvm)를 사용하여 EFI 커널을 부팅하는 방법은 무엇입니까?

QEMU(kvm)를 사용하여 EFI 커널을 부팅하는 방법은 무엇입니까?

QEMU(kmv)를 사용하여 EFI 환경을 에뮬레이션하려고 합니다. virtualbox를 Archboot를 사용하여 EFI 모드로 부팅하는 데 15분이 걸립니다.

레거시 BIOS 모드를 사용하면 다음을 사용하여 부팅할 수 있습니다.

root@citsnmaiko-deb:/home/maiko/uefi/ovmf# qemu-system-x86_64 -kernel  ../bzImage -initrd ../rootfs.gz -append "rw root=/dev/ram0  ramdisk_size=40960"

내 사용자 정의 커널 및 파일 시스템에서 작동합니다.

file ../bzImage 
../bzImage: Linux kernel x86 boot executable bzImage, version 3.6.1 (root@citsnmaiko-deb) #4 , RO-rootFS, swap_dev 0x3, Normal VGA

EFI도 지원합니다.

여기에서 다운로드한 EFI 파일로 동일한 작업을 수행하려고 합니다.

wget http://ufpr.dl.sourceforge.net/project/edk2/OVMF/OVMF-X64-r11337-alpha.zip -P ovmf
cd ovmf/
unzip -x OVMF-X64-r11337-alpha.zip
# rename the files for QEMU find them
mv OVMF.fd bios.bin
mv CirrusLogic5446.rom vgabios-cirrus.bin
# start QEMU
root@citsnmaiko-deb:/home/maiko/uefi/ovmf# qemu-system-x86_64 -L .  -kernel  ../bzImage -initrd ../rootfs.gz -append "rw root=/dev/ram0  ramdisk_size=40960" 
Could not open option rom 'linuxboot.bin': No such file or directory
pci_add_option_rom: failed to find romfile "pxe-e1000.bin"

EFI 셸에 갇혀 부팅할 수 없습니다.

QEMU + EFI + 리눅스 커널 + 쉘

최신 Ubuntu 버전을 사용하고 동일한 EFI 환경을 사용하는 경우

root@citsnmaiko-deb:/home/maiko/uefi/ovmf# qemu-system-x86_64 -L . -boot d -cdrom ../ubuntu-12.10-desktop-amd64.iso
pci_add_option_rom: failed to find romfile "pxe-e1000.bin"

...부팅 프로세스가 제대로 작동합니다.

여기에 이미지 설명을 입력하세요.

Ubuntu 부팅 파일을 내 것으로 바꾸려고 시도했지만 그 기능을 완전히 이해하지 못할 수도 있습니다. ISO를 마운트한 후 파일을 교체하는 경우:

mkdir tmp
bsdtar xf ubuntu-12.10-desktop-amd64.iso -C tmp
cp bzImage tmp/casper/vmlinuz
cp rootfs.gz tmp/casper/initrd.lz 
genisoimage -o customUbuntu.iso tmp/
qemu-system-x86_64 -L . -boot d -cdrom customUbuntu.iso 

동일한 EFI 셸이 나타납니다. 나는 할 수있다? initrd.lz와 rootfs.gz는 서로 바꿔서 사용할 수 있나요? bzImage와 vmlinuz는 어떻습니까?

내가 무엇을 놓치고 있나요?

답변1

OVMF는 -boot이후부터 지원합니다.r13683, 그리고 -kernel -append -initrd자기 지원r13923.

  1. 다운로드 OVMF-0.1+r14071-1.1.x86_64.rpm또는 최신 버전.
  2. bios.bin타치에서 추출:rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. QEMU의 펌웨어 매개변수를 지정합니다. ( qemu-kvm -bios ./usr/share/qemu-ovmf/bios/bios.bin -m 1G -cdrom boot.iso테스트 및 생성을 위해 Fedora의 boot.iso를 사용합니다.특별조치)

또한 qemu -kernel -append -initrd커널 3.5, 3.6 및 3.8로 테스트했습니다.


EFI 펌웨어에는 부팅 가능한 ISO 이미지에 대한 형식 및 파일 계층 요구 사항이 있습니다(1) 및 기타 디스크. 수정된 ISO 이미지가 요구 사항을 충족하지 않아 펌웨어가 이를 인식하지 못할 수도 있습니다. EFI 펌웨어에는 실행할 바이너리에 대한 형식 요구 사항도 있으므로 bzImage 또는 커널 이미지를 EFISTUB로 빌드해야 합니다.

수동으로 지정된 매개변수를 사용하여 EFI 셸에서 커널을 시작할 수 있습니다. 예:2. startup.nsh타이핑 시간을 조금 절약하기 위해 하나를 만들 수 있습니다 . 보다 완전한 관리를 위해 부트로더를 사용할 수 있습니다. 당신은 다음을 배워야합니다 :2

EFI 펌웨어는 부팅 옵션을 NVRAM에 저장합니다. QEMU는 현재 NVRAM을 유지하지 않으므로 QEMU가 종료되면 부팅 옵션이 손실됩니다. 부팅 옵션이 없으면 펌웨어는 \EFI\BOOT\BOOTX64.EFI실행을 찾으려고 시도하지만 여기에 없기 때문에 무엇을 부팅해야 할지 모르고 제어권을 사용자에게 맡깁니다. EFI 셸에서 커널을 시작하기 위해 해야 할 일은 파일 시스템에 들어가서 올바른 경로로 이동하고 바이너리를 실행하는 것뿐입니다.

fs0:
    cd EFI\fedora
    grub.efi

또는

vmlinuz.efi ...

OVMF는 EDK2부터 virtio-scsi를 지원합니다.r13867.

답변2

최신 Ubuntu 20.04:

sudo qemu-system-x86_64 -enable-kvm -bios /usr/share/ovmf/OVMF.fd -hda myimage.raw 

초기 Ubuntu 및 기타 Linux의 경우:

cd ~
git clone git://github.com/tianocore/edk2.git
cd edk2
git submodule init
git submodule update --depth=1
make -C BaseTools
. edksetup.sh
vi Conf/target.txt
  ACTIVE_PLATFORM       = MdeModulePkg/MdeModulePkg.dsc 
  TOOL_CHAIN_TAG        = GCC5  # or GCC49 GCC48 ... check ./Conf/tools_def.txt
  TARGET_ARCH           = X64
build
vi Conf/target.txt
  ACTIVE_PLATFORM       = OvmfPkg/OvmfPkgX64.dsc
build
sudo qemu-system-x86_64 -enable-kvm -bios ./Build/OvmfX64/RELEASE_GCC5/FV/OVMF.fd -hda myimage.raw 

설명은 다음에서 수정됨https://wiki.ubuntu.com/UEFI/OVMF그리고https://wiki.ubuntu.com/UEFI/EDK2출판 당시 Ubuntu 20.04에서 테스트되었습니다.

답변3

직접적인 답변은 아니지만 관심을 가질 만한 답변이 없으므로이 xorriso 버그 보고서-- 거기에도 코멘트를 남길 예정인데 간단히 말해서 xorriso-1.2.4 는 다음과 같습니다.업스트림 개정 1044나에게 잘 맞고, 내 하드웨어 스탠드가 완벽하게 맞습니다.이 스크립트(이것은 러시아어로 작성된 위키이지만 스크립트 부분은 충분히 명확해야 합니다. 참고 efiboot.img).

syslinux에서 나온 /usr/lib/syslinux/isohdpfx.bin최신 4.06에는 EFI 부서와 관련된 변경 사항이 있는 것 같습니다.

이것은 또 다른 우물이다(U)EFI에 대한 유용한 지식, 질문에 스크립틀릿을 제공해 주셔서 감사합니다 :)

답변4

qemu-system-x86_64  -kernel xxx.elf -serial /dev/stdout -monitor stdio

관련 정보