KVM mit OpenPOWER

Aus Thomas-Krenn-Wiki
Wechseln zu: Navigation, Suche

Bei Linux-basierten Betriebssystemen, und auch generell, gibt es eine Vielzahl an unterschiedlichsten Virtualisierungslösungen. KVM, also die Kernel-based Virtual Machine, gilt als performante Lösung und ist seit Kernel-Version 2.6.20 im Kernel integriert. Dieser Artikel zeigt die Installation und Konfiguration der KVM-Funktion anhand eines OpenPOWER POWER8-Systems.

OpenPOWER Server bei Thomas-Krenn

Installation

Der nachfolgende Abschnitt zeigt die Installation der erforderlichen Virtualisierungskomponenten auf einem OpenPOWER POWER8-System und zum Vergleich auf einem ein X86-System. Zum bequemen übertragen in die Kommandozeile sind nun die erforderlichen Pakete zur KVM-Virtualisierung für POWER8- sowie X86-Systeme aufgeführt.[1]

POWER8-System

Nachfolgender apt-get Aufruf installiert die für ein POWER8-System erforderlichen Komponenten. Da libvirt-bin auch mit installiert wird, steht auch das Kommandozeilentool Virsh anschließend zur Verfügung.

$ sudo apt-get install qemu-user qemu-utils cloud-image-utils qemu-system-ppc qemu-slof libvirt-bin numactl

X86-System

Bei einem klassischen X86-basierten System wird statt des Pakets qemu-system-ppc das qemu-system-x86 installiert.

$ sudo apt-get install qemu-user qemu-utils cloud-image-utils qemu-system-x86 qemu-slof libvirt-bin numactl

Virtinst Installation

Um mit virsh eine VM erstellen zu können, sind Kenntnisse der Definiton einer libvirt-XML-Datei erforderlich. Zur bequemen Erstellung einer ersten virtuellen Maschine, ohne Kenntnisse der spezifischen Syntax, ist die Installation von virt-install empfohlen.[2]

$ sudo apt-get install virtinst

Konfiguration

Nach der Installation der erforderlichen Komponenten sind nun noch folgenden Konfigurationsschritte zu erledigen. Die Schritte sind abhängig von der verwendeten Architektur.

Hinzufügen des Users zur Gruppe kvm

Der entsprechende User wird nun zur Gruppe KVM hinzugefügt, dies gilt für POWER8- ebenso wie für X86-Systeme.

$ sudo usermod -a -G kvm <user>

Überprüfen der Gruppenzugehörigkeiten

Die Ausgabe des Befehls id, in Verbindung mit dem entsprechenden User, sollte nun nachfolgende zwei Gruppenzugehörigkeiten anzeigen:

$ id <user>
[...]116(kvm),117(libvirtd)

Simultaneous Multi Threading unter POWER8

Damit die KVM Virtualisierung unter POWER8 verwendet werden kann, muss Simultaneous Multi-Threading (SMT) am Host deaktiviert werden.[3]

Standardmäßig ist SMT nach einem Neustart aktiv, wie dies auch die Ausgabe von ppc64_cpu --smt zeigt:

$ ppc64_cpu --smt
SMT=8

Die Ausgabe von ppc64_cpu --info zeigt die Anzahl der vorhandenen CPU-Kerne an und welche Threads der Kerne aktiv sind. Aktive Threads sind mit einem Stern (*) gekennzeichnet. Bei aktivierten SMT zeigt das Kommando am Testsystem folgende Ausgabe:

$ ppc64_cpu --info
Core   0:    0*    1*    2*    3*    4*    5*    6*    7* 
Core   1:    8*    9*   10*   11*   12*   13*   14*   15* 
Core   2:   16*   17*   18*   19*   20*   21*   22*   23* 
Core   3:   24*   25*   26*   27*   28*   29*   30*   31* 
Core   4:   32*   33*   34*   35*   36*   37*   38*   39* 
Core   5:   40*   41*   42*   43*   44*   45*   46*   47* 
Core   6:   48*   49*   50*   51*   52*   53*   54*   55* 
Core   7:   56*   57*   58*   59*   60*   61*   62*   63*

