Ich habe versucht in einigen passthrough tutorials die Lösung für mein Problem zu finden aber die beschäftigen sich nicht mit der Fehlermeldung ( FM ), die ich bekomme.
Ich versuche Windows 10 in einer VM zu installieren, der ich GPU und NVME Laufwerk durchreiche.
Bisher gibt es noch folgende Probleme:
1. NVME SSD -> #NVME#
2. Windows 10 Installation #WIN10#
3. Netzwerkbrücke
Inhalt:
###SYSTEM-SPECS###
###DISCLAIMER###
###BENUTZER-ALS-SUDOER-EINTRAGEN###
###SUDOER-PASSWORTABFRAGE-AUS###
###CPU-VIRTUALISIERUNG-TESTEN###
###PAKETE###
###INSTALLATION-ÜBERPRÜFEN###
##LIBVIRTD.SERVICE##
##VFIO-KERNEL-MODUL+ANZEIGE-ALLER-VFIO-MODULE##
##VFIO-SYSTEMSTARTEINTRAG##
##IOMMU-GRUPPEN-ANZEIGEN##
##GRUB-BOOTMANAGER-PCIE-KARTEN-DURCHREICHEN##
##PCIE-KARTEN-VFIO-TREIBER-ZUWEISEN##
##UNBEKANNT##
[...]
###SYSTEM-SPECS###
CPU: Ryzen 5950X
Mainboard: MSI X570-A Pro
GPU: AMD Radeon RX 590
2 NVME SSDs:
1. WD Blue SN850 1TB 4x PCIe 4.0 direkt an der CPU (Windows 10)
2. WD Blue SN550 2TB 4x PCIe 3.0 über Chipset (Linux + Lager)
###DISCLAIMER###
Was ich hier Schreibe soll nachvollziehbar Dokumentieren, wie ich die VM aufgesetzt habe.
Bisher ist es nur ein Entwurf, da ich noch einige Probleme mit mit der VM habe.
Alles was Ihr hier mach ist auf Eure eigene Gefahr, ich hafte nicht für etwaige Schäden, die Ihr direkt oder indirek an Eurem System mit diesem Tutorial anrichtet.
###BENUTZER-ALS-SUDOER-EINTRAGEN###
Da Ihr eine ganze Menge Sachen als Root machen müßt rate ich dazu dem Benutzer, der die VMs laufen lassen soll mindestens temporär als Sudoer einzutragen.
!!!Warnung mögliches Sicherheitsrisiko!!!
Es ist natürlich auch gefählich, vom Sicherheitsstandpunkt aber dieses Tutorial ist auch nicht für eine Produktionsumgebung, da ich ein Anfänger bin und die Folgen der Befehle und Einstellungen nicht abschätzen kann.
Ist auch von der Menge her zu viel, jedenfalls ... .
Als Root ausführen, um Benutzer zur sudo Gruppe hinzuzufügen:
Code: Alles auswählen
usermod -aG sudo Benutzername
###SUDOER-PASSWORTABFRAGE-AUS###
Damit man nicht ständig nach dem Passwort gefragt wird wenn man sudo benutzt
kann man die sudoers Datei bearbeiten,
um vorher den Editor auswählen zu können muß noch eine Umgebungsvariable überprüft werden:
Code: Alles auswählen
EDITOR=nano visudo
Code: Alles auswählen
visudo
Code: Alles auswählen
[...]
Benutzername ALL=(ALL) NOPASSWD:ALL
###NEUSTART###
Falls Ihr an einer Stelle nicht weiterkommt hilft vielleicht ein Neustart.
Alles speichern und dann:
Code: Alles auswählen
shutdown -r now
Wartet nur bis Ihr Debians KDE Plasma Neustart und Shutdown kennenlernt,
dagegen ist sogar Windows Ruhezustand bei 32GiB und einer 1TB SATA SSD schnell.
Nur wenn Ihr das now verwendet geht es flott, sonst könnt Ihr den Kaffee rausholen.
Interessant das sich das seit den 70ern nicht geändert hat.
=> Automatische Kaffepause eingeleitet
###CPU-VIRTUALISIERUNG-TESTEN###
Erstmal testen wir ob die CPU Virtualisierung unterstützt, bei allen neueren CPUs seit 2017 und davor sollte es der Fall sein:
VT-d is Intel jargon.
AMD-v oder SVM für AMD.
Im BIOS / UEFI schaun ob es an ist.
Wenn Du nicht weist was ein BIOS oder UEFI ist bitte mach Dich mit Google schlau.
Kann leider nicht alles hier behandeln.
Hier sind die Befehle, um zu überprüfen ob es in Linux läuft:
AMD:
Code: Alles auswählen
dmesg | grep AMD-Vi
Code: Alles auswählen
cat /proc/cpuinfo | grep svm
Code: Alles auswählen
dmesg | grep "Virtualization Technology for Directed I/O"
Code: Alles auswählen
[...]
AMD-Vi: Enabling IOMMU at 0000:00:00.2 cap 0x40
AMD-Vi: Lazy IO/TLB flushing enabled
AMD-Vi: Initialized for Passthrough Mode
[...]
Code: Alles auswählen
[...]
[ 0.902214] DMAR: Intel(R) Virtualization Technology for Directed I/O
[...]
###PAKETE###
Bevor es richtig los geht erst einmal alle Pakete installieren (als root):
Code: Alles auswählen
apt install virt-manager qemu-kvm libvirt-clients quemu-system qemu-system-x86 libvirt-daemon-system bridge-utils virtinst libvirt-daemon ovmf pciutils ebtables dnsmasq
ebtables ist ein Ethernet Regel Management Befehl und
dnsmasq ist ein DNS forwarder, ein DHCP Server und ein Name Cache optimiert für Telefon Modem Verbindungen, also das Ding was die komischen Töne bei der Einwahl macht:
ALL Old Modem Sounds (300 baud to 56K)
Code: Alles auswählen
https://www.youtube.com/watch?v=ckc6XSSh52w
Dieses Tutorial wurde mit Debian in KDE PLASMA erstellt, also gibt es den Kode dafür:
Code: Alles auswählen
apt install task-kde-desktop
Wenn alles gut ging sollte KDE PLASMA nach dem Neustart automatisch laden, sonst:
###INSTALLATION-ÜBERPRÜFEN###
##LIBVIRTD.SERVICE##
Nach der Installation soltet Ihr auch überprüfen ob der libvirt service läuft:
Code: Alles auswählen
systemctl status libvirtd.service
Code: Alles auswählen
[...]
[...] active (running) [...]
[...]
##VFIO-KERNEL-MODUL+ANZEIGE-ALLER-VFIO-MODULE##
Diese Befehle laden das vfio-pci Kernel-Modul und überprüfen ob es geladen ist.
Code: Alles auswählen
###VFIO
#starte VFIO Modul
modprobe vfio-pci
#Teste ob das VFIO Modul geladen ist
lsmod | grep vfio
Code: Alles auswählen
[...]
vfio_pci 69632 0
vfio_virqfd 16384 1 vfio_pci
vfio_iommu_type1 36864 0
vfio 40960 2 vfio_iommu_type1,vfio_pci
irqbypass 16384 2 vfio_pci,kvm
[...]
Dieser Befehl trägt die Zeichenkette (String) 'vfio-pci' in die Datei vfio-pci.conf im Verzeichnis /etc/modules-load.d/
Das bewirkt das es beim Systemstart geladen wird.
Kann sein das der Debian Kernel das im Kernel integriert hat oder vielleicht auch nicht.
Code: Alles auswählen
echo 'vfio-pci' > /etc/modules-load.d/vfio-pci.conf
##IOMMU-GRUPPEN-ANZEIGEN##
Die IOMMU Gruppen bekommt man mit:
Code: Alles auswählen
for d in /sys/kernel/iommu_groups/*/devices/*;
do n=${d#*/iommu_groups/*};
n=${n%%/*};
printf 'IOMMU Group %s ' "$n";
lspci -nns "${d##*/}";
done;
Ausgabe IOMMU Gruppen:
Code: Alles auswählen
[...]
IOMMU Group 14 01:00.0 Non-Volatile memory controller [0108]: Sandisk Corp WD Black SN850 [15b7:5011] (rev 01)
[...]
IOMMU Group 27 2d:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] [1002:67df] (rev e1)
IOMMU Group 27 2d:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590] [1002:aaf0]
[...]
Ihr könnt also über beide Anschlußarten, wenn es unterstützt wird vom Monitor auch Audio über Lautsprecher des selbigen ausgeben, ohne noch ein extra Kabel für Audio anzuschließen.
Sollte da ein Fehler angezeigt werden überprüft nochmal ob CPU "VT-d / Intel jargon, AMD-v oder SVM / AMD" im BIOS / UEFI angeschaltet ist.
##GRUB-BOOTMANAGER-PCIE-KARTEN-DURCHREICHEN##
In GRUB solltet Ihr dann noch als root was anpassen, ganzen Abschnitt lesen:
Code: Alles auswählen
nano /etc/default/grub
intel_iommu=on
AMD CPU:
amd_iommu=on
In der Konfigurationsdatei, dann folgende Zeile anpassen:
Code: Alles auswählen
GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on iommu=pt kvm.ignore_msrs=1 vfio-pci.ids="15b7:5011,1002:67df,1002:aaf0""
Danach als root:
Code: Alles auswählen
update-grub
Code: Alles auswählen
grub-mkconfig -o /boot/grub/grub.cfg
Wenn die FM:
Code: Alles auswählen
/usr/sbin/grub-mkconfig: 33: /etc/default/grub: Syntax error: EOF in backquote substitution
Das auf backquotes "hingewiesen" wird ist irreführend. Der / Die Programmierer sollten die FM ändern, vielleicht schreib ich denen nochmal eine Email.
Ist nicht geklärt ob das hier hilft? Als Benutzer ausführen:
Code: Alles auswählen
newgrp libvirt
sudo usermod -a -G libvirt $(whoami)
newgrp kvm
sudo usermod -a -G kvm $(whoami)
newgrp qemu
sudo usermod -a -G qemu $(whoami)
newgrp audio
sudo usermod -a -G audio $(whoami)
newgrp kvm
sudo usermod -a -G kvm $(whoami)
Ich konnte die NVME SSD endlich dem Treiber zuweisen:
Code: Alles auswählen
echo 15b7 5011 > /sys/bus/pci/drivers/vfio-pci/new_id
Code: Alles auswählen
[i]01:00.0[/i] 0108: 15b7:5011 (rev 01)
[b]Subsystem: 15b7:5011[/b]
Kernel modules: nvme
Code: Alles auswählen
01:00.0 0108: 15b7:5011 (rev 01)
Subsystem: 15b7:5011
Kernel driver in use: vfio-pci
Kernel modules: nvme
Bitte um Rückmeldung.
Der nächste Kodeschnipsel weist aber auf jeden Fall den Geräten den vfio Treiber zu.
Bei der Soundkarte der Graka ist es bei mir schon überflüssig, da die permanente Zuweisung schon funktioniert hat.
Solange die nicht funktioniert müßt Ihr den folgenden Kode nach jedem Neustart wieder ausführen, bis es mit der permanenten Bindung funktioniert. Der Kode dafür ist weiter unten, ich werde den aber erst testen, wenn ich die Windowsinstallation hinbekomme.
Also immer vorm VM Start Kode ausführen.
Ob die Bindung permanent ist / war seht Ihr dann bei der Ausgabe:
Code: Alles auswählen
#NVME SSD
lspci -nkks 01:00.0
#unbind NVME SSD
echo "0000:01:00.0" > /sys/bus/pci/drivers/nvme/unbind
#ID der NVME SSD an vfio Treiber übergeben bzw. neu eintragen
echo 15b7 5011 > /sys/bus/pci/drivers/vfio-pci/new_id
#check if NVME is bound
lspci -nkks 01:00.0
#GPU
lspci -nkks 2d:00.0
#unbind GPU
echo "0000:2d:00.0" > /sys/bus/pci/devices/0000:2d:00.0/driver/unbind
#ID der GPU an vfio Treiber übergeben bzw. neu eintragen
echo 148c 2391 > /sys/bus/pci/drivers/vfio-pci/new_id
#check if GPU is bound
lspci -nkks 2d:00.0
#GPU Audio
lspci -nkks 2d:00.1
#unbind GPU Soundkarte
echo "0000:2d:00.1" > /sys/bus/pci/devices/0000:2d:00.1/driver/unbind
#ID der GPU Soundkarte an vfio Treiber übergeben bzw. neu eintragen
echo 148c aaf0 > /sys/bus/pci/drivers/vfio-pci/new_id
#check if Audio is bound
lspci -nkks 2d:00.1
Ausgabe Beispiel für die NVME SSD:
Code: Alles auswählen
01:00.0 0108: 15b7:5011 (rev 01)
Subsystem: 15b7:5011
Kernel driver in use: vfio-pci
Kernel modules: nvme
Code: Alles auswählen
Kernel driver in use:
Code: Alles auswählen
vfio-pci
##UNBEKANNT##
Weis auch nicht ob man das hier braucht, vielleicht kann da jemand nochmal 'ne info absetzen:
Mehr Berechtigungen für qemu:
Code: Alles auswählen
nano /etc/udev/rules.d/10-qemu-hw-users.rules
Code: Alles auswählen
[...]
SUBSYSTEM=="vfio", OWNER="root", GROUP="kvm"
Code: Alles auswählen
SUBSYSTEM=="pci", ATTR{idVendor}=="15b7", ATTR{idProduct}=="5011" OWNER="root", GROUP="kvm"
SUBSYSTEM=="pci", ATTR{idVendor}=="1002", ATTR{idProduct}=="67df" OWNER="root", GROUP="kvm"
SUBSYSTEM=="pci", ATTR{idVendor}=="1002", ATTR{idProduct}=="aaf0" OWNER="root", GROUP="kvm"
Antwort NEIN weiter unten oder Fehler?!
Wie trage ich die GPU da ein oder muß ich das?
Danach die Regeln neuladen :
Code: Alles auswählen
sudo udevadm control --reload-rules
sudo udevadm trigger
Code: Alles auswählen
ls -la /dev/vfio
ls -la /dev/bus/pci/*
Code: Alles auswählen
[...]
crw-rw---- 1 root kvm 244, 0 Feb 8 16:13 1
Code: Alles auswählen
ls: Zugriff auf '/dev/bus/pci/*' nicht möglich: Datei oder Verzeichnis nicht gefunden
Hier ist auch ungeklärt ob der Kode was bringt:
Apparmor (als root oder am Anfang mit su):
Code: Alles auswählen
nano /etc/apparmor.d/abstractions/libvirt-qemu
Code: Alles auswählen
[...]
/dev/vfio/* rw,
Code: Alles auswählen
sudo /etc/init.d/apparmor restart
Code: Alles auswählen
Restarting apparmor (via systemctl): apparmor.service.
Code: Alles auswählen
nano /etc/libvirt/qemu.conf
Code: Alles auswählen
[...]
cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/kvm", "/dev/kqemu",
"/dev/rtc","/dev/hpet", "/dev/vfio/vfio",
"/dev/vfio/1"
]
[...]
Ganz unten mit 1 und 3 versucht, wegen der Graka (GPU und HDMI Audio) sowie der NVME / M.2 SSD.
Denke das ich noch chown und chmod ausführen muß, jedenfalls laut des VFIO Artikels (/dev/vfio/$GROUP).
Also:
Code: Alles auswählen
chown benutzername /dev/vfio/14
chown benutzername /dev/vfio/27
chmod 700 /dev/vfio/14
chmod 700 /dev/vfio/27
Code: Alles auswählen
chown: Zugriff auf '/dev/vfio/14' nicht möglich: Datei oder Verzeichnis nicht gefunden
chmod: Zugriff auf '/dev/vfio/14' nicht möglich: Datei oder Verzeichnis nicht gefunden
Also IOMMU Artikel nochmal durchstöbern und Befehle finden (root?):
Code: Alles auswählen
lspci -nnk #Zeigt alle Geräte an.
lspci -nkks 01:00.0 #Zeigt nur das Gerät mit der ID "01:00.0" an.
Code: Alles auswählen
01:00.0 Non-Volatile memory controller [0108]: Sandisk Corp WD Black SN850 [15b7:5011] (rev 01)
Subsystem: Sandisk Corp WD Black SN850 [15b7:5011]
Kernel driver in use: nvme
Kernel modules: nvme
also (als root):
Code: Alles auswählen
echo "0000:01:00.0" > /sys/bus/pci/drivers/nvme/unbind
Code: Alles auswählen
lspci -nkks 01:00.0
Code: Alles auswählen
01:00.0 0108: 15b7:5011 (rev 01)
Subsystem: 15b7:5011
Kernel modules: nvme
FM:
Code: Alles auswählen
Fehler beim Starten der Domain: Failed to add driver 'vfio-pci' to driver_override interface of PCI device '0000:01:00.0': Permission denied
Traceback (most recent call last):
File "/usr/share/virt-manager/virtManager/asyncjob.py", line 65, in cb_wrapper
callback(asyncjob, *args, **kwargs)
File "/usr/share/virt-manager/virtManager/asyncjob.py", line 101, in tmpcb
callback(*args, **kwargs)
File "/usr/share/virt-manager/virtManager/object/libvirtobject.py", line 57, in newfn
ret = fn(self, *args, **kwargs)
File "/usr/share/virt-manager/virtManager/object/domain.py", line 1329, in startup
self._backend.create()
File "/usr/lib/python3/dist-packages/libvirt.py", line 1353, in create
raise libvirtError('virDomainCreate() failed')
libvirt.libvirtError: Failed to add driver 'vfio-pci' to driver_override interface of PCI device '0000:01:00.0': Permission denied
Ich konnte die NVME SSD endlich dem Treiber zuweisen:
Code: Alles auswählen
echo 15b7 5011 > /sys/bus/pci/drivers/vfio-pci/new_id
Code: Alles auswählen
[i]01:00.0[/i] 0108: 15b7:5011 (rev 01)
[b]Subsystem: 15b7:5011[/b]
Kernel modules: nvme
Code: Alles auswählen
01:00.0 0108: 15b7:5011 (rev 01)
Subsystem: 15b7:5011
Kernel driver in use: vfio-pci
Kernel modules: nvme
Quellen:
GPU passthrough für Benutzer (qemu:///session) von Evonide (Englisch):
https://www.evonide.com/non-root-gpu-pa ... assthrough
https://wiki.ubuntuusers.de/Dnsmasq/
https://linux.die.net/man/8/ebtables
IOMMU Gruppen anzeigen (Englisch):
https://www.heiko-sieger.info/iommu-gro ... pabilities
Neueres GRUB update tutorial (Englisch):
https://itsfoss.com/update-grub/
Seite über VFIO mit Programmbeispiel (Englisch)
https://www.kernel.org/doc/html/latest/ ... /vfio.html
Windows in KVM virtueller Maschine aufsetzen (Englisch):
https://www.heiko-sieger.info/running-w ... ssthrough/
Prüfen und laden des kvm_amd kernel moduls.
Sicher stellen daß SVM Mode an ist (Englisch):
https://superuser.com/questions/1140885 ... or-the-kvm
https://www.claudiokuenzler.com/blog/95 ... ualization
Siehe oben + Extras (Englisch):
https://unix.stackexchange.com/question ... -available
ulimit Grenzen für Gruppen setzen unmöglich:
Was ist ein corefile (Englisch):
https://community.intersystems.com/post ... hey-useful
memlock für mehr Speicher (Englisch):
https://bbs.archlinux.org/viewtopic.php?id=253885
Wie bekomme ich meine Maus (Englisch):
https://unix.stackexchange.com/question ... m-qemu-kvm
Die obige Liste ist nicht vollständig, da ich einige Quellen nicht mehr finde.
...