Trebuie să NIC dispozitivele pe gazdă:
# enumerați dispozitivele Ethernet PCI pentru a afla numele
lspci -nn | grep Ethernet
# 04:00.0 Controler Ethernet [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 Controler PCI Express Gigabit Ethernet [10ec:8168] (rev 06)
# 05:00.0 Controler Ethernet [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 Controler Ethernet Gigabit PCI Express [10ec:8168] (rev 15)
# pentru a obține <domeniu>.<autobuz>.<slot>.<funcție>
lspci -n -s 0000:04:00.0
# 04:00.0 0200: 10ec:8168 (rev 06)
Și vreau să trec prin dispozitivul 0000:04:00.0 la KVM
mașină virtuală ubuntu 20.04. Este posibil ca gazda să nu vadă acest dispozitiv când VM rulează. Pentru a lega PCI NIC la oaspete, am urmat cu succes instrucțiunile VFIO - „I/O funcție virtuală”. Dar dezlegarea de la oaspete la gazdă a fost mai dificilă.
Leagă manual dispozitivul NIC de la gazdă la oaspete, în felul următor:
# găsiți controlerul Ethernet
ls -l /sys/class/net/ | grep pci
# enp3s0 -> ../../devices/pci0000:00/0000:00:1c.5/0000:03:00.0/net/enp3s0
# enp4s0 -> ../../devices/pci0000:00/0000:00:1c.7/0000:04:00.0/net/enp4s0
lspci -nn | grep Ethernet
# 04:00.0 Controler Ethernet [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 Controler PCI Express Gigabit Ethernet [10ec:8168] (rev 06)
# 05:00.0 Controler Ethernet [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 Controler Ethernet Gigabit PCI Express [10ec:8168] (rev 15)
# verificați gruparea IOMMU
pentru un în /sys/kernel/iommu_groups/*; găsiți $a -tip l; terminat | sortare --versiune-sortare | grep '04:00\|05:00'
# /sys/kernel/iommu_groups/12/devices/0000:04:00.0
# /sys/kernel/iommu_groups/13/devices/0000:05:00.0
# găsiți adrese MAC
pentru eth în enp4s0 enp5s0; face ifconfig $eth | grep eter | echo "MAC" "$eth:" $(awk '{print $2}'); Terminat
# MAC enp4s0: 50:...
# MAC enp5s0: 18:...
# încărcați driverul de dispozitiv vfio-pci
modprobe vfio_pci
# deconectați de la gazdă
echo 0000:04:00.0 | sudo tee /sys/bus/pci/devices/0000:04:00.0/driver/unbind
# pune la dispoziție oaspeților
echo 10ec 8168 | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id
# Grupul IOMMU pentru dispozitivul 0000:04:00.0 este 12
# adăugați libvirt-qemu la sudoers
sudo usermod -aG sudo libvirt-qemu
sudo chown libvirt-qemu:libvirt-qemu /dev/vfio/12
# uită-te la ce alte dispozitive sunt în grup pentru a-l elibera pentru utilizare de către VFIO
ls -l /sys/bus/pci/devices/0000:04:00.0/iommu_group/devices | awk „{printează $9 $10 $11}”
# 0000:04:00.0->../../../../devices/pci0000:00/0000:00:1c.5/0000:04:00.0
# adăugați și alte dispozitive dacă aparțin aceluiași grup (nu este necesar în acest caz)
# asigurați-vă că dispozitivul nu este vizibil de la gazdă
ls -l /sys/class/net/ | grep enp4s0
Apoi am creat un nou Ubuntu 20.04 VM folosind Virtual Machine Manager (virt-manager) a alerga mai departe KVM.
Am adăugat un dispozitiv nou la VM editând configurația xml în virt-manager
în timpul creaţiei. În special, <devices>
secțiunea conține următoarea etichetă
<hostdev mode="subsystem" type="pci" managed="yes">
<driver name="vfio"/>
<source>
<address domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
</source>
<mac address='50:...'/>
<address type="pci">
<zpci uid="0x0001" fid="0x00000000"/>
</address>
</hostdev>
Apoi am instalat Ubuntu 20.04 în mod obișnuit. Sistemul repornește corect, fără blocaje (ecran negru).
Când opresc VM-ul, vreau să returnez PCI NIC la gazdă. Am făcut o cercetare pe forumuri, dar nu există instrucțiuni clare despre cum să fac asta.
Dacă repornesc gazda, toate dispozitivele revin la gazdă, astfel încât legarea vfio este eliberată. Dar cum pot face asta fără repornirea gazdei.