LINUX.ORG.RU
ФорумAdmin

Проброс PCI USB контроллера в хост виртуалки на KVM

 ,


0

2


Всем привет!
Кто пробрасывал PCI устройства виртуалки на KVM, помогите пожалуйста тоже
реализовать. Я видел в Сети примеры, но они мне были непонятны. А очень
хочется, чтобы в VM был контроллер сразу со всеми к нему подключенными устройствами. Вот,
например, я хочу реализовать проброс с помощью xml файла этот USB контроллер:

00:1d.0 USB controller: Intel Corporation Wildcat Point-LP USB EHCI Controller (rev 03)

Я видел в Сети примеры, но они мне были непонятны.

А как ты себе представляешь тут понятный пример? Ты думаешь в сети от тебя скрывают волшебный синтаксис в одну команду?

mamina_radost
()

Покажу на примере сетёвки. С юсб всё аналогично.

Сначала с помощью lspci -nnk узнаёшь подробности об устройстве.

00:19.0 Ethernet controller [0200]: Intel Corporation Ethernet Connection (2) I218-V [8086:15a1] (rev 05)
	DeviceName:  Onboard LAN
	Subsystem: Gigabyte Technology Co., Ltd Device [1458:e000]
	Kernel driver in use: e1000e

Сначала отвязываешь устройство, используя цифры в самом начале и имя драйвера.
echo 0000:00:19.0 > /sys/bus/pci/drivers/e1000e/unbind
Далее привязываешь его к драйверу vfio-pci используя значения из квадратных скобок
echo "8086 15a1" > /sys/bus/pci/drivers/vfio-pci/new_id

После этого можно использовать это устройство в команде запуска виртуалки следующим образом:

qemu-system-x86_64 \
-name "Win10-min" \
-smp 12,cores=6,threads=2,sockets=1 -cpu host,kvm=off \
-machine accel=kvm \
-boot menu=on \
-rtc base=localtime \
-nic none \
-device virtio-gpu-pci \
-device vfio-pci,host=00:19.0 \
-device vfio-pci,host=00:1f.2 \
$*

-device vfio-pci,host=00:19.0 - это вот как раз проброс.

Но учитывать надо вот что. В выхлопе dmesg хоста должен быть похожий участок:

