web-dev-qa-db-ja.com

PCIパススルーがデバイスをゲストOSに渡さないのはなぜですか?

PCIパススルーを試したい。古いキャプチャビデオカードをWindows XPゲストに渡しました。

IOMMUが有効になっています。
vfio_pciが読み込まれます

私はこのコマンドを実行します:

virsh nodedev-detach pci_0000_05_05_0

lspci -s 00:05 -v

vfioがPCIデバイスを「実行中」であると報告しますが、PCIデバイスでXPを起動すると、次のエラーが返されます。

Please ensure all devices within the iommu_group are bound to their vfio bus driver.

何が間違っていたのですか?

3
elbarna

私は解決策を見つけました。まず、IOMMUグループを特定する必要があります。私の場合は11です(lspciを使用してpciアドレスを読み取っています。私の場合は05:05:0です)

find /sys/kernel/iommu_groups/ -type l|grep \/11
/sys/kernel/iommu_groups/11/devices/0000:00:14.4
/sys/kernel/iommu_groups/11/devices/0000:05:06.0
/sys/kernel/iommu_groups/11/devices/0000:05:05.0

したがって、05:05と05:06(グループの2つのPCIカード)をqemulibvirtで追加する必要があります。これは、virt-manager addハードウェアを使用して、pciHostを選択することで簡単に行えます。ここで起動すると、dmesgに別のエラーが表示されます。

"Flags mismatch irq 21. 00000000 (vfio-intx(0000:05:05.0)) vs. 0000000....usb...."

これは、システムが割り込みを共有できないことを意味するため、ホストからデバイスを削除する必要があります。

したがって、割り込みを見つける必要があります。

cat /proc/interrupts | grep 21

たとえばusb2を返すので、usbdirを検索します。

find  /sys/devices/pci0000\:00/0000\:00\:* -iname usb2

、usb dirに移動します。私の場合は13.2:

cd /sys/devices/pci0000\:00/0000\:00\:13.2/

ホストから(原文のまま!)を削除します。

echo -n 1 > remove

これで、ゲストを起動すると、pciカードがゲストに割り当てられます。

そして、私たちに戻るために?私は答えを追加します...私が解決策を見つけたら!

5
elbarna