จะบูตเคอร์เนล EFI โดยใช้ QEMU (kvm) ได้อย่างไร?


21

ฉันพยายามจำลองสภาพแวดล้อม EFI โดยใช้ QEMU (kmv); virtualbox ใช้เวลา 15 นาทีในการบูตในโหมด EFI โดยใช้ archboot

การใช้โหมด 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 + LINUX KERNEL + SHELL

ถ้าฉันใช้ 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 ล่ะ?

ฉันพลาดอะไรไป

คำตอบ:


21

สนับสนุน 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(ทดสอบด้วย boot.iso ของ Fedora ที่สร้างด้วยมาตรการพิเศษ )

ฉันยังทดสอบqemu -kernel -append -initrdกับเคอร์เนล 3.5, 3.6 และ 3.8


เฟิร์มแวร์ของ EFI มีข้อกำหนดรูปแบบและลำดับชั้นไฟล์สำหรับอิมเมจ ISO ที่สามารถบูตได้ ( 1 ) และอื่น ๆ สำหรับดิสก์ อิมเมจ ISO ที่คุณแก้ไขอาจไม่ตรงตามข้อกำหนดดังนั้นเฟิร์มแวร์จึงไม่รู้จัก เฟิร์มแวร์ของ EFI ยังมีข้อกำหนดรูปแบบสำหรับไบนารีที่จะดำเนินการดังนั้น bzImage ของคุณหรือภาพเคอร์เนลอะไรก็ตามที่ต้องสร้างด้วย EFISTUB

คุณสามารถบูตเคอร์เนลจากเปลือก EFI พร้อมระบุพารามิเตอร์ด้วยตนเอง ตัวอย่าง: 2 . คุณสามารถสร้าง a startup.nshเพื่อบันทึกการพิมพ์เพียงเล็กน้อย คุณสามารถใช้ bootloaders เพื่อการจัดการที่สมบูรณ์ยิ่งขึ้น คุณต้องเรียนรู้สิ่งเหล่านี้: 2

เฟิร์มแวร์ของ EFI บันทึกตัวเลือกการบูตใน NVRAM ขณะนี้ QEMU ไม่รักษา NVRAM ดังนั้นตัวเลือกการบูตจะหายไปเมื่อคุณปิด QEMU หากไม่มีตัวเลือกการบูตเฟิร์มแวร์จะพยายามค้นหา\EFI\BOOT\BOOTX64.EFIเพื่อดำเนินการ แต่ไม่ได้อยู่ที่นี่ดังนั้นจึงไม่รู้ว่าจะบูตและปล่อยให้คุณควบคุมอย่างไร สิ่งที่คุณต้องทำเพื่อบู๊ตเคอร์เนลในเชลล์ EFI เพียงแค่ป้อนระบบไฟล์นำทางไปยังพา ธ ที่เหมาะสมและรันไบนารี

fs0:
    cd EFI\fedora
    grub.efi

หรือ

vmlinuz.efi ...

OVMF สนับสนุน virtio-SCSI ตั้งแต่ EDK2 r13867


ลิงก์ OVFM นั้นตาย
jcoffland

@jcoffland ยังไม่ตายจริงๆไดเรกทอรีต่าง ๆ สามารถเรียกดูได้เฉพาะโฟลเดอร์ที่มีรุ่นเก่าที่ถูกลบไปแล้ว ไปที่download.opensuse.org/repositories/home:/jejb1:/UEFIและเลือกรุ่นล่าสุดที่คุณจะพบว่าตรงกับรูปแบบจากลิงค์ดั้งเดิม
LiveWireBT

1
ใน Ubuntu สมัยใหม่คุณสามารถทำได้apt install ovmfแล้วkvm -bios OVMF.fd ...
Tobia


1

ไม่ใช่คำตอบโดยตรง แต่เนื่องจากไม่มีคุณอาจสนใจรายงาน xorriso นี้ - ฉันจะแสดงความคิดเห็นที่นั่นด้วยเช่นกัน แต่ในระยะสั้น xorriso-1.2.4 ด้วยการแก้ไขอัปสตรีม1044 ใช้งานได้ดีสำหรับฉันและฮาร์ดแวร์ของฉันตั้งอยู่กับ ว่าสคริปต์นี้ (มันเป็นวิกิพีเดียพูดรัสเซีย แต่เป็นส่วนหนึ่งสคริปต์ที่ควรจะชัดเจนพอที่จะให้ความสนใจefiboot.img)

โปรดทราบว่า/usr/lib/syslinux/isohdpfx.binมาจาก syslinux และดูเหมือนว่าล่าสุด 4.06 มีการเปลี่ยนแปลงที่เกี่ยวข้องในแผนก EFI

นี่คือหนึ่งเดียวของความรู้ที่เป็นประโยชน์ใน (U) EFIและขอขอบคุณสำหรับคริปตในคำถามได้เป็นอย่างดี :)


1

การใช้สคริปต์นี้ , cdเป็นต้นไม้มาเคอร์เนลและเรียกใช้:

runlinux -- -bios ~/path/to/OVMF.fd

ที่OVMF.fdสกัดจากhttps://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.zip/download

สคริปต์สร้างระบบแฟ้มน้อยที่สุดด้วย BusyBox, รวบรวมเมล็ดและทำงานใน QEMU ด้วย:

qemu-system-x86_64 -enable-kvm -kernel bzImage \
                   -initrd ../rootfs.gz -bios ~/path/to/OVMF.fd

ตอนนี้เราสามารถตรวจสอบว่าถูกใช้ UEFI จาก QEMU ภายในตามที่กล่าวไว้ในโพสต์นี้ :

ls /sys/firmware/efi

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

4
สวัสดีและยินดีต้อนรับสู่เว็บไซต์ โปรดเพิ่มรายละเอียดในคำตอบของคุณ คำสั่งนี้คืออะไร? มันควรจะทำงานที่ไหน มันควรจะถูกเพิ่มในการกำหนดค่า bootlaoder หรือไม่? อย่างไร? ที่ไหน? ถ้าคุณไม่อธิบายว่านี่คืออะไรฉันกลัวว่ามันจะไม่ใช่คำตอบที่เป็นประโยชน์
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.