在 Debian 上使用 Linux-KVM 实现 PCI-Passthrough

she*_*ept 11 debian virtualization linux-kvm vt-d

我正在尝试使用 PCI-Passthrough 将旧显卡 (Radeon 4770) 连接到虚拟机。我正在使用 Linux-KVM 在 Debian Linux (Wheezy, 3.2.0-4-amd64) 主机上运行我的虚拟机。

澄清一下,我不确定使用 Linux KVM 实现 PCI-Passthrough 的正确“路径”是什么。在这个阶段,我怀疑正确的操作是CONFIG_DMARCONFIG_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 ) 上的指南。但是,我发现其他资源表明(似乎)特定于分发的方法略有不同:

Fedora-- https://docs.fedoraproject.org/en-US/Fedora/13/html/Virtualization_Guide/chap-Virtualization-PCI_passthrough.html

SUSE--"openSUSE: Virtualization with 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_DMARCONFIG_DMAR_DEFAULT_ONCONFIG_PCI_STUB是相关的上的说明Linux内核的配置项linux-kvm.org。因此,我相信我需要使用这 3 个(至少)内核配置项重新编译主机的内核。intel_iommu=on作为内核参数引导到我的主机操作系统似乎是不够的。

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
Run Code Online (Sandbox Code Playgroud)

VT-d/IOMMU/KVM 支持确认

我的研究表明 PCI-Passthrough 需要 CPU 和主板支持 VT-d。

VT-d

我已确认我的处理器,非 k INTEL 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 ® Virtualization Technology for Directed I/O)。此功能的默认值为 [Disabled]。

IOMMU

我确认我的系统有 IOMMU 支持:

dmesg | grep -e DMAR -e IOMMU | grep -e "DRHD base" -e "enabled"
[    0.000000] Intel-IOMMU: enabled
Run Code Online (Sandbox Code Playgroud)

KVM

除了 PCI-Passthrough 支持外,KVM 已安装并正常运行:

lsmod | grep kvm
kvm_intel             121968  0 
kvm                   287749  1 kvm_intel
Run Code Online (Sandbox Code Playgroud)

我已经确保通过我主板的 BIOS 启用了 VT-d。因此,我不怀疑会阻止使用 VT-d 的硬件/BIOS 问题。无论如何,我无法成功地将我的视频卡与我的主机分离并将其重新分配给虚拟机

闭幕式

最后我想提一下,我也尝试过测试:

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
Run Code Online (Sandbox Code Playgroud)

并在尝试创建目标 VM 后出现以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我猜这是因为主机仍然不会放弃对显卡的控制,很可能是因为内核没有使用适当的配置项进行编译。

这对我来说是新的领域,所以请原谅我的经验不足。我会大大感激任何反馈无论如何,即使是简单的确认,我是在正确的轨道上。请让我知道我是否有明显的疏忽或过度思考。也欢迎对我的问题提出建设性的批评。如果我没有提供足够的信息来“帮助你帮助我”(或者我提供的信息太多!),请告诉我。我很乐意帮助使我的问题更清晰或更容易回答。

先感谢您,

小智 2

文章提到 PCI 直通,需要内核配置

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 "*"
Run Code Online (Sandbox Code Playgroud)

但是,我在“总线选项”下找不到这些选项,而是在“设备驱动程序 --> IOMMU 硬件支持”下找到它。

按照提到的文章进行操作后,我仍然在启动来宾计算机时遇到问题,并收到错误“设备‘pci-分配’无法初始化”。我设法通过执行以下命令来启动它:

 echo 1 > /sys/module/kvm/parameters/allow_unsafe_assigned_interrupts
Run Code Online (Sandbox Code Playgroud)

如果您仍然遇到问题,请参阅以下文章:http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html