我正在尝试使用 PCI-Passthrough 将旧显卡 (Radeon 4770) 连接到虚拟机。我正在使用 Linux-KVM 在 Debian Linux (Wheezy,3.2.0-4-amd64) 主机上运行我的虚拟机。
问题
需要澄清的是,我不确定使用 Linux KVM 实现 PCI-Passthrough 的正确“路径”是什么。目前,我怀疑正确的做法是将CONFIG_DMAR
、CONFIG_DMAR_DEFAULT_ON
和CONFIG_PCI_STUB
添加到内核源代码的“总线选项(PCI 等)”部分并重新编译。
但我不确定如果这是重新编译之前需要添加的详尽列表。或者如果需要重新编译内核——也许有更简单的方法?
在我引用的指南中,只有linux-kvm.org明确提到编译是必要的。Linux-KVM 已安装并作为虚拟机管理程序运行。
研究
此时我认为我的问题与我的内核有关。我的主要资源是linux-kvm.org(http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM)。但是,我发现其他资源指出了略有不同的方法,这些方法(似乎)特定于分布:
SUSE——“openSUSE:使用 KVM 进行虚拟化”(由于相关性低且 2 个链接限制,因此省略链接)
Fedora 指南在参考setsebool
似乎特定于 RedHat 的指南之前有效。SUSE 指南指出 SUSE 不支持显卡分配,但我也参考了它,因为它指出我应该CONFIG_DMAR_DEFAULT_ON
在 /boot/config-`uname -r` 中找到一个字符串。linux-kvm.org站点也引用了CONFIG_DMAR_DEFAULT_ON
,因此这似乎是一个常见且必要的组件。
笔记:我在 Fedora 或 Debian 指南中没有发现显卡限制。参考的 SUSE 文档的日期是 2006-2013 年。
CONFIG_DMAR_DEFAULT_ON
我在系统的 /boot/config-`uname -r` 中找不到。进一步的研究表明CONFIG_DMAR
,、CONFIG_DMAR_DEFAULT_ON
和CONFIG_PCI_STUB
是与linux-kvm.org。因此,我认为我需要使用这 3 个(至少)内核配置项重新编译主机的内核。将其intel_iommu=on
作为内核参数引导到我的主机操作系统似乎不够。
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
VT-d/IOMMU/KVM 支持确认
我的研究表明,PCI-Passthrough 需要 CPU 和主板支持 VT-d。
室性心动过速
我已经确认我的处理器,非kINTEL i7-3770(根据 ark.intel.com/products/65719),支持 VT-d:
英特尔® 定向 I/O 虚拟化技术 (VT-d) ‡ 是
我的 Asrock Z77 Extreme4 主板也支持 VT-d(根据用户手册第 62 页):
VT-d 此项用于启用或禁用 Intel ® VT-d 技术(Intel ® 定向 I/O 虚拟化技术)。此功能的默认值为 [Disabled]。
IO管理单元
我验证了我的系统具有 IOMMU 支持:
dmesg | grep -e DMAR -e IOMMU | grep -e "DRHD base" -e "enabled"
[ 0.000000] Intel-IOMMU: enabled
虚拟机
除了 PCI-Passthrough 支持之外,KVM 已安装并可正常运行:
lsmod | grep kvm
kvm_intel 121968 0
kvm 287749 1 kvm_intel
我已确保通过主板的 BIOS 启用了 VT-d。因此,我并不怀疑硬件/BIOS 问题会阻止使用 VT-d。无论如何,我无法成功将显卡从主机上拆下并将其重新分配给虚拟机。
结束语
最后我想提一下,我也尝试过测试:
echo "8086 10b9" \> /sys/bus/pci/drivers/pci-stub/new_id
echo "0000:01:00.0" \> /sys/bus/pci/devices/0000:01:00.0/driver/unbind
echo "0000:01:00.0" \> /sys/bus/pci/drivers/pci-stub/bind
echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/remove_id
kvm -m 512 -boot c -net none -hda debian-7.1.0-amd64-netinst.iso -device pci-assign,host=01:00.0
尝试创建目标虚拟机后出现以下错误:
Failed to assign device "(null)" : Device or resource busy
*** The driver 'pci-stub' is occupying your device 0000:01:00.0.
***
*** You can try the following commands to free it:
***
*** $ echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
*** $ echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/unbind
*** $ echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/bind
*** $ echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/remove_id
***
kvm: -device pci-assign,host=01:00.0: Device 'pci-assign' could not be initialized
我猜测这是因为主机仍然不会放弃对视频卡的控制,并且很可能是因为内核没有使用适当的配置项进行编译。
这对我来说是新领域,所以请原谅我的经验不足。我会大大非常感谢任何反馈,即使只是确认我走在正确的道路上。如果我犯了明显的疏忽或想得太多了,请告诉我。也欢迎对我的问题提出建设性的批评。如果我没有提供足够的信息来“帮助你帮助我”(或者我包含的信息太多了!),请告诉我。我非常乐意帮助我的问题更清楚或更容易回答。
先感谢您,
答案1
文章中提到 PCI-passthrough,需要内核配置
make menuconfig
set "Bus options (PCI etc.)" -> "Support for DMA Remapping Devices" to "*"
set "Bus options (PCI etc.)" -> "Enable DMA Remapping Devices" to "*"
set "Bus options (PCI etc.)" -> "PCI Stub driver" to "*"
optional setting:
set "Bus options (PCI etc.)" -> "Support for Interrupt Remapping" to "*"
但是,我在“总线选项”下找不到这些选项,而是在“设备驱动程序--> IOMMU 硬件支持”下找到。
按照上述文章操作后,我仍然无法启动客户机,并收到“无法初始化设备‘pci-assign’”的错误。我设法通过执行以下命令启动它:
echo 1 > /sys/module/kvm/parameters/allow_unsafe_assigned_interrupts
如果您仍然遇到问题,请参阅以下文章:http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html