Я пытаюсь использовать PCI-Passthrough для подключения старой видеокарты (Radeon 4770) к виртуальной машине. Я использую Linux-KVM для запуска моих виртуальных машин на хосте Debian Linux (Wheezy, 3.2.0-4-amd64).
Вопрос
Чтобы прояснить ситуацию, я не уверен, какой правильный 'путь' для реализации PCI-Passthrough с Linux KVM. На данном этапе я подозреваю, что правильным действием будетдобавьте CONFIG_DMAR
, CONFIG_DMAR_DEFAULT_ON
, и CONFIG_PCI_STUB
в раздел «Параметры шины (PCI и т. д.)» исходного кода ядра и перекомпилируйте.
Но я не уверенесли это исчерпывающий список необходимых дополнений перед повторной компиляцией.Илиесли необходима перекомпиляция ядра--возможно, есть более простой способ?
Из руководств, на которые я ссылался, толькоlinux-kvm.orgявно упоминает необходимость компиляции. Linux-KVM уже установлен и функционирует как гипервизор.
Исследовать
На данный момент я думаю, что моя проблема связана с моим ядром. Моим основным ресурсом было руководство наlinux-kvm.org(http://www.linux-kvm.org/page/Как_назначить_устройства_с_VT-d_в_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, которые имеют отношение к инструкциям наlinux-kvm.org. Таким образом, я считаю, что мне нужно перекомпилировать ядро моего хоста с этими 3 (как минимум) элементами конфигурации ядра. Загрузка с intel_iommu=on
параметром ядра в моей хост-ОС, похоже, недостаточна.
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
Подтверждение поддержки VT-d/IOMMU/KVM
Мои исследования показывают, что PCI-Passthrough требует поддержки VT-d как ЦП, так и материнской платой.
VT-д
Я подтвердил, что мой процессор,не-КINTEL i7-3770 (согласно ark.intel.com/products/65719), поддерживает VT-d:
Технология виртуализации Intel® для направленного ввода-вывода (VT-d) ‡ Да
Моя материнская плата Asrock Z77 Extreme4 также поддерживает VT-d (см. стр. 62 Руководства пользователя):
VT-d Используйте это для включения или отключения технологии Intel ® VT-d (технология виртуализации Intel ® для направленного ввода-вывода). Значение этой функции по умолчанию — [Отключено].
ИММУ
Я проверил, что в моей системе есть поддержка IOMMU:
dmesg | grep -e DMAR -e IOMMU | grep -e "DRHD base" -e "enabled"
[ 0.000000] Intel-IOMMU: enabled
КВМ
KVM установлен и функционирует, за исключением поддержки PCI-Passthrough:
lsmod | grep kvm
kvm_intel 121968 0
kvm 287749 1 kvm_intel
Я убедился, что VT-d включен через BIOS моей материнской платы. Таким образом, я не подозреваю, что есть проблемы с оборудованием/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