Черный список NVIDIA GPU для сквозной передачи QEMU / KVM

Я пытаюсь запустить Windows на виртуальной машине, одновременно предоставляя виртуальную машину прямой проход к графическому процессору для повышения производительности.

У меня есть интегрированный графический процессор Intel (я буду использовать этот для хоста) и Nvidia GTX980 (я хочу этот для ВМ). Я использую Elementary OS 0.3.2 Freya 64 bit.

Я следовал этому руководству, но теперь застрял на шаге 2. Я не могу включить графический процессор Nvidia в черный список.

Для начала я делаю lspci -nn | grep NVIDIA

Это приводит к следующему выводу

01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:13c0] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:0fbb] (rev a1)

Затем я добавил эту строку в /etc/initramfs-tools/modules файл.

pci_stub ids=10de:13c0,10de:0fbb

И я затем перезагрузил с помощью update-initramfs -u и после перезагрузки.

После перезагрузки при запуске dmesg | grep pci-stub Я получаю следующий вывод:

[    2.029626] pci-stub: add 10DE:13C0 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.029630] pci-stub: add 10DE:0FBB sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.029637] pci-stub 0000:01:00.1: claimed by stub

Как вы можете видеть, ни аудио, ни видео не заявлены заглушкой.

Я также попытался добавить эту опцию прямо в файл grub в etc/default/grub Итак GRUB_CMDLINE_LINUX_DEFAULT линия выглядит так:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci-stub.ids=10de:13c0,10de:0fbb"

Но это также привело к тому, что карта Nvidia не попала в черный список.

Кто-нибудь понял, что может быть причиной этого?

5 ответов

Я столкнулся с такими же проблемами, как вы (Lubuntu 16.04). Это происходит из-за драйверов / модулей, привязывающих устройства к ним до того, как pci-заглушка сможет это сделать. У вас есть как минимум два варианта здесь:

Первым и самым простым будет занести в черный список модули, которые претендуют на устройство. Введите lspci -knn | grep VGA -A 5 чтобы увидеть все ваши устройства VGA pci и их номер устройства и их модули ядра.

01: 00.0 VGA-совместимый контроллер [0300]: устройство корпорации NVIDIA [10de:128b] (версия a1)
    Подсистема: Micro-Star International Co., Ltd. Устройство [MSI] [1462:8c93]
    Используемый драйвер ядра: nouveau
    Модули ядра: nvidiafb, nouveau
01:00.1 Аудиоустройство [0403]: NVIDIA Corporation GK208 Аудио контроллер HDMI/DP [10de:0e0f] (версия a1)
    Подсистема: Micro-Star International Co., Ltd. [MSI] GK208 Аудио контроллер HDMI/DP [1462:8c93]
-
02:00.0 VGA-совместимый контроллер [0300]: NVIDIA Corporation GM204 [GeForce GTX 970] [10de:13c2] (версия a1)
    Подсистема: ZOTAC International (MCO) Ltd. GM204 [GeForce GTX 970] [19da:1366]
    Используемый драйвер ядра: nouveau
    Модули ядра: nvidiafb, nouveau
02:00.1 Аудиоустройство [0403]: NVIDIA Corporation GM204 Аудио контроллер высокой четкости [10de:0fbb] (rev a1)
    Подсистема: ZOTAC International (MCO) Ltd. GM204 Аудио контроллер высокого разрешения [19da: 1366]

Теперь вам нужно проверить, какой драйвер используется. Например, nouveau схватил мое VGA-устройство 02: 00.0, которое я хочу использовать для своей виртуальной машины, поэтому я внес его в черный список:

sudo nano /etc/modprobe.d/blacklist.conf blacklist nouveau

и вы сделали.

В моем случае это вызвало бы проблему, так как у меня установлено два nVidia VGA (01:00.0 и 02:00.0), которые работают с одним и тем же драйвером. В моем случае я не заносить драйвер в черный список.