Mittels des Parameters --smt=off wird die SMT-Funktion bis zum nächsten Neustart deaktiviert.

$ sudo ppc64_cpu --smt=off

Ein erneuter Aufruf von ppc64_cpu --smt resultiert die Ausgabe dass SMT nun deaktiviert ist.

$ ppc64_cpu --smt
SMT is off
wenn anschließend das SMT deaktiviert wird, sind nur noch Threads der IDs 0,8,16,24,32,40,48 und 56 aktiv.[4]
$ ppc64_cpu --info
Core   0:    0*    1     2     3     4     5     6     7  
Core   1:    8*    9    10    11    12    13    14    15  
Core   2:   16*   17    18    19    20    21    22    23  
Core   3:   24*   25    26    27    28    29    30    31  
Core   4:   32*   33    34    35    36    37    38    39  
Core   5:   40*   41    42    43    44    45    46    47  
Core   6:   48*   49    50    51    52    53    54    55  
Core   7:   56*   57    58    59    60    61    62    63

SMT dauerhaft deaktivieren

Exakten Pfad der Binary anzeigen lassen:

$ which ppc64_cpu
/usr/sbin/ppc64_cpu

Öffnen Sie mit vi und sudo-Rechten die Datei rc.local:

$ sudo vi /etc/rc.local

Tragen sie oberhalb der Zeile exit 0 folgenden Eintrag ein, speichern und verlassen Sie mit :x den vi:

/usr/sbin/ppc64_cpu --smt=off

Durch diesen Eintrag wird nun beim Startvorgang SMT dauerhaft deaktiviert, wenn Sie SMT wieder standardmäßig aktivieren wollen, löschen Sie einfach die Zeile wieder aus der rc.local.

Das KVM Modul im Kernel aktivieren

Das KVM Modul ist standardmäßig im Kernel nicht aktiviert, folgende Zeile aktiviert es temporär:

$ sudo modprobe kvm_hv

kvm_hv dauerhaft aktivieren

Permanent kann dies per Eintrag in /etc/modules geschehen: Öffnen Sie mit vi und sudo-Rechten die Datei modules:

$ sudo vi /etc/modules

Tragen sie kvm_hv in die Datei ein, speichern und verlassen Sie mit :x den vi:

kvm_hv

Durch diesen Eintrag wird beim Startvorgang das Kernelmodul kvm_hv automatisch geladen.

Netzwerkkonfiguration

Standardmäßig besteht eine NAT-Bridge mit der Bezeichnung vibr0, um KVM-Gästen den Netzwerkzugriff zu erlauben. Um jedoch Serverdienste mit den KVM-Gästen abbilden zu können, ist eine Netzwerkbrücke wie br0 erforderlich. Wie dies gelingt, zeigt folgender Abschnitt anhand des POWER8-Systems.[5]

Installation der bridge-utils

Greppen Sie bei der Ausgabe von dpkg -l nach den bridge-utils, um zu überprüfen ob diese installiert sind.

$ dpkg -l |grep bridge-utils
ii  bridge-utils                       1.5-9ubuntu1                        ppc64el      Utilities for configuring the Linux Ethernet bridge

Falls die bridge-utils nicht installiert sind, können diese per apt-get nachinstalliert werden:

$ sudo apt-get install bridge-utils

br0-Netzwerkbrücke erstellen

Eine br0-Netzwerkbrücke für Ihre KVM-Gäste können Sie wie folgt zur Verfügung stellen:

$ sudo brctl addbr br0
# br0 wird hinzugefügt
$ sudo ip addr show
# Ausgabe aller IP-Adressen zur Überprüfung der Konfiguration
$ sudo brctl addif br0 enP1p3s0f0
# Nun wird die br0-Bridge mit der entsprechenden Netzwerkverbindung verbunden, dies kann auch oft eth0 sein.

Interfaces-Datei anpassen

Ergänzen Sie nun die Konfiguration in der interfaces-Datei:

$ sudo vi /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo br0
# br0 wird automatisch aktiviert
iface lo inet loopback

