http://pic.dhe.ibm.com/infocenter/lnxinfo/v3r0m0/index.jsp?topic=%2Fliaat%2Fliaatbppassthrougtask.htm
http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM
1. 确定硬件是否支持iommu
这是一个硬件的功能,intel架构上叫vt-d。
从BIOS上可以看出来, 不同版本放的位置不一样。
我的是在 Security->Virtualization->VT-d
2. 配置kernel,支持iommu
在intel机器上有这么个选项,
INTEL_IOMMU
│ Location: │
│ -> Device Drivers │
│ (2) -> IOMMU Hardware Support (IOMMU_SUPPORT [=y])
3. 重启,看看是否enable了。
在intel上,运行
dmesg | grep -e DMAR -e IOMMU
4. 在host上unbind设备
加载pci_stub模块, modprobe pci_stub
选中某个设备, lspci -s 03:00.0 -n, 03:00.0 0280: 8086:0085 (rev 34)
bind/unbind
5. 把设备给guest
./i386-softmmu/qemu-system-i386 -enable-kvm \
-drive file=../../kvm/ubuntu.qcow2 -boot dc -m 512 \
-monitor stdio \
-netdev user,id=usernet -device rtl8139,netdev=usernet \
-device pci-assign,host=0000:03:00.0
不过偶没有成功,报错了。。。
6. 错误分析,解决
按照上面的办法没成功,我看了一下dmesg,有这么一句。
kvm_iommu_map_guest: No interrupt remapping support, disallowing device assignment. Re-enble with "allow_unsafe_assigned_interrupts=1" module option.
稍微调查了一下,发现和这个选项有关,config IRQ_REMAP。 可惜我enable不了,因为这个必须在x86_64上做。
没办法,那我只好在装载kvm模块的时候加上这个参数的设置了。
加上这个参数后,果然就好了。赞。
接下来我用了vfio来做passthrough。步骤略有不同。
1. 安装相关的kernel module
sudo modprobe vfio
sudo modprobe vfio-pci
这样就产生了 /dev/vfio/vfio 设备
2. 按照文档要求,添加设备到一个group
按照现在的要求,需要讲某一个iommu_group下的所有设备都添加到一个vfio group.
cd /sys/bus/pci/devices/0000:0d:00.0/
readlink iommu_group 这样可以显示该设备对应iommu_group的名字
ll iommu_group/devices 这样可以显示和该设备处于一个iommu_group的设备。
echo 0000:0d:00.0 > /sys/bus/pci/devices/0000:0d:00.0/driver/unbind
echo 1180 e823 > /sys/bus/pci/drivers/vfio-pci/new_id
echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind
echo 8086 0085 > /sys/bus/pci/drivers/vfio-pci/new_id
这样就生成了 /dev/vfio/6 (数字由iommu_group号决定)
3. 启动 guest
../git/qemu-latest/i386-softmmu/qemu-system-i386 -enable-kvm -drive file=ubuntu.qcow2 -boot dc -m 512 -monitor stdio -netdev user,id=usernet -device vfio-pci,host=0000:03:00.0
如果是在power机器上,则写成
-device "spapr-pci-vfio-host-bridge,id=CXGB3,iommu=4,index=6"
4. fix
默认这么启动会有个错误,当然这是在我的机器上。
vfio_iommu_type1_open: No interrupt remapping support. Use the module param "allow_unsafe_interrupts" to enable VFIO IOMMU support on this platform
意思是我这个机器不支持remap, 那我就把这个参数直接设成了1. 就好了。