Bug 781562
Summary: | [RFE] Support for qemu PCI romfile option | ||
---|---|---|---|
Product: | Red Hat Enterprise Linux 6 | Reporter: | Alex Williamson <alex.williamson> |
Component: | libvirt | Assignee: | Laine Stump <laine> |
Status: | CLOSED ERRATA | QA Contact: | Virtualization Bugs <virt-bugs> |
Severity: | medium | Docs Contact: | |
Priority: | medium | ||
Version: | 6.3 | CC: | acathrow, ajia, dallan, dyuan, juzhang, mzhan, rwu, weizhan |
Target Milestone: | rc | Keywords: | FutureFeature |
Target Release: | --- | ||
Hardware: | Unspecified | ||
OS: | Unspecified | ||
Whiteboard: | |||
Fixed In Version: | libvirt-0.9.10-1.el6 | Doc Type: | Enhancement |
Doc Text: |
Along with the "rombar" option that controls whether or not a boot rom is made visible to the guest, qemu also has a "romfile" option that allows specifying a binary file to present as the ROM BIOS of any emulated or passthrough PCI device. This patch adds support for specifying romfile to both passthrough PCI devices, and emulated network devices that attach to the guest's PCI bus (just about everything other than ne2k_isa).
One example of the usefulness of this option is described in the bugzilla report: 82576 sriov network adapters don't provide a ROM BIOS for the cards virtual functions (VF), but an image of such a ROM is available, and with this ROM visible to the guest, it can PXE boot.
In libvirt's xml, the new option is configured like this:
<hostdev>
...
<rom file='/etc/fake/boot.bin'/>
...
</hostdev
(similarly for <interface>).
|
Story Points: | --- |
Clone Of: | Environment: | ||
Last Closed: | 2012-06-20 06:46:30 UTC | Type: | --- |
Regression: | --- | Mount Type: | --- |
Documentation: | --- | CRM: | |
Verified Versions: | Category: | --- | |
oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
Cloudforms Team: | --- | Target Upstream Version: | |
Embargoed: |
Description
Alex Williamson
2012-01-13 18:08:10 UTC
I just posted patches upstream which should satisfy this: https://www.redhat.com/archives/libvir-list/2012-January/msg01031.html If you're up to doing a build yourself, please give them a test. The above patches have been committed upstream, so they will be in libvirt-0.9.10: commit 3801831cdf64cb040047b579d02942fe34ff31b5 Author: Laine Stump <laine> Date: Wed Jan 25 11:20:49 2012 -0500 qemu: add "romfile" support to specify device boot ROM commit 3284ac046fedc5b21c2bd153aa0f621a19a52e96 Author: Laine Stump <laine> Date: Tue Jan 24 19:54:12 2012 -0500 qemu: (and conf) support rombar for network devices commit c01ba1a48f54e99e60c8cde4299aa21e908ba323 Author: Laine Stump <laine> Date: Tue Jan 24 14:11:05 2012 -0500 conf: relocate rombar and boot order parse/format commit 159f4d0b30ca9916a1b541a9ebcf560ffeca5330 Author: Laine Stump <laine> Date: Tue Jan 24 12:53:59 2012 -0500 conf: put all guest-related HostdevDef data in one object The SRIOV is just a special PCI device, I tested the bug on a normal PCI device instead: 1. virsh edit the following xml into guest configuration: <interface type='user'> <mac address='52:54:00:24:a5:9f'/> <model type='virtio'/> <rom file='/etc/fake/bootrom.bin'/> </interface> <interface type='user'> <mac address='52:54:00:63:79:db'/> <model type='virtio'/> <rom bar='on'/> </interface> <interface type='user'> <mac address='52:54:00:ac:b5:23'/> <model type='virtio'/> <rom bar='off'/> </interface> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/> </source> <rom file='/etc/fake/bootrom.bin'/> </hostdev> Notes: remember to replace your NICs address. 2. create a fake rom file # mkdir /etc/fake && touch /etc/fake/bootrom.bin 3. start the guest # virsh start <domain> 4. check qemu-kvm cmdline # ps -ef|grep qemu-kvm qemu 16159 1 11 15:25 ? 00:00:01 /usr/libexec/qemu-kvm -S -M rhel6.2.0 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -name foo -uuid d93dae01-6865-d193-39f3-c62773b83417 -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/foo.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/var/lib/libvirt/images/foo.qcow2,if=none,id=drive-virtio-disk0,format=qcow2 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -netdev tap,fd=22,id=hostnet0,vhost=on,vhostfd=23 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:7e:ef:a6,bus=pci.0,addr=0x3 -netdev user,id=hostnet1 -device virtio-net-pci,netdev=hostnet1,id=net1,mac=52:54:00:24:a5:9f,bus=pci.0,addr=0x7,romfile=/etc/fake/bootrom.bin -netdev user,id=hostnet2 -device virtio-net-pci,netdev=hostnet2,id=net2,mac=52:54:00:63:79:db,bus=pci.0,addr=0x9,rombar=1 -netdev user,id=hostnet3 -device virtio-net-pci,netdev=hostnet3,id=net3,mac=52:54:00:ac:b5:23,bus=pci.0,addr=0xa,rombar=0 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 127.0.0.1:0 -k en-us -vga cirrus -device AC97,id=sound0,bus=pci.0,addr=0x4 -device pci-assign,host=00:19.0,id=hostdev0,configfd=24,bus=pci.0,addr=0x8,romfile=/etc/fake/bootrom.bin -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 Notes, rom bar=off ==> rombar=0, rom bar=on ==> rombar=1, rom file=/etc/fake/bootrom.bin ==> romfile=/etc/fake/bootrom.bin. 5. separately to check rom bar=on|off case for PCI device: 1) virsh edit the following xml into a new guest configuration <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/> </source> <rom bar='off'/> </hostdev> 2) start the new guest # virsh start <new domain> 3) check qemu-kvm cmdline # ps -ef|grep qemu-kvm qemu 13531 1 73 15:03 ? 00:00:11 /usr/libexec/qemu-kvm -S -M rhel6.2.0 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -name foo -uuid d93dae01-6865-d193-39f3-c62773b83417 -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/foo.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/var/lib/libvirt/images/foo.qcow2,if=none,id=drive-virtio-disk0,format=qcow2 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -netdev tap,fd=22,id=hostnet0,vhost=on,vhostfd=23 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:7e:ef:a6,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 127.0.0.1:0 -k en-us -vga cirrus -device AC97,id=sound0,bus=pci.0,addr=0x4 -device pci-assign,host=00:19.0,id=hostdev0,configfd=24,bus=pci.0,addr=0x7,rombar=0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 repeat 1)-3) and replace 'off' to 'on'. Notes, rom bar=off ==> rombar=0, rom bar=on ==> rombar=1 I can see romfile argument is correctly passed from libvirt to qemu-kvm on libvirt-0.9.10-1.el6.x86_64, so the bug has been verified. I try with 82576 nic and test with following steps 1. Start guest with ... <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address bus='0x03' slot='0x10' function='0x05'/> </source> <boot order='1'/> <rom bar='on' file='/usr/share/seabios/ipxe-808610ca.rom'/> </hostdev> ... Then the guest may booting from ROM, entry the ipxe start process 2. Start guest with ... <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address bus='0x03' slot='0x10' function='0x05'/> </source> <boot order='1'/> <rom bar='off' file='/usr/share/seabios/ipxe-808610ca.rom'/> </hostdev> ... The guest just boot from hard disk Both rombar and romfile work well Technical note added. If any revisions are required, please edit the "Technical Notes" field accordingly. All revisions will be proofread by the Engineering Content Services team. New Contents: Along with the "rombar" option that controls whether or not a boot rom is made visible to the guest, qemu also has a "romfile" option that allows specifying a binary file to present as the ROM BIOS of any emulated or passthrough PCI device. This patch adds support for specifying romfile to both passthrough PCI devices, and emulated network devices that attach to the guest's PCI bus (just about everything other than ne2k_isa). One example of the usefulness of this option is described in the bugzilla report: 82576 sriov network adapters don't provide a ROM BIOS for the cards virtual functions (VF), but an image of such a ROM is available, and with this ROM visible to the guest, it can PXE boot. In libvirt's xml, the new option is configured like this: <hostdev> ... <rom file='/etc/fake/boot.bin'/> ... </hostdev (similarly for <interface>). Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. http://rhn.redhat.com/errata/RHSA-2012-0748.html |