[    6.535634] pci 0000:ff:0b.0: Adding to iommu group 0
[    6.535707] pci 0000:ff:0b.1: Adding to iommu group 0
[    6.535780] pci 0000:ff:0b.2: Adding to iommu group 0
[    6.535930] pci 0000:ff:0c.0: Adding to iommu group 1
[    6.536002] pci 0000:ff:0c.1: Adding to iommu group 1
[    6.536074] pci 0000:ff:0c.2: Adding to iommu group 1
[    6.536151] pci 0000:ff:0c.3: Adding to iommu group 1
[    6.536224] pci 0000:ff:0c.4: Adding to iommu group 1
[    6.536297] pci 0000:ff:0c.5: Adding to iommu group 1
[    6.536432] pci 0000:ff:0f.0: Adding to iommu group 2
[    6.536505] pci 0000:ff:0f.1: Adding to iommu group 2
[    6.536577] pci 0000:ff:0f.4: Adding to iommu group 2
[    6.536650] pci 0000:ff:0f.5: Adding to iommu group 2
[    6.536723] pci 0000:ff:0f.6: Adding to iommu group 2
[    6.536860] pci 0000:ff:10.0: Adding to iommu group 3
[    6.536933] pci 0000:ff:10.1: Adding to iommu group 3
[    6.537006] pci 0000:ff:10.5: Adding to iommu group 3
[    6.537079] pci 0000:ff:10.6: Adding to iommu group 3
[    6.537155] pci 0000:ff:10.7: Adding to iommu group 3
[    6.537252] pci 0000:ff:12.0: Adding to iommu group 4
[    6.537328] pci 0000:ff:12.1: Adding to iommu group 4
[    6.537502] pci 0000:ff:13.0: Adding to iommu group 5
[    6.537577] pci 0000:ff:13.1: Adding to iommu group 5
[    6.537650] pci 0000:ff:13.2: Adding to iommu group 5
[    6.537724] pci 0000:ff:13.3: Adding to iommu group 5
[    6.537798] pci 0000:ff:13.4: Adding to iommu group 5
[    6.537871] pci 0000:ff:13.5: Adding to iommu group 5
[    6.537946] pci 0000:ff:13.6: Adding to iommu group 5
[    6.538021] pci 0000:ff:13.7: Adding to iommu group 5
[    6.538198] pci 0000:ff:14.0: Adding to iommu group 6
[    6.538276] pci 0000:ff:14.1: Adding to iommu group 6
[    6.538351] pci 0000:ff:14.2: Adding to iommu group 6
[    6.538425] pci 0000:ff:14.3: Adding to iommu group 6
[    6.538501] pci 0000:ff:14.4: Adding to iommu group 6
[    6.538576] pci 0000:ff:14.5: Adding to iommu group 6
[    6.538651] pci 0000:ff:14.6: Adding to iommu group 6
[    6.538726] pci 0000:ff:14.7: Adding to iommu group 6
[    6.538847] pci 0000:ff:15.0: Adding to iommu group 7
[    6.538923] pci 0000:ff:15.1: Adding to iommu group 7
[    6.538999] pci 0000:ff:15.2: Adding to iommu group 7
[    6.539075] pci 0000:ff:15.3: Adding to iommu group 7
[    6.539190] pci 0000:ff:16.0: Adding to iommu group 8
[    6.539268] pci 0000:ff:16.6: Adding to iommu group 8
[    6.539345] pci 0000:ff:16.7: Adding to iommu group 8
[    6.539477] pci 0000:ff:17.0: Adding to iommu group 9
[    6.539556] pci 0000:ff:17.4: Adding to iommu group 9
[    6.539633] pci 0000:ff:17.5: Adding to iommu group 9
[    6.539710] pci 0000:ff:17.6: Adding to iommu group 9
[    6.539787] pci 0000:ff:17.7: Adding to iommu group 9
[    6.539920] pci 0000:ff:1e.0: Adding to iommu group 10
[    6.539999] pci 0000:ff:1e.1: Adding to iommu group 10
[    6.540077] pci 0000:ff:1e.2: Adding to iommu group 10
[    6.540159] pci 0000:ff:1e.3: Adding to iommu group 10
[    6.540236] pci 0000:ff:1e.4: Adding to iommu group 10
[    6.540332] pci 0000:ff:1f.0: Adding to iommu group 11
[    6.540412] pci 0000:ff:1f.2: Adding to iommu group 11
[    6.540485] pci 0000:00:00.0: Adding to iommu group 12
[    6.540560] pci 0000:00:01.0: Adding to iommu group 13
[    6.540634] pci 0000:00:01.1: Adding to iommu group 14
[    6.540707] pci 0000:00:02.0: Adding to iommu group 15
[    6.540781] pci 0000:00:02.3: Adding to iommu group 16
[    6.540854] pci 0000:00:03.0: Adding to iommu group 17
[    6.540928] pci 0000:00:05.0: Adding to iommu group 18
[    6.541000] pci 0000:00:05.1: Adding to iommu group 19
[    6.541089] pci 0000:00:05.2: Adding to iommu group 20
[    6.541166] pci 0000:00:11.0: Adding to iommu group 21
[    6.541252] pci 0000:00:11.4: Adding to iommu group 22
[    6.541324] pci 0000:00:14.0: Adding to iommu group 23
[    6.541409] pci 0000:00:16.0: Adding to iommu group 24
[    6.541481] pci 0000:00:19.0: Adding to iommu group 25
[    6.541554] pci 0000:00:1c.0: Adding to iommu group 26
[    6.541627] pci 0000:00:1c.3: Adding to iommu group 27
[    6.541700] pci 0000:00:1c.4: Adding to iommu group 28
[    6.541776] pci 0000:00:1c.7: Adding to iommu group 29
[    6.541886] pci 0000:00:1f.0: Adding to iommu group 30
[    6.541968] pci 0000:00:1f.2: Adding to iommu group 30
[    6.542049] pci 0000:00:1f.3: Adding to iommu group 30
[    6.542137] pci 0000:02:00.0: Adding to iommu group 31
[    6.542210] pci 0000:05:00.0: Adding to iommu group 32
[    6.542283] pci 0000:06:00.0: Adding to iommu group 33
[    6.542360] pci 0000:07:00.0: Adding to iommu group 34
[    6.543201] pci 0000:07:00.1: Adding to iommu group 35
[    6.543273] pci 0000:09:00.0: Adding to iommu group 36
[    6.543346] pci 0000:0a:00.0: Adding to iommu group 37
[    6.543420] pci 0000:0b:00.0: Adding to iommu group 38
[    6.543477] pci 0000:0c:00.0: Adding to iommu group 38

