class: center, middle  ## Grundlagen: Linux Virtualisierung mit KVM, NVME & EFI ### Hauke Goos-Habermann #### https://weisheit.goos-habermann.de --- ### Über mich - Entwickler des
Softwareverteilungssystems m23
- Organisator der
Kieler Open Source und Linux Tage
-
Dienstleister zu m23, Linux und Freier Software
- Softwareentwicklung (PHP, BASH, C/C++, JS, Python und was sonst so gebraucht wird...) - Administration - Schulungen - Support - Beratung - quasi **alles**, *was mit Linux zu tun hat* - Wöchentlicher Livestream *"Jean und Hauke Show"* auf https://www.youtube.com/c/LinuxGuides - *"Nicht der Weisheit letzter Schluß"* mit **beruflichen** oder **privaten Projekten** auf
tube.tchncs.de/c/ndwls
und
youtube.com/@nichtderweisheit
- Zeit für ein paar KVM-Grundlagen --- ### Was ist KVM? 
KVM
(Kernel-based Virtual Machine) ist eine **Virtualisierungstechnologie**, die direkt im **Linux-Kernel integriert** ist. Mit KVM könnt Ihr auf einem Linux-Rechner **mehrere isolierte virtuelle Maschinen** (VMs) laufen lassen, die sich wie separate Computer verhalten. In den VMs könnt Ihr (fast) jedes **Betriebssystem installieren**, das für die **CPU-Architektur** Eures Rechners verfügbar ist. Durch KVM werden die **physikalisch vorhanden Ressourcen** (CPU, Speicher und Plattenspeicher) auf- und den einzelnen **VMs zugeteilt**. Durch Hardware-Unterstützung (z.B. Intel VT oder AMD-V) wird die Ausführung der VM stark beschleunigt. --- ### Vorbereitung  Für KVM müssen unter Debian und Co. noch ein paar **Pakete installiert** und der **normale Benutzer** zur Gruppe ***kvm*** hinzugefügt werden, damit dieser kvm starten kann. Zusätzlich brauchen wir für EFI-VMs eine Kopie der NVRAM-Datei, damit die VM UEFI-BIOS-Einstellung/Werte abspeichern kann. ```bash # KVM und EFI-BIOS-Dateien installieren sudo apt install -y qemu-system-x86\ qemu-utils ovmf # Benutzer zur kvm-Gruppe hinzufügen sudo adduser [ich] kvm # Verzeichnis für die VM anlegen mkdir [meineVM] cd [meineVM] # Als normaler Benutzer: # Vorlage für NVRAM kopieren cp /usr/share/OVMF/OVMF_VARS_4M.fd . ``` --- ### Virtuelle Festplatte erstellen  KVM verwendet das **qcow2**-Format für virtuelle Festplatten, um eine neue wachsende und maximal 2TB große Festplattendatei anzulegen, machen wir folgendes: ```bash qemu-img create -f qcow2 hdd.qcow2 2048G ``` Statt *2048G* für 2TB könnt Ihr natürlich auch eine andere Größe in GB verwenden. --- ### KVM-Basisparameter  Von der Kommandozeile aus kann eine KVM-VM mit den folgenden Eigenschaften * 4 GB RAM, 2 CPUs * NVME SSD in hdd.qcow2 * Standardgrafikkarte * Soundkarte nach AC97 * EFI über den ***kvm***-Befehl und dem Parametersatz ```bash kvm -m 4G -smp 2 -drive file=hdd.qcow2, \ if=none,id=drv0 -device nvme,drive=drv0, \ serial=nvme-1 -vga std \ -drive if=pflash,format=raw,readonly=on, \ file=/usr/share/OVMF/OVMF_CODE_4M.fd \ -drive if=pflash,format=raw, \ file=OVMF_VARS_4M.fd -device AC97 \ [Netzwerkkonfiguration] [Bootparameter] ``` gestartet werden. --- ### Netzwerkkonfiguration: NAT  Soll die VM über NAT angebunden werden, so sieht die Netzwerkkonfiguration folgendermaßen aus: ```bash -device virtio-net-pci,netdev=net0 \ -netdev user,id=net0,net=192.168.23.0/24, \ dhcpstart=192.168.23.23 ``` Hierbei bringt KVM einen eigenen **DHCP-Server** mit, der IP-Adressen im angegbenen Netz verteilt. **Von außen** kann erstmal **nicht** auf die VM **zugegriffen** werden, aber es ist möglich, **einzelne Ports** über die **IP des Hosts bereitzustellen**. Port 80 des Gastes wird auf Port 8080 des Hosts bereitgestellt: ```bash -netdev user,...,hostfwd=tcp::8080-:80 ``` --- ### Netzwerkbrücke  Eine Netzwerkbrücke ist sinnvoll, wenn die KVM-VM eine eigene IP im Netzwerk haben soll und sich **so verhält**, als ob sie auf einem ***echten* Rechner** läuft. ```bash # Installation der nötigen Netzwerkpakete sudo apt install -y uml-utilities \ bridge-utils net-tools ``` --- ### Netzwerkbrücke temporär  Falls Ihr nur temporär eine Netzwerkbrücke braucht, habe ich Euch zwei Skripte erstellt: **
br-up.sh
** erstellt (als **root** ausgeführt) das TAP-Gerät, über das die VM kommuniziert. **
br-down.sh
** entfernt (als **root** ausgeführt) das TAP-Gerät und die Netzwerkbrücke. **Wissensteil**: Über **TAP** wird eine Punkt-zu-Punkt-Verbindung via Ethernet (OSI-Layer 2) simuliert. https://de.wikipedia.org/wiki/TUN/TAP --- ### Problem: NetworkManager  Damit eine Netzwerkbrücke gebaut werden kann, muß zuerst die **NetworkManager-Konfiguration** für die **physikalische Netzwerkkarte** (hier *eth0*) **entfernt** werden: ```bash nmcli connection delete eth0 ``` --- ### Netzwerkbrücke dauerhaft Dann kann die Netzwerkbrücke auch dauerhaft in der ***/etc/network/interfaces*** eingerichtet werden: ```bash # TAP auto tap0 iface tap0 inet manual tunctl_user [ich] pre-up /usr/bin/tunctl -t tap0 # Echte Netzwerkkarte allow-hotplug eth0 iface eth0 inet manual # Netzwerkbrücke auto br0 iface br0 inet static address 192.168.23.123/24 gateway 192.168.23.1 # dns-*-Optionen werden vom resolvconf-Paket interpretiert # (wenn installiert) dns-nameservers 192.168.23.1 bridge-ports eth0 tap0 bridge-stp off bridge-fd 0 ``` --- ### Netzwerkkonfiguration: Brücke  So sieht die KVM-Netzwerkkonfiguration dann aus: ```bash -netdev tap,id=net0,ifname=tap0,script=no,\ downscript=no -device virtio-net-pci,\ netdev=net0,mac=aa:bb:cc:dd:ee:ff ``` --- ### Installation von ISO-Datei  Für die Installation einer per Netzwerkbrücke angebundenen VM über eine ISO-Datei ergibt sich folgender Parametersatz: ```bash kvm -m 4G -smp 2 -drive file=hdd.qcow2,\ if=none,id=drv0 -device nvme,drive=drv0,\ serial=nvme-1 -vga virtio -device AC97 \ -drive if=pflash,format=raw,readonly=on,\ file=/usr/share/OVMF/OVMF_CODE_4M.fd \ -drive if=pflash,format=raw,\ file=OVMF_VARS_4M.fd \ -netdev tap,id=net0,ifname=tap0,script=no,\ downscript=no -device virtio-net-pci,\ netdev=net0,mac=aa:bb:cc:dd:ee:ff \ -cdrom ../debian.iso -boot d ``` Die letzte Zeile bestimmt, daß vom ISO gebootet werden soll. --- ### Booten von der SSD  **Nach** der **Installation** fahrt Ihr die **VM herunter** und ersetzt die letzte Zeile, sodaß dort nun nur noch ***-boot c*** steht. ```bash kvm -m 4G -smp 2 -drive file=hdd.qcow2,\ if=none,id=drv0 -device nvme,drive=drv0,\ serial=nvme-1 -vga virtio -device AC97 \ -drive if=pflash,format=raw,readonly=on,\ file=/usr/share/OVMF/OVMF_CODE_4M.fd \ -drive if=pflash,format=raw,\ file=OVMF_VARS_4M.fd \ -netdev tap,id=net0,ifname=tap0,script=no,\ downscript=no -device virtio-net-pci,\ netdev=net0,mac=aa:bb:cc:dd:ee:ff \ -boot c ``` --- ### qcow2 mounten  Wenn Ihr eine qcow2-Festplattendatei mounten möchtet, könnt Ihr dies über NBD (Network Block Device) machen. Ihr geht dann wie folgt vor: ```bash # NBD-Modul für maximal 8 Partitionen laden sudo modprobe nbd max_part=8 # qcow2-Datei an das nbd0-Gerät binden sudo qemu-nbd --connect=/dev/nbd0 x.qcow2 # Mountpunkt erstellen sudo mkdir /mnt/qcow2-part1 # Erste Partition mounten sudo mount /dev/nbd0p1 /mnt/qcow2-part1 ``` --- class: center, middle ### Informationen zu mir und meinen Dienstleistungen, m23, ... ### https://goos-habermann.de