Kannst du nicht einen Wiki-Artikel zum Thema machen?
Ich habs geahnt 😉 Bevor ich mich aber evtl. über einen Wiki-Artikel mache, werde ich erstmal hier von meinen Erfahrungen berichten. Es gibt auch noch einiges an Optimierungsbedarf.
Mein Ziel war es, ein virtuelles Windows zum Spielen zu installieren, das sich im Hinblick auf Leistung und Netzwerk wie ein real installiertes Windows verhält. Zudem sollte Qemu mit User-Rechten laufen und der Netzwerkzugriff des Gastes per Firewall eingeschränkt werden.
Beteiligte Hardware:
CPU: Intel i7-6700K mit integrierter GPU (Host)
GPU: Radeon R9 390 (Gast) mit HDMI Audio (nicht verwendet)
Onboard HD Audio (Gast)
USB Maus und Tastatur (Gast)
Im Bios habe ich VT-d aktiviert und die integrierte Grafik als Primärgrafik eingestellt. Leider ist für die Intel Grafik (i915) der VGA Arbiter Patch nötig, denn das Starten der VM zerstört die Grafik am Hostsystem. Das Bild wird dann sehr bunt und pixelig, das will man nicht! Also hab ich mir noch einen gepatchten Kernel gebaut.
Einige Schritte sind wahrscheinlich nicht nötig (z.B. das Deinstallieren des Netzwerk-Managers, wird wohl auch anders gehen) oder gar falsch oder oder...
Propietären Treiber fglrx und Netzwerk-Manager deinstallieren, benötigte Pakete installieren und User der Gruppe "kvm" hinzufügen. Benutzer "tnt" muß natürlich durch den eigenen ersetzt werden. Die Ausgaben sind jeweils auf das nötige Minimum gekürzt.
sudo apt-get remove fglrx* network-manager*
sudo apt-get install bridge-utils ebtables uml-utilities
sudo usermod -aG kvm tnt
Meine Bootoptionen:
intel_iommu=on pcie_acs_override=downstream intremap=no_x2apic_optout noplymouth
/etc/modprobe.d/blacklist-radeon.conf
blacklist radeon
/etc/modules
vfio
vfio_pci
vfio_iommu_type1
kvm
options kvm ignore_msrs=1
kvm_intel
br_netfilter
ebt_ip
ebt_snat
PCI-ID's ermitteln, vorhandene Treiber von Hardware lösen und an vfio binden
$ lspci -nn
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii XT [Radeon R9 290X] [1002:67b0] (rev 80)
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Hawaii HDMI Audio [1002:aac8]
00:1f.3 Audio device [0403]: Intel Corporation Sunrise Point-H HD Audio [8086:a170] (rev 31)
/etc/rc.local
echo 0000:01:00.0 >/sys/bus/pci/devices/0000:01:00.0/driver/unbind || true
echo 0000:01:00.1 >/sys/bus/pci/devices/0000:01:00.1/driver/unbind || true
echo 0000:00:1f.3 >/sys/bus/pci/devices/0000:00:1f.3/driver/unbind || true
echo 1002 67b0 >/sys/bus/pci/drivers/vfio-pci/new_id || true
echo 1002 aac8 >/sys/bus/pci/drivers/vfio-pci/new_id || true
echo 8086 a170 >/sys/bus/pci/drivers/vfio-pci/new_id || true
PC neustarten und dmesg Ausgabe anschauen. Nun wird die IOMMU Gruppe(n) und USB ID's(Maus, Tastatur) der durchzureichenden Hardware benötigt
$ dmesg | grep -i iommu
[ 0.585559] iommu: Adding device 0000:00:1f.3 to group 9
[ 0.585799] iommu: Adding device 0000:01:00.0 to group 1
[ 0.585878] iommu: Adding device 0000:01:00.1 to group 1
$ lsusb
Bus 001 Device 004: ID 046d:c069 Logitech, Inc. M-U0007 [Corded Mouse M500]
Bus 001 Device 003: ID 046d:c517 Logitech, Inc. LX710 Cordless Desktop Laser
Rechte ändern für User-Mode
/etc/udev/rules.d/40-permissions.rules
KERNEL=="tun", OWNER="tnt", GROUP="kvm", MODE="0660"
KERNEL=="vfio", OWNER="tnt", GROUP="kvm", MODE="0660"
KERNEL=="1", SUBSYSTEM=="vfio", OWNER="tnt", GROUP="kvm"
KERNEL=="9", SUBSYSTEM=="vfio", OWNER="tnt", GROUP="kvm"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c069", OWNER="tnt", GROUP="kvm", MODE="0660"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c517", OWNER="tnt", GROUP="kvm", MODE="0660"
RAM-Limit für Benutzer erhöhen, hier 20 GB
/etc/security/limits.conf
tnt hard memlock 20000000
tnt soft memlock 20000000
/etc/pam.d/common-session
session required pam_limits.so
/etc/sysctl.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-filter-vlan-tagged=1
/etc/network/interfaces
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge-ports enp9s0 tap0
bridge-stp 0
auto enp9s0
iface enp9s0 inet manual
up ip link set enp9s0 promisc on up
up brctl addif br0 enp9s0
down brctl delif br0 enp9s0 || true
down ip link set enp9s0 down
auto tap0
iface tap0 inet manual
pre-up /usr/sbin/tunctl -t tap0 -u tnt -g kvm
up ip link set tap0 promisc on up
up brctl addif br0 tap0
down brctl delif br0 tap0 || true
down ip link set tap0 down
Skript zum Starten der virt. Maschine. Die Angabe einer (Fantasie)MAC-Adresse für Qemu ist optional, muß sich aber von vorhanden im System unterscheiden. Außerdem dauert es bei mir ca. 2 Min, bis der vfio Treiber an die Grafikkarte gebunden ist, weshalb ich hier noch eine Prüfung eingebaut habe. Und da ich nur eine Tastatur am PC hängen habe, nutze ich im Hostsystem onboard für Tastatureingaben.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | #!/bin/bash
mac=40:8d:5c:54:3a:b9
i=0
until lspci -nnk | grep -q vfio-pci; do
sleep 1
i=$((i+1))
echo -en "Warte auf vfio $i\r"
done
sleep 3
echo
ps -C onboard >/dev/null || onboard &
export QEMU_AUDIO_DRV=alsa
export QEMU_AUDIO_TIMER_PERIOD=0
echo "\"Starte Windows 7\""
qemu-system-x86_64 -enable-kvm -M q35 -m 16384 -vga none -usb \
-bios /usr/share/seabios/bios.bin \
-soundhw ac97 -cpu host,kvm=off -smp 4,sockets=1,cores=4,threads=1 \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,host=01:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \
-device vfio-pci,host=01:00.1,bus=pcie.0 \
-device vfio-pci,host=00:1f.3 \
-usbdevice host:046d:c069 \
-usbdevice host:046d:c517 \
-hda /home/tnt/qemu/Windows.qcow \
-net nic,vlan=0,macaddr=$mac \
-net tap,vlan=0,ifname=tap0,script=no \
-localtime -name "Windows 7"
|