Обрати внимание, что в одну группу может попасть несколько устройств. Фишка в том, что их все следует как минимум отвязать от их хостовых драйверов перед пробросом, иначе проброс не заработает.

u5er ★★
()
Последнее исправление: u5er (всего исправлений: 1)
Ответ на: комментарий от borschov

ну можно и через консольный virsh настраивать.
Ты ведь через libvirt виртуальными машинами управляешь (судя по упоминаемому xml)?
Например https://documentation.suse.com/smart/virtualization-cloud/pdf/vm-assign-pci-d... раздел «Assigning a device using virsh»
Но проще через GUI.

MirandaUser2
()
Ответ на: комментарий от u5er


У меня нет каталога

/sys/bus/pci/drivers/vfio-pci

и вместо
new_id

какое значение должно быть?
у меня на хосте Debian 12...

borschov
() автор топика
Последнее исправление: borschov (всего исправлений: 1)
Ответ на: комментарий от borschov

У меня нет каталога

Попробуй от рута modprobe vfio или modprobe vfio-pci. Ща не вспомню точное название модуля. После этого каталог должен появиться.

и вместо

new_id - это специальный файл в sysfs. В него нужно записать id устройства, для которого будет назначен драйвер.

u5er ★★
()
Ответ на: комментарий от u5er


Проверил lspci -nnk
устройство перехвачено,

Kernel driver in use: vfio-pci


Но теперь неясно, как это в xml прописать..
Могли бы показать, как у вас этот фрагмент в xml выглядит?
Вот например, у меня /etc/libvirt/qemu/VM1.xml - один файл,
это правило надо в него писать?


Понятно, что надо использовать virsh edit VM1.

borschov
() автор топика
Последнее исправление: borschov (всего исправлений: 1)
Ответ на: комментарий от u5er


Типа пробросился контроллер.
Совпадает вывод lspci -nn в ВМ и на хосте.


Но я не вижу в выводе lsusb устройства которое вставлено в контроллер.
Разве оно не должно было проброситься всместе с контроллером?

borschov
() автор топика
Ответ на: комментарий от u5er


Пробросил и второй. Их всего 2, и тоже нет устройства в выводе
lsusb.

У некоторых я встречал советы добавлять в blacklist загрузку
контроллера на хосте. Вы так делали?

borschov
() автор топика
Ответ на: комментарий от borschov

У меня на материнке есть юсб контроллер 3.0, который может прикинуться двумя контроллерами юсб 2.0, если в биосе отключить 3.0 юсб. Я опытным путём выяснил, какие порты относятся к какому контроллеру и нужный пробросил в виртуалку с виндой. Далее я просто подключал устройства в портам проброшенного контроллера и они определялись в винде.

добавлять в blacklist

В blacklist я ничего не добавлял. Я написал небольшой шелл-скрипт, который перецепляет дрова и после его работы устройства, проброшенные устройства уже не доступны с хоста.

Пробросил и второй. Их всего 2, и тоже нет устройства в выводе lsusb.

А на хосте эти устройства остались в выводе lsusb?

u5er ★★
()