Puncte:0

Legați/dezlegați dispozitivul PCI pe gazda Ubuntu

drapel tr

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.

Puncte:1
drapel cn

Pentru a face acest lucru manual, puteți utiliza același mod în care îl deconectați de la gazdă pentru a-l face disponibil pentru VM.

Ceva de genul acesta ar trebui să facă

echo 0000:04:00.0 | sudo tee /sys/bus/pci/devices/0000:04:00.0/driver/unbind
echo 10ec 8168 | sudo tee /sys/bus/pci/drivers/<host-driver-here>/new_id

Trebuie să știți care este driverul gazdă la care doriți să relegați dispozitivul, pentru a putea face asta

 lspci -n -v -s 0000:04:00.0

După o nouă repornire și căutați linia „Driver kernel în uz:”, veți avea acolo numele driverului

Puncte:0
drapel br

libvirt face dezlegarea și relegarea necesară pentru dvs. și se pare că restabilește și starea anterioară la oprirea VM.

Dacă nu faceți nimic legaturilor driverului înainte de pornirea VM, ar trebui să facă exact ceea ce doriți.

Alexander avatar
drapel tr
Dacă trec prin NIC către oaspete prin `virt-manager`, atunci apare pe invitat. Dar gazda vede și aceste dispozitive și arată conexiunea Ethernet și în tava de sistem. Trebuie să-l ascund complet pe gazdă. Deci, întrebarea rămâne: cum să relegați manual NIC la gazdă, după oprirea oaspeților.
drapel br
Ah, deci reapare dispozitivul este problema.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.