Я пытаюсь использовать 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/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, которые относятся к инструкциям на linux-kvm.org. Поэтому я считаю, что мне нужно перекомпилировать ядро моего хоста с этими 3 (как минимум) элементами конфигурации ядра. Загрузка с intel_iommu=on
в качестве параметра ядра для моей хост-ОС оказывается недостаточной.
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
Подтверждение поддержки VT-d/IOMMU/KVM
Мои исследования показывают, что для PCI-Passthrough требуется поддержка как CPU, так и материнской платы для VT-d.
VT-d
Я подтвердил, что мой процессор, отличающийся от k 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
Я проверил, что моя система имеет поддержку IOMMU:
dmesg | grep -e DMAR -e IOMMU | grep -e "DRHD base" -e "enabled"
[ 0.000000] Intel-IOMMU: enabled
KVM
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
Я предполагаю, что это потому, что хост все равно не откажется от управления видеокартой и, вероятно, из-за того, что ядро не скомпилировано с соответствующими элементами конфигурации.
Это новая территория для меня, поэтому, пожалуйста, прости мою неопытность. Я был бы очень признателен за любые отзывы, даже если это просто подтверждение того, что я на правильном пути. Пожалуйста, дайте мне знать, если я сделал явный недосмотр или я слишком обдумывал. Конструктивная критика моего вопроса также приветствуется. Дайте мне знать, если я не предоставил достаточно информации, чтобы "помочь вам помочь мне" (или я включил слишком много!). Я был бы более чем рад помочь сделать мой вопрос яснее или проще ответить.
Заранее спасибо,