Вопрос или проблема
Я хотел бы передать устройство PCI на qemu для FreeBSD (14.2) без использования virt-manager и vfio (поскольку FreeBSD не поддерживает это), а только с помощью “сырых” параметров. Это устройство, которое я хочу назначить qemu:
marietto# lspci
05:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8192EE PCIe Wireless Network Adapter
Согласно этому посту:
QEMU Arm how to passthrough a PCI Card?
Я добавил параметр “device pci-assign,host=05:00.0”, вот так:
/usr/local/bin/qemu-system-x86_64 -machine pc-q35-9.1 -cpu max -m size=4292608k \
-vga std \
-drive file=/mnt/zroot2/zroot2/bhyve/img/Android/Android-qemu.img,format=raw \
-smp 4,sockets=4,cores=1,threads=1 -no-user-config -nodefaults \
-rtc base=utc,driftfix=slew \
-device pcie-root-port,port=16,chassis=1,id=pci.1,bus=pcie.0,multifunction=true,addr=0x2 \
-device pcie-pci-bridge,id=pci.2,bus=pci.1,addr=0x0 \
-device pcie-root-port,port=17,chassis=3,id=pci.3,bus=pcie.0,addr=0x2.0x1 \
-device pcie-root-port,port=18,chassis=4,id=pci.4,bus=pcie.0,addr=0x2.0x2 \
-device pcie-root-port,port=19,chassis=5,id=pci.5,bus=pcie.0,addr=0x2.0x3 \
-device ich9-usb-ehci1,id=usb,bus=pcie.0,addr=0x1d.0x7 \
-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pcie.0,multifunction=true,addr=0x1d \
-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pcie.0,addr=0x1d.0x1 \
-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pcie.0,addr=0x1d.0x2 \
-device ich9-ahci,id=sata \
-netdev tap,id=hostnet0,ifname=tap13,script=no,downscript=no \
-device e1000,netdev=hostnet0,mac=52:54:00:a3:e1:52 \
-device virtio-serial-pci,id=virtio-serial0,bus=pci.3,addr=0x0 \
-device pci-assign,host=05:00.0 \
-chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial,index=0 \
-drive if=pflash,format=raw,readonly=on,file=/usr/local/share/edk2-qemu/QEMU_UEFI_CODE-x86_64.fd \
< /dev/null & sleep 5
но этот метод не работает. Фактически, я получаю это сообщение об ошибке:
qemu-system-x86_64: -device pci-assign,host=05:00.0: ‘pci-assign’ is
not a valid device model name
Вероятно, pci-assign больше не является действительным параметром для версии qemu, которую я использую? эта:
marietto# qemu-system-x86_64 --version
QEMU emulator version 9.1.0
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers
Я должен сказать, что если я запускаю виртуальную машину с использованием bhyve вместо qemu, используя эти параметры, она может подключиться к интернету, поэтому устройство PCI-e распознается:
bhyve-lin -S -c sockets=2,cores=1,threads=1 -m 4G -w -H -A \
-s 0,hostbridge \
-s 1,ahci-hd,/mnt/zroot-133/bhyve/img/Android/Android-qemu.img,bootindex=1 \
-s 8:0,passthru,5/0/0 \
-s 11,hda,play=/dev/dsp,rec=/dev/dsp \
-s 13,virtio-net,tap13 \
-s 29,fbuf,tcp=0.0.0.0:5913,w=1600,h=950,wait \
-s 30,xhci,tablet \
-s 31,lpc \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI_CODE.fd,/usr/local/share/uefi-firmware/BHYVE_UEFI_VARS.fd \
vm0:13 < /dev/null & sleep 5 && vncviewer 0:13 && echo vncviewer 0:13 &
Я думаю, что это просто вопрос нахождения правильного синтаксиса.
Пожалуйста, помогите мне, спасибо.
Ответ или решение
Чтобы выполнить проброс PCIe беспроводного сетевого адаптера Realtek RTL8192EE из FreeBSD 14.2 в гостевую ОС Android 7, необходимо использовать QEMU без поддержки virt-manager и VFIO. Это требует детального подхода в настройке "сырых" параметров.
Анализ проблемы
Ваше текущее решение основано на использовании команды -device pci-assign,host=05:00.0
, что приводит к ошибке, так как pci-assign
больше не подходит к версии QEMU 9.1.0. Данную команду действительно не поддерживают свежие версии QEMU.
Как решить проблему
-
Убедитесь, что устройство не используется хостом: Сначала убедитесь, что драйвер FreeBSD не использует адаптер. Это можно сделать, отключив соответствующий модуль.
-
Корректная настройка PCIe проброса без VFIO: В FreeBSD вместо VFIO может понадобиться ручная конфигурация через
devctl
для ответа на вопрос как пробросить подключаемую карту. Следующий шаг поможет освободить устройство с PCI шины для назначения в QEMU:devctl deactivate pci0:5:0:0
-
Изменение конфигурации QEMU: QEMU предлагает использовать
vfio-pci
для проброса, но FreeBSD не дает возможности использовать VFIO напрямую. В этом случае можно изучить возможности проброса черезbhyve
, однако для чисто QEMU-решения вам может понадобиться модифицировать директорию конфигураций или использовать кастомное решение. Это может включать патчи в QEMU, специфичные настройки или использование замеченного вами успеха сbhyve
. -
Преобразование синтаксиса для QEMU: Попробуйте использовать другой подход к пробросу, например с использованием возможностей программы
bhyve
, если это возможно. Проверьте, поддерживает ли QEMU какие-либо другие механизмы проброса для вашей версии или возможно ли модифицировать исходный код с целью соответствия нужным требованиям.
Заключение
Ключевым моментом является понимание, что современный QEMU в оконечностях часто ограничивает использование старых методов проброса устройств. Разработка решения может потребовать погружения в документацию QEMU или специфичных для FreeBSD решений, а также настройки компиляции или даже изменения исходного кода. В качестве альтернативы, если проброс работает в bhyve
, рассмотреть возможность использования его вместо QEMU, если это решит вашу бизнес-задачу.
Не забудьте регулярно проверять и обновлять документацию, так как улучшения и изменения в поддержке оборудования и функций могут решить текущие проблемы.