iface enP1p3s0f0 inet manual
# Das primäre Interface wird auf manual gesetzt, da zukünftig die br0-Bridge aktiv ist.
iface br0 inet static
        address <IP-Adresse>
        netmask <Subnetz-Maske>
        gateway <Gateway-IP-Adresse>
        dns-search <URL>
        dns-nameservers <DNS-IP-Adresse>
	bridge_ports enP1p3s0f0

Troubleshooting Shutdown Kernel Oops

Mit den Kerneln der 4.4.* Reihe kommt es zu einem Kernel Panic beim Versuch das Power8-System herunterzufahren. Dieses Problem ist bekannt und tritt plattformunabhängig bei der Verwendung von Netzwerkkarten die den bnx2x Treiber nutzen auf.[6]

  • Beim Herunterfahren tritt folgender Fehler in der SOL-Verbindung auf:
    Oops: Kernel access of bad area, sig: 11 [#1]
    
  • Das Problem kann mit Verwendung eines 4.8.* Kernels behoben werden. Bis zur Verfügbarkeit einer neuen Kernel Version über den Hardware Enablement Stack können Sie einen 4.8er Kernel über das kernel-ppa herunterladen.[7]
    tk@ubuntu:~/Downloads/kernel-4.8$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.8/linux-headers-4.8.0-040800_4.8.0-040800.201610022031_all.deb
    
    tk@ubuntu:~/Downloads/kernel-4.8$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.8/linux-headers-4.8.0-040800-generic_4.8.0-040800.201610022031_ppc64el.deb
    
    tk@ubuntu:~/Downloads/kernel-4.8$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.8/linux-image-4.8.0-040800-generic_4.8.0-040800.201610022031_ppc64el.deb
    
  • Auflisten der Kernel-Files:
    tk@ubuntu:~/Downloads/kernel-4.8$ ls
    
    linux-headers-4.8.0-040800_4.8.0-040800.201610022031_all.deb
    
    linux-headers-4.8.0-040800-generic_4.8.0-040800.201610022031_ppc64el.deb
    
    linux-image-4.8.0-040800-generic_4.8.0-040800.201610022031_ppc64el.deb
    
  • Kernel installieren:
    tk@ubuntu:~/Downloads/kernel-4.8$ dpkg -i *.deb
    
  • Neu installierten Kernel anzeigen
    tk@ubuntu:~/Downloads/kernel-4.8$ dpkg -L linux-image-extra-4.4.0-38-generic
    
  • Wenn der neue Kernel wegen Speicherplatzmangel nicht installiert werden kann, hilft es alte Kernel zu entfernen:
    tk@ubuntu:~/Downloads/kernel-4.8$ dpkg -l |grep linux-image
    
    tk@ubuntu:~/Downloads/kernel-4.8$ sudo apt-get purge linux-image-4.4.0-31-generic
    
  • Starten Sie anschließend Ihr System mit dem neuen Kernel neu.

Virtuelle Maschinen erstellen

Nach der Konfiguration des Host-Systems können nun virtuelle Maschinen erstellt werden. Es gibt die Möglichkeit einer grafischen Installation und Konfiguration über den Virtual Machine Manager auf einem Linux-Desktop, oder eine Kommandozeilen-Installation per virt-install bzw. virsh. Beide Möglichkeiten werden nun im folgenden Abschnitt aufgezeigt.

Definition der VM per virt-install

Nachfolgendes Beispiel zeigt die Erstellung einer Ubuntu VM anhand des virt-install CLI-Tools, es dient dazu neue KVM-, Xen- oder auch LXC-basierte virtuelle Maschinen zu erstellen. Die VM wird sofort gestartet und kann dann mittels VNC oder auch über den Virtual Machine Manager grafisch installiert werden.

Nachfolgende Tabelle zeigt einen Auszug der möglichen Optionen bei der Erstellung einer VM via virt-install:[8]

Parameter Erklärung
--connect <Hypervisor> Verbindung zum angegebenen Hypervisor aufnehmen
-n Bezeichnung der VM
-r RAM-Größe in Megabyte
--vcpus Anzahl der virt. CPUs
--disk path=<Pfad-zur-VM> Speicherort und Img-Bezeichnung der VM
size Größe des VM-Images in Gigabyte
-c <Pfad> Ablageort des Installationsmediums
--graphics vnc, deprecated: --vnc Standardmäßig gesetzt
--noautoconsole Keine automatische Konsolenverbindung zum KVM-Gast
--os-type <Typ> Angabe des Betriebssystemtyps
--accelerate Ein KVM Gast wird installiert
--virt-type qemu Ein reiner QEMU Gast wird emuliert
-w <Bezeichnung> bzw. --network=<Bezeichnung> Angabe der Netzwerkverbindung der VM
-v bzw. --hvm Vollständige Virtualisierung
-w <Network> bzw --network=<Network> Angabe der Netzwerkverbindung

Ubuntu 16.04.1 KVM Gast erstellen

$ sudo virt-install --connect qemu:///system -n ubuntu-kvm-vi -r 1024 --vcpus=2 \
--disk path=/var/lib/libvirt/images/ubuntu-kvm-vi.img,size=20 -c /home/tk/Downloads/ubuntu-16.04.1-server-ppc64el.iso \
--graphics vnc --noautoconsole --os-type linux  --accelerate --network=bridge:br0 --hvm

Starting install...
Allocating 'ubuntu-kvm-vi.img'                             |  20 GB  00:00     
Creating domain...                                         |    0 B  00:00     
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.

Virsh Ausgabe

Mit virsh kann durch den Parameter list --all die Ausgabe aller konfigurierten VMs, mit zugehörigem Status, erzeugt werden.

$ virsh -c qemu:///system list --all
 Id    Name                           State
----------------------------------------------------
 3     ubuntu-kvm-vi                  running
 -     ubuntu-kvm-test-vmm            shut off

Installation mit Virtual Machine Manager fortsetzen

Die über die Kommandozeile mit virt-install erstellte VM kann nun bequem mit dem virt-manager grafisch installiert und konfiguriert werden. Verbinden Sie sich mit dem virt-manager zum KVM-Host, markieren Sie die neu erstellte VM (ubuntu-kvm-vi) und klicken Sie auf Open. Sie werden nach dem Passwort des Users des KVM-Hosts gefragt, nach der Eingabe wird die Verbindung zur VM hergestellt.

Die VM kann über den Virtual Machine Manager bequem installiert werden

Weitere Informationen

Einzelnachweise

  1. How to use Ubuntu as a hypervisor? (wiki.ubuntu.com)
  2. Virsh - Virtuelle Maschine erstellen (wiki.ubuntuusers.de)
  3. Simultaneous Multi-Threading (SMT) (www.ibm.com) Power8 systems support Simultaneous Multi-Threading (SMT). You can enable SMT to run in your guests, allowing you to run up to 8 threads from a single core. Note: SMT is not supported on the host and must be disabled.
  4. Simultanes Multithreading (SMT) (ibm.com)
  5. Simple Virtualization With Ubuntu 16.04 Linux and KVM (linuxconfig.org)
  6. Kernel oops + system freeze on network-bridge shutdown (bugs.launchpad.net)
  7. Kenel PPA für Kernel 4.8 (kernel.ubuntu.com)
  8. virt-install(1) - Linux man page (linux.die.net)


Foto Thomas Niedermeier.jpg

Autor: Thomas Niedermeier

Thomas Niedermeier, Abteilung Communications / Knowledge Transfer bei Thomas-Krenn, absolvierte an der Hochschule Deggendorf sein Studium zum Bachelor Wirtschaftsinformatik. Seit 2013 ist Thomas bei Thomas-Krenn beschäftigt und kümmert sich hier vor allem um das TKwiki. Er ist ein begeisterungsfähiger, technisch interessierter Linux und Mac Nutzer, fährt im Winter gerne Ski und geht im Sommer gern ins Schwimmbad.


Das könnte Sie auch interessieren

OpenPOWER
Ubuntu 16.04 auf OpenPOWER via Petitboot installieren
Virsh - Kommandozeilenwerkzeug zur Verwaltung virtueller Maschinen