Я вручную отсоединяю nouveau от моей карты VGA 02: 00.0, так как я хотел использовать эту карту для моей виртуальной машины и VGA 01: 00.0 для моего хоста Linux. Благодаря этому руководству я узнал, как это сделать: https://lwn.net/Articles/143397/

Введите sudo tree /sys/bus/pci/drivers/nouveau, Обмен nouveau с любым модулем захватил ваше устройство.

Вы должны получить список, как это:

/ SYS / автобус / PCI / драйверы / нуво
0000── 0000: 01: 00.0 -> ../../../../devices/pci0000:00/0000:00:03.0/0000:01:00.0
0000── 0000:02:00.0 -> ../../../../devices/pci0000:00/0000:00:05.0/0000:02:00.0
Ind── связать
├── модуль -> ../../../../module/drm
New── new_id
Remove── remove_id
E── событие
B── убрать

Мы видим, что драйвер nouveau имеет к устройствам привязку к нему: 0000: 01: 00.0 и 0000:02:00.0

Чтобы отсоединить и связать мою графическую карту, мне сначала нужно отключить lightdm.service. Для этого я, например, открываю консоль вне рабочей среды с помощью сочетания клавиш CTRL+ALT+F2. Войдите в систему как root и введите systemctl stop lightdm.service

Теперь я могу отсоединить модуль от видеокарты:

echo -n "0000:02:00.0" > /sys/bus/pci/drivers/nouveau/unbind

и связать его с любым модулем, который я хочу (pci-заглушка или vfio-pci). Я использовал vfio-pci.

echo -n "0000:02:00.0" > /sys/bus/pci/drivers/vfio-pci/bind

После этого вы можете снова запустить ваш desktopmanager: systemctl start lightdm.service

Если все работает, вы должны найти ваше устройство привязанным к модулю, который вы указали, посмотрев с lspci -knn | grep VGA -A 5 снова.

01: 00.0 VGA-совместимый контроллер [0300]: устройство NVIDIA Corporation [10de:128b] (rev a1) Подсистема: Micro-Star International Co., Ltd. Устройство [MSI] [1462:8c93] Используемый драйвер ядра: модули ядра nouveau: nvidiafb, nouveau 01: 00.1 Аудиоустройство [0403]: NVIDIA Corporation GK208 Аудио контроллер HDMI/DP [10de:0e0f] (rev a1) Подсистема: Micro-Star International Co., Ltd. [MSI] GK208 Аудио контроллер HDMI/DP [1462:8c93] - 02:00.0 VGA-совместимый контроллер [0300]: NVIDIA Corporation GM204 [GeForce GTX 970] [10de:13c2] (rev a1) Подсистема: ZOTAC International (MCO) Ltd. GM204 [GeForce GTX 970] [ 19da: 1366] Используемый драйвер ядра: vfio-pci Модули ядра: nvidiafb, nouveau 02: 00.1 Аудиоустройство [0403]: NVIDIA Corporation GM204 Аудио контроллер высокой четкости [10de:0fbb] (rev a1) Подсистема: ZOTAC International (MCO) Ltd. GM204 Аудио контроллер высокого разрешения [19da: 1366] 

К сожалению, этот обходной путь теряет эффект после перезагрузки. И все же я не узнал, как сделать это постоянным. Может быть, кто-нибудь еще может дать мне подсказку. Полагаю, что-то вроде стартового сценария возможно. Но было бы лучше иметь возможность привязать устройство к определенному модулю без необходимости сначала отсоединять его. Представьте, что я хотел бы использовать драйвер NVIDIA однажды. В этом случае открепление от nouveau будет бесполезным, поскольку графическая карта будет привязана к модулю nvidia.

Я также настраиваю переход через QEMU-KVM, и у меня была такая же проблема, как и у вас. Я использую встроенную графическую карту Intel в качестве основного графического процессора, поэтому я открыл настройки nvidia и отключил гибридную графику, чтобы карта nvidia не использовалась: (рис.)

После этого у меня не было проблем с привязкой карты к vfio-pci.

Возможно, что модули nvidia каким-то образом вызовут у вас проблемы при запуске qemu, или у вас нет возможности отключить гибридную графику. В этом случае вы также можете попробовать то же, что и я, и вручную отключить модули nvidia, используя скрипт, подобный этому, в режиме консоли (CTRL+ALT+F1):

#!/bin/bash
sudo service lightdm stop
sudo rmmod nvidia_uvm
sudo rmmod nvidia_drm
sudo rmmod nvidia_modeset
sudo rmmod nvidia
sudo service lightdm start

Это останавливает диспетчер отображения (в моем случае lightdm), отключает модули nvidia по порядку и впоследствии перезапускает диспетчер отображения. Обязательно запустите это в консольном режиме, так как запуск этого с рабочего стола, скорее всего, прервет выполнение скрипта после первой строки.

Модули nvidia будут автоматически загружаться снова при перезагрузке, но вы также можете загрузить их снова вручную с помощью:

modprobe nvidia nvidia_modeset nvidia_drm nvidia_uvm

Надеюсь это поможет.

Деактивируйте nvidia/nuveau, используя конфигурацию grub.

Есть возможность сдать module_blacklist=<module1>[,<module2>] (документация) к ядру через командную строку grub2. я смог деактивировать драйверы nuveau и nvidia со следующим дополнением к GRUB_CMDLINE_LINUX_DEFAULT в /etc/default/grub (не забудьте оформить sudo update-grub):

module_blacklist=nvidia,nvidia_uvm,nvidia_drm,nvidia_modeset,nouveau

Также есть возможность автоматически генерировать записи Grub с и без этой опции для каждого ядра: https://unix.stackexchange.com/questions/24670/choose-at-grub-menu-whether-nvidia-driver-should-be-used (первый ответ). Но это оказалось более громоздким, чем ожидалось. Конфигурация Ubuntu Grub очень сложна. Обязательно сделайте резервную копию, прежде чем возиться с ней.

Это особенно полезно, если вы хотите использовать мощную карту NVIDIA для игр на виртуальной машине с использованием VGA Passthrough, но при этом имеете возможность использовать ее для глубокого изучения, например tensorflow, Только перезагрузка требуется для переключения между этими двумя.

Вы пробовали это руководство https://forum.level1techs.com/t/play-games-in-windows-on-linux-pci-passthrough-quick-guide/108981?:) Это совсем новее:)

Ваш звук был востребован заглушкой

[    2.029637] pci-stub 0000:01:00.1: claimed by stub

Видео нет. У меня такая же проблема, я попал в черный список Nvidia и / или Nouveau. Я использую Ubuntu Server 15.10, поэтому не совсем то же самое, но у меня та же проблема. Я искал в сети несколько недель и ничего.

Редактировать Наконец исправил, я нашел это здесь: https://forum.level1techs.com/t/pci-stub-not-claming-secondary-graphics-card/88728

Поэтому я занес в черный список модули Nvidia и Nouveau и перезагрузился. Надеюсь, поможет

отредактируйте снова:

Мои текущие шаги, которые я предпринял, чтобы связать карты pci с pci-заглушкой на arch с ядром 4.10.1-1.

Я отредактировал / etc / default / grub, чтобы он выглядел следующим образом: GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu= на pci-stub.ids=1002:6798,1002:679a,1002:aaa0,1106:3483"

Затем я создаю новый файл конфигурации grub

$ sudo grub-mkconfig -o /boot/grub/grub.cfg

Затем перезагрузите компьютер.

В /etc/mkinitcpio.conf я добавил pci-заглушку в модули, чтобы она выглядела так: MODULES="pci-stub"

тогда беги

$ sudo mkinitcpio -P

восстановить все ваши изображения initramfs. Затем перезагрузите компьютер.

Тогда эта команда просто для того, чтобы убедиться, что они были заявлены pci-grub

$ dmesg | grep pci-stub

Другие вопросы по тегам