Archiv der Kategorie: Allgemein

KVM: PCI Passthrough

Besitzt CPU und Chipset die VT-d Erweiterung, lassen sich mittel KVM Hardware zur VM durch reichen. Das geht mit Grafikkarten, Netzwerkkarte, Decklink SDI Karten usw.

Um das zu ermöglichen muss Ubuntu dafür vorbereitet werden:

1. Module lasen:

nano /etc/modules

# KVM hardware passthrugh
pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel

2. Grub Bootlader anpassen:

nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on"

update-grub
reboot

3. Hardware die weitergereicht werden soll ermitteln und eintragen:

lspci -nn

Ausgabe z.B.: 04:00.0 Multimedia video controller [0400]: Blackmagic Design DeckLink SDI/Duo/Quad [bdbd:a11b]

nano /etc/initramfs-tools/modules

pci_stub ids=bdbd:a11b

sudo update-initramfs -u

reboot

Nach Reboot prüfen ob Hardware deaktiviert ist:

dmesg | grep pci-stub

Wenn in etwa soetwas raus kommt:

[    1.437427] pci-stub: add BDBD:A11B sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    1.437482] pci-stub 0000:04:00.0: claimed by stub

hat alles geklappt. Nun kann in virt-manager die Hardware dem Guest zugewiesen werden.

 

Referenzen:

https://www.pugetsystems.com/labs/articles/Multiheaded-NVIDIA-Gaming-using-Ubuntu-14-04-KVM-585/

https://wiki.debian.org/VGAPassthrough

How to configure PCI-passthrough on virt-manager

http://vfio.blogspot.de/2015/05/vfio-gpu-how-to-series-part-1-hardware.html

 

KVM optimieren

Hier soll eine Sammlung entstehen, wie KVM und deren Gäste optimiert werden können.

Host:

Um VT-d zu nutzen, braucht Grub einen zusätzlichen Eintrag, in der Zeile:

GRUB_CMDLINE_LINUX_DEFAULT=

das anfügen:

intel_iommu=on

und Grub updaten:

sudo update-grub

Es sollte auf dem Host kontrolliert werden ob es Prozesse gibt, die mehrere CPU Kerne in Anspruch nehmen. Z.B. Squid in Kombination mit Spuidguard startet mehrere Instanzen. Das kann zu Latenz Probleme im Guest führen. Auch Apache macht das.

low-latency Kernel kann helfen die VMs performanter zu machen, bzw. die Reaktionszeiten zu verkürzten. Besonders bei Anwendungen die geringe Latenz brauchen, wie Audio/Video Applikationen, ist das von Vorteil. Dadurch wird die Kernel Timer Frequency auf 1000 Hz erhöht und es werden Preemptible Funktionen aktiviert.

Auf Seiten des Host kann die Priorität einer VM, mit Bordmitteln, verändert werden. Ein Script als Cronjob (z.B. alle 10 Minuten) kann hier Abhilfe schaffen:

#!/bin/bash

# Name der zu priorisierenden VM
vmName="$VMName"

# PID, nice Priorität und IO State ermitteln
vmPID="$( ps ax | awk '/qemu-system-x86_64/ && /'"$vmName"'/ && !/awk/{ print $1 }' )"

if [[ -n "$vmPID" ]]; then
        nID="$( ps -o nice -p $vmPID | awk '/[0-9]+/{ p=$NF } END{ print p }' )"
        ioStat="$( ionice -p $vmPID | awk '/none/{ print }' )"
fi

ffPID="$( ps ax | awk '/ffmpeg -nostats -v info -hide_banner -re/ && !/awk/{ print $1 }' )"

if [[ -n "$ffPID" ]]; then
        ffID="$( ps -o nice -p $ffPID | awk '/[0-9]+/{ p=$NF } END{ print p }' )"
        ffioStat="$( ionice -p $ffPID | awk '/none/{ print }' )"
fi

# Priosisierungswerte
vmPrio="-10"
vmIOCl="2"
vmIOPr="0"

# Wenn nice nicht den gewünschten Wert hat, wird dieser gesetzt
if [[ -n "$nID" ]] && (( $nID >= 0 )); then
        renice -n $vmPrio -p $vmPID >/dev/null 2>&1
fi

if [[ -n "$ffID" ]] && (( $ffID >= 0 )); then
        renice -n $vmPrio -p $ffPID >/dev/null 2>&1
fi

# Wenn IO Class 'none' ist, wird diese erhöht
if [[ -n "$ioStat" ]]; then
        ionice -c $vmIOCl -n $vmIOPr -p $vmPID -t >/dev/null 2>&1
fi

if [[ -n "$ffioStat" ]]; then
    ionice -c $vmIOCl -n $vmIOPr -p $ffPID -t >/dev/null 2>&1
fi

exit 0

Disk Performance:

driver name='qemu' type='raw' cache='none' io='native'

Cache none ist das beste, funktioniert aber nicht wenn das VM Image auf einem ZFS Dateisystem liegt. Hier kann auch writeback genommen werden, muss aber mit Vorsicht geschehen. Bei writeback gibt es keine Sicherheit und es kann schnell zu Datenverlust kommen.

Als Image Format ist raw zu bevorzugen. Noch besser ist es eine Festplatte komplett durch zu reichen.

Für VM Images, besonders in Kombination mit Linux bringt das „Deadline“ Scheduling etwas mehr an Festplattenperformance. Muss im Host und im Guest eingestellt werden.

Windows in VM:

Unbedingt virtio Treiber verwende! Schon beim Einrichten der virtueller Hardware virtio wählen.

Für Netzwerkdienste Checksum Offload im Netzwerk Interface deaktivieren (Geräte Manager). Zum testen ob die Checksum korrekt ist, kann ein IP Stream gestartet werden, z.B. mit udp (ffmpeg), auf dem Host kann dann mit tcpdump der Stream geprüft werden:

tcpdump -i ethX -n dst port 1234 -s0 -vv

Taucht bad udp cksum […] auf, muss Checksum Offload deaktiviert werden, in dem Fall für UDP.

KVM beherrscht HyperV Funktionen, diese sollen zusätzlich etwas Leistung bei Windows VMs bringen:

virt-xml $VMNAME --edit --features hyperv_relaxed=on,hyperv_vapic=on,hyperv_spinlocks=on,hyperv_spinlocks_retries=8191

Guest Allgemein:

CPU Pinning kann sinnvoll sein. Wird vor allem bei mehr Prozessor Systemen empfohlen, um zu vermeiden, dass ein Thread auf den Speicher des anderen Prozessors zugreifen muss.

OVMF Bios sollte man im Auge behalten und gegebenenfalls installieren und beim Einrichten der VM auswählen. Für Windows 10 ist es z.B. empfehlenswert ein UEFI Bios zu nutzen, das geht nur mit OVMF

IOthreads zu aktivieren kann bei mehreren HDs Sinn machen. Muss über virsh edit VMName gemacht werden.

Weitere CPU Tuning Optionen sind möglich, z.B. vCPU Scheduling, einfach mal getesten.

Ubuntu: Systeminfos anzeigen lassen

Wenn man einen Ubuntu/Linux Server betreiben möchte kann es manchmal praktisch sein, sich einige Systeminfos ausgeben zu lassen.

Hier ein Beispiel wie diese Infos automatisch, nach jedem Login, ausgegeben werden.

Script mit folgenden Inhalt anlegen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
 
echo ""
 
free -h | grep "used\|Mem"
echo ""
 
echo CPU: `ps aux | awk {'sum+=$3;print sum'} | tail -n 1`%
echo ""
 
df -h | grep -v "boot\|user\|shm\|lock\|run\|udev\|cgroup"
echo ""
 
echo "running processes:"
echo total: `ps aux | wc -l`
echo user:  `ps -U $USER | wc -l`
echo ""
echo current ssh logins: `who | grep -v localhost | wc -l`
echo ""

 

Ausführbar machen:

chmod 755 loginInfo.sh

Pfad zum Script in /etc/profile schreiben.

Nach dem nächsten Login, auch über ssh wird nun das angezeigt:

             total       used       free     shared    buffers     cached
Mem:          6,1G       315M       5,8G       588K        15M       173M
 
CPU: 0.1%
 
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/nas--vg-root  1,5G  1,3G   83M  94% /
 
running processes:
total: 150
user: 9
 
current ssh logins: 2

 

Ubuntu über VirtualBox auf USB Stick installieren

VirtualBox sieht es eigentlich nicht vor, dass man einen USB Stick darüber bootet, bzw. den Stick als Zielfestplatte auswählen kann.

Hier ein paar Schritte wie man das dennoch hin bekommt. Anschließend lässt sich der USB Stick sogar über den PC booten, somit hat man überall sein Ubuntu System dabei.

 

Vorbereitung:

Zuerst müssen wir VirtualBox dazu bekommen, dass es den USB Stick als Festplatte akzeptiert. Dazu navigieren wir mit der Kommandozeile ( Windowstaste+R: cmd :: Enter ) in den Installationsordner von VirtualBox. Hier führen wir nun folgendes aus:

VBoxManage internalcommands createrawvmdk -filename "%USERPROFILE%\VirtualBox VMs\UbuntuUSB\UbuntuUSB.vmdk" -rawdisk \\.\PhysicalDrive<Datenträgernummer>.

cmd

Die Datenträgernummer erfährt man über die Computerverwaltung / Datenträgerverwaltung:

Verwaltung

 

USB Stick partitionieren und formatieren

Mir war es nicht möglich, während der Installation in VirtualBox Partitionen einzurichten und zu formatieren, das ist aber notwendig, da Ubuntu eine System Partition haben möchte und eine swap Partition. Zudem wollte ich auch eine Fat32 Partition haben, die ich später dann zum Datenaustausch verwenden kann.

Man hat hier nun zwei Möglichkeiten, entweder man booten in eine gewöhnlich installierte virtuelle Ubuntu Box, oder andere Linux Distribution, und richtet dort den USB Stick her mittels gparted. Oder man macht das mit einem anderen Partitionsprogramm, welches auch Linux Dateisystem versteht. Ich habe hier die Home Edition von Partition Wizard genommen ( MiniTool Partition Wizard 8 )

PartitionWizard

Die Fat32 Partition habe ich am Anfang positioniert, die Linux System Partition in der Mitte und die swap Partition ans Ende. Hier natürlich das jeweilige Dateisystem richtig auswählen. Fürs System ext4 und für swap swap.

 

In VirtualBox

Nun kann VirtualBox gestartet werden um Ubuntu auf den Stick zu installieren.

Zuerst richtet man ganz normal eine neue virtuelle Maschine ein, beim Abschnitt Festplatte wählen wir jedoch: Vorhandene Festplatte verwenden

Nun navigieren wir zu der Datei, die wir mit dem CMD Befehl am Anfang erstellt hatten und laden dadurch den USB Stick.

Festplatte

Ist dieser Schritt abgeschlossen kann mit einem Rechtsklick auf Änder, der neu erzeugten virtuellen Maschine, das System so angepasst werden wie man es möchte. Z.B. mehr CPU Kerne, mehr Grafikspeicher etc. Im Abschnitt Massenspeicher muss nun noch ein ISO Image von Ubuntu geladen werden, dann können wir die virtuelle Maschine starten um Ubuntu auf den Stick zu installieren.

cd

 

Gleich nach dem Starten wird schon das Installationsmenü von Ubuntu sichtbar. Im 4. Schritt kommen wir zur Auswahl wie und wo wir Ubuntu installieren wollen, hier muss: Etwas Anderes ausgewählt werden.

etwasanderes

Mit Weiter kommen wir nun in das Menü in dem die Partitionen aufgelistet werden. Hier nun die ext4 Partition auswählen und über Change… anpassen. Unter Benutzen muss Ext4-Journaling-Dateisystem ausgewählt und der Einbindungspunkt auf „/“ gestellt werden.

install

 

Die Swap Partition muss eigentlich nicht noch einmal extra eingebunden werden, aber sicherheitshalber kann hier auch überprüft werden, ob sie von der Installation richtig eingebunden wurde.

Ab hier ist wieder alles normal, das heißt die Installation kann wie gewohnt fortgesetzt werden.

Wie zu Anfang erwähnt kann der Stick nach Abschluss in jeder virtuellen Maschine aber auch an jedem Computer der das Booten von USB zulässt verwendet werden. Je schneller die Lese- und Schreibgeschwindigkeit ist umso mehr Freude hat man natürlich auch mit dem Portablen Ubuntu :)…

Viel Spaß damit!

 

Referenzen:

http://www.tecchannel.de/pc_mobile/tipps/2051591/virtualbox_von_usb_geraeten_booten/

http://code-bude.net/2013/02/12/ext4-partition-unter-windows-erstellen/

http://wiki.ubuntuusers.de/Installation_auf_externen_Speichermedien