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


10

我试图使用PCI-Passthrough将旧的视频卡(Radeon 4770)附加到虚拟机。我正在使用Linux-KVM在Debian Linux(Wheezy,3.2.0-4-amd64)主机上运行虚拟机。

为了明确起见,我不确定使用Linux KVM实现PCI直通的正确“路径”是什么。在此阶段,我怀疑正确的操作是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/zh-CN/Fedora/13/html/Virtualization_Guide/chap-Virtualization-PCI_passthrough.html

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

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

VT-d / IOMMU / KVM支持确认

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

室速

我已经确认我的处理器(非k INTEL i7-3770)(per ark.intel.com/products/65719)支持VT-d:

英特尔®定向I / O虚拟化技术(VT-d)•是

我的华擎Z77 Extreme4主板还支持VT-d(根据用户手册第62页):

VT-d使用此功能可以启用或禁用英特尔®VT-d技术(用于定向I / O的英特尔®虚拟化技术)。此功能的默认值为[Disabled]。

国际货币基金组织

我确认我的系统具有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。因此,我不怀疑会阻止使用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

尝试创建目标虚拟机后出现以下错误:

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

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

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

先感谢您,


发生的情况是,您根本不让视频卡将其自身附加到主机上(例如,在不将该视频卡附加到主机的情况下进行引导。要么不提供/禁用驱动程序,要么使用内核引导参数,以便在引导过程中被跳过) ?
Hennes 2014年

Answers:


1

提到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 "*"

但是,我在“总线选项”下找不到这些选项,而是在“设备驱动程序-> 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.