Làm cách nào để khởi động kernel EFI bằng QEMU (kvm)?


21

Tôi đang cố gắng mô phỏng môi trường EFI bằng QEMU (kmv); virtualbox mất 15 phút để khởi động ở chế độ EFI bằng archboot.

Sử dụng chế độ BIOS kế thừa, tôi có thể khởi động bằng lệnh này:

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

và nó hoạt động với hệ thống tập tin và kernel tùy chỉnh của tôi.

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

nó cũng có hỗ trợ EFI.

Tôi đang cố gắng làm tương tự với các tệp EFI mà tôi đã tải xuống từ đây

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"

Và tôi bị rơi trong một vỏ EFI, không cho phép khởi động.

QEMU + EFI + LINUX KernEL + SHELL

Nếu tôi sử dụng bản phát hành Ubuntu mới nhất sử dụng cùng môi trường 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"

... quá trình khởi động hoạt động tốt.

nhập mô tả hình ảnh ở đây

Tôi đã cố gắng thay thế các tệp khởi động Ubuntu bằng tệp của tôi nhưng có lẽ tôi không hoàn toàn hiểu chức năng của nó. Khi tôi chỉ thay thế các tệp sau khi gắn 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 

Shell EFI tương tự xuất hiện. Là nó ổn? initrd.lz và rootfs.gz có thể hoán đổi cho nhau phải không? Làm thế nào về bzImage và vmlinuz?

Tôi đang thiếu gì?

Câu trả lời:


21

OVMF hỗ trợ -boottừ r13683 và hỗ trợ -kernel -append -initrdkể từ r13923 .

  1. Tải về OVMF-0.1+r14071-1.1.x86_64.rpm hoặc phiên bản mới hơn.
  2. Trích xuất bios.bintừ vòng / phút:rpm2cpio OVMF-0.1+r14071-1.1.x86_64.rpm | cpio -idmv
  3. Chỉ định tham số phần sụn cho QEMU: qemu-kvm -bios ./usr/share/qemu-ovmf/bios/bios.bin -m 1G -cdrom boot.iso(Đã thử nghiệm với boot.iso của Fedora được tạo bằng các biện pháp đặc biệt )

Tôi cũng đã thử nghiệm qemu -kernel -append -initrdvới kernel 3.5, 3.6 và 3.8.


Phần sụn EFI có các yêu cầu phân cấp tệp và định dạng để hình ảnh ISO có khả năng khởi động ( 1 ) và khác cho các đĩa. Hình ảnh ISO được sửa đổi của bạn có thể không đáp ứng các yêu cầu nên phần sụn không nhận ra nó. Phần sụn EFI cũng có các yêu cầu định dạng để nhị phân thực thi, do đó bzImage của bạn hoặc bất kỳ hình ảnh hạt nhân nào cần được xây dựng với EFISTUB.

Bạn có thể khởi động kernel từ EFI shell với các tham số được chỉ định thủ công. Ví dụ: 2 . Bạn có thể tạo một startup.nshđể tiết kiệm một chút gõ. Bạn có thể sử dụng bộ nạp khởi động để có sự quản lý hoàn chỉnh hơn. Bạn cần học những điều sau: 2

Phần mềm EFI lưu các tùy chọn khởi động trong NVRAM. QEMU hiện không bảo tồn NVRAM, vì vậy các tùy chọn khởi động sẽ bị mất khi bạn đóng QEMU. Không có tùy chọn khởi động, hãng cố gắng tìm \EFI\BOOT\BOOTX64.EFIcách thực thi nhưng không có ở đây, vì vậy nó không biết phải khởi động gì và để lại quyền kiểm soát cho bạn. Những gì bạn cần làm để khởi động kernel trong EFI shell chỉ là nhập một hệ thống tập tin, điều hướng đến một đường dẫn thích hợp và thực thi nhị phân.

fs0:
    cd EFI\fedora
    grub.efi

hoặc là

vmlinuz.efi ...

OVMF hỗ trợ virtio-scsi kể từ EDK2 r13867 .


Liên kết OVFM đã chết.
jcoffland

@jcoffland Nó không thực sự chết, các thư mục có thể duyệt được chỉ là thư mục với bản phát hành lỗi thời đã bị xóa. Truy cập download.opensuse.org/repos khu / home: / jejb1: /UEFI và chọn bản phát hành mới nhất mà bạn có thể tìm thấy phù hợp với mẫu từ liên kết ban đầu.
LiveWireBT

1
Trong Ubuntu hiện đại, bạn có thể apt install ovmfvà sau đókvm -bios OVMF.fd ...
Tobia


1

Không phải là câu trả lời trực tiếp nhưng vì không có ai bạn có thể quan tâm đến lỗi xorriso này - tôi cũng sẽ bình luận ở đó, nhưng tóm lại, xorriso-1.2.4 với phiên bản ngược dòng 1044 hoạt động tốt với tôi và phần cứng của tôi với chính xác kịch bản này (nó là một wiki nói tiếng Nga nhưng phần kịch bản phải đủ rõ ràng; chú ý đến efiboot.img).

Lưu ý rằng /usr/lib/syslinux/isohdpfx.binxuất phát từ syslinux và có vẻ như 4.06 mới nhất có những thay đổi liên quan trong bộ phận EFI.

Đây cũng là một kiến thức hữu ích khác về (U) EFI , và cũng cảm ơn bạn về scriptlet trong câu hỏi :)


1

Sử dụng tập lệnh này , cdvào cây nguồn kernel và chạy:

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

nơi OVMF.fdđược trích xuất từ https://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.zip/doad

Kịch bản tạo một hệ thống tệp tối thiểu với BusyBox, biên dịch kernel và chạy nó trong QEMU với:

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

Bây giờ chúng tôi có thể xác minh rằng UEFI đã được sử dụng từ bên trong QEMU như được đề cập trong bài đăng này :

ls /sys/firmware/efi

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

4
Xin chào và chào mừng đến với trang web. Vui lòng thêm một số chi tiết để trả lời của bạn. Lệnh này là gì? Nó nên được chạy ở đâu? Có nên thêm nó vào cấu hình bootlaoder không? Làm sao? Ở đâu? Trừ khi bạn giải thích đây là gì, tôi sợ đó không phải là một câu trả lời hữu ích.
terdon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.