Server Installation/KVM: Unterschied zwischen den Versionen

Aus Opennet
Wechseln zu: Navigation, Suche
K (OpenWrt / Opennet-Firmware)
 
(24 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 40: Zeile 40:
 
* VNC-Verbindung mit einer Host-Konsole
 
* VNC-Verbindung mit einer Host-Konsole
 
* Hoch- und Herunterfahren von Hosts
 
* Hoch- und Herunterfahren von Hosts
 +
 +
==== Dateisystem (md, lvm) ====
 +
 +
Wir verwenden in der Regel Linux Software-RAIDs mit darüber liegendem LVM für die Opennet Virtualisierungsserver.
 +
 +
{|{{Prettytable}}
 +
|-
 +
| cat /proc/mdstat || Status der RAID-Syncronisation
 +
|-
 +
| mdadm -D /dev/mdX || RAID Detailansicht abrufen
 +
|-
 +
| pvs || Status der LVM physikalischen Volumes
 +
|-
 +
| vgs || Status der LVM Volume Gruppen
 +
|-
 +
| lvs || Status der LVM logischen Volumes
 +
|-
 +
| lsblk || Übersicht über alle Block-basierten Geräte
 +
|-
 +
| lsblk -f || Übersicht mit Dateisystem-Angaben
 +
|-
 +
|}
 +
 +
Erstanlage (Beispiel Erweiterung um zwei neue Festplatten):
 +
 +
apt install fdist parted
 +
cfdisk /dev/sdc  # -> GPT / sdc: Linux MD
 +
cfdisk /dev/sdd  # -> GPT / sdd: Linux MD
 +
parted /dev/sdc align-check opt 1
 +
parted /dev/sdd align-check opt 1
 +
apt remove fdisk parted
 +
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
 +
pvcreate /dev/md1
 +
vgcreate lvm-<server>-<desc> /dev/md1
 +
 +
Migration von Daten zwischen verschiedenen Volumens/Volumengruppen:
 +
 +
virsh shutdown <guest>
 +
dd if=/dev/<source-vg>/<source-volume> of=/dev/<target-vg>/<target-volume> bs=4M
  
 
=== Gäste auflisten ===
 
=== Gäste auflisten ===
  
 
<pre>
 
<pre>
akito:~# virsh list --all
+
# virsh list --all
 
  Id Name                State
 
  Id Name                State
 
----------------------------------
 
----------------------------------
Zeile 57: Zeile 96:
  
 
<pre>
 
<pre>
akito:~# virsh start test
+
# virsh start test
 
</pre>
 
</pre>
  
Zeile 64: Zeile 103:
  
 
<pre>
 
<pre>
akito:~# lsof -i -Pn|grep kvm
+
# lsof -i -Pn|grep kvm
kvm     3542    root    6u IPv4   7595      TCP 127.0.0.1:5900 (LISTEN)
+
kvm         1698 libvirt-qemu  11u IPv4   19606      0t0  TCP 127.0.0.1:5900 (LISTEN)
kvm     12417    root    6u IPv4 3239608      TCP 127.0.0.1:5901 (LISTEN)
+
kvm         1756 libvirt-qemu  11u IPv4   19843      0t0  TCP 127.0.0.1:5901 (LISTEN)
 +
[..]
 +
</pre>
 +
 
 +
<pre>
 +
% ssh -L 5900:localhost:5900 root@<virt-server>
 
</pre>
 
</pre>
  
Zeile 105: Zeile 149:
 
=== Neuen Gast anlegen ===
 
=== Neuen Gast anlegen ===
  
 +
Inzwischen verwenden wir LVM-Images für die Hosts. Für das Erzeugen und Löschen von Hosts gibt es ein [[Server Installation/vhost-admin|Verwaltungs-Skript]].
 +
 +
==== Verwaltung mit vhost-admin (LVM) ====
 +
 +
Siehe [[Server Installation/vhost-admin]].
 +
 +
Die in den nächsten Abschnitten folgenden Hinweise gelten für die ehemaligen/älteren Datei-basierten Virtualisierungsserver.
 +
 +
==== Debian-System ====
 
Mit folgendem Kommando legt man einen neuen Gast mit 256MB Ram und 12GB Harddisk an. Dieser wird sofort  
 
Mit folgendem Kommando legt man einen neuen Gast mit 256MB Ram und 12GB Harddisk an. Dieser wird sofort  
 
gestartet, das iso-CD Image wird gemountet und er staret von CD. Nun kann man sich per VNC mit der  
 
gestartet, das iso-CD Image wird gemountet und er staret von CD. Nun kann man sich per VNC mit der  
Zeile 122: Zeile 175:
 
  virsh console <gastname>
 
  virsh console <gastname>
  
Damit eine Maschine später vom Starten des KVM Hostsystems mit gestartet wird:
+
==== OpenWrt / Opennet-Firmware ====
 +
Mit den folgenden Kommandos lässt sich ein virtualisierter AP mit einer beliebigen Firmware-Version erzeugen:
 +
<pre>
 +
gastname="ap2-250"
 +
version="0.5.3-unstable-1988"
 +
mkdir -p "/tank/$gastname"
 +
wget -O- "https://downloads.opennet-initiative.de/openwrt/testing/$version/x86/openwrt-$version-x86-generic-combined-ext4.img.gz"  \
 +
    | gunzip >"/tank/$gastname/disk.img"
 +
virt-install --connect qemu:///system -n "$gastname" -r 96 --vcpus=1 \
 +
    --import --disk "path=/tank/$gastname/disk.img,format=raw,bus=sata" \
 +
    --graphics vnc,keymap=de --serial pty --noautoconsole \
 +
    --os-type linux --network=bridge:br1,model=e1000 --hvm
 +
</pre>
 +
 
 +
Anschließend kannst du dich mit der seriellen Konsole des AP verbinden, um grundlegende Einstellungen vorzunehmen:
 +
virsh console "$gastname"
 +
 
 +
Die typischen Zeilen für die Konfiguration für OLSR auf dem ersten Netzwerk-Interface sind folgende:
 +
uci set network.@device[0].ports=none
 +
uci set network.on_eth_0.device=eth0
 +
uci commit
 +
on-function set_opennet_id 2.250
 +
 
 +
==== Nacharbeiten ====
 +
 
 +
Damit eine Maschine später vom Starten des KVM-Hostsystems automatisch gestartet wird:
  
 
  virsh autostart <gastname>
 
  virsh autostart <gastname>
Zeile 170: Zeile 248:
 
=== Diagnose und Fehlerbeseitigung ===
 
=== Diagnose und Fehlerbeseitigung ===
  
* CPU Verbrauch aller Gäste:
 
virt-top
 
 
* Erweiterte Informationen zu einem Gast:
 
* Erweiterte Informationen zu einem Gast:
 
  virsh dominfo <vm>
 
  virsh dominfo <vm>

Aktuelle Version vom 9. März 2024, 19:12 Uhr

KVM Virtualisierung wird auf unseren Opennet Virtualisierungsservern eingesetzt.

Inhaltsverzeichnis

[Bearbeiten] Allgemeines

Die Kernel-based Virtual Machine (KVM) ist eine Linux-Kernel-Infrastruktur für die Virtualisierung auf x86 Hardware mit den Hardware-Virtualisierungstechniken von Intel (VT) oder AMD (AMD-V).

KVM ist eine Möglichkeit unter Linux einen virtuellen Server zu betreiben. KVM setzt voraus das die CPU des Host Rechners (auf dem Host laufen die virtuellen Server) Hardwarevirtualisierung unterstützt. Nahezu alle aktuellen Multi-Core Prozessoren tun dies.

[Bearbeiten] Verwaltungswerkzeuge

[Bearbeiten] virsh

Die Gäste werden mit den Kommando virsh gesteuert.

virsh edit gast Konfigurationsdatei des Gast-Systems bearbeiten
virsh define /etc/libvirt/qemu/gast.xml manuelle Änderung einer Konfiguration anmelden (nicht nötig für virsh edit)
virsh list Prüfen welche Gäste laufen
virsh start gast Gast mit dem Namen gast starten
virsh shutdown gast Gast mit dem Namen gast runter fahren (via ACPI; geht auch aus dem Gast mit shutdown)
virsh destroy gast Gast mit dem Namen gast abschalten
virsh undefine gast Gast-Konfiguration löschen

[Bearbeiten] virt-manager

Der virt-manager ist eine komfortable GTK-Oberfläche für die Verwaltung von libvirt-Gastsystemen. virt-manager kann sowohl auf dem Virtualisierungsserver, als auch auf einem beliebigen anderen Rechner isntalliert werden. Für die entfernte Verwendung ist lediglich eine ssh-Verbindung mit dem Virtualisierungsserver (als root) erforderlich. Über die virt-manager-Oberfläche lassen sich mehrere Virtualisierungsserver gemeinsam verwalten.

Folgende Funktionen werden vom virt-manager unterstützt:

  • Host erzeugen
  • Host-Konfiguration ändern
  • VNC-Verbindung mit einer Host-Konsole
  • Hoch- und Herunterfahren von Hosts

[Bearbeiten] Dateisystem (md, lvm)

Wir verwenden in der Regel Linux Software-RAIDs mit darüber liegendem LVM für die Opennet Virtualisierungsserver.

cat /proc/mdstat Status der RAID-Syncronisation
mdadm -D /dev/mdX RAID Detailansicht abrufen
pvs Status der LVM physikalischen Volumes
vgs Status der LVM Volume Gruppen
lvs Status der LVM logischen Volumes
lsblk Übersicht über alle Block-basierten Geräte
lsblk -f Übersicht mit Dateisystem-Angaben

Erstanlage (Beispiel Erweiterung um zwei neue Festplatten):

apt install fdist parted
cfdisk /dev/sdc   # -> GPT / sdc: Linux MD
cfdisk /dev/sdd   # -> GPT / sdd: Linux MD
parted /dev/sdc align-check opt 1
parted /dev/sdd align-check opt 1
apt remove fdisk parted
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
pvcreate /dev/md1
vgcreate lvm-<server>-<desc> /dev/md1

Migration von Daten zwischen verschiedenen Volumens/Volumengruppen:

virsh shutdown <guest>
dd if=/dev/<source-vg>/<source-volume> of=/dev/<target-vg>/<target-volume> bs=4M

[Bearbeiten] Gäste auflisten

# virsh list --all
 Id Name                 State
----------------------------------
  3 on-i                 running
 28 lvs                  running
  - squeeze              shut off
  - subaru               shut off
  - test                 shut off

[Bearbeiten] Gast starten

# virsh start test

Nun läuft der Gast und man kann per SSH Tunnel und VNC auf die Console zugreifen (Der Mac VNC Client JollysFastVNC kann selbst einen SSH Tunnel aufbauen).

# lsof -i -Pn|grep kvm
kvm          1698 libvirt-qemu   11u  IPv4   19606      0t0  TCP 127.0.0.1:5900 (LISTEN)
kvm          1756 libvirt-qemu   11u  IPv4   19843      0t0  TCP 127.0.0.1:5901 (LISTEN)
[..]
% ssh -L 5900:localhost:5900 root@<virt-server>

[Bearbeiten] Gast beenden

Normalerweise sollte man dazu die Betriebsystemen des Gastes verwenden und den Gast ordentlich runter fahren. Unter linux z.B. mit shutdown, reboot oder init 0. Alternativ bei installiertem ACPI im Gast:

virsh shutdown <gastname>

Falls ein Gast mal hängt kann man ihn auch hart abschalten:

virsh destroy <gastname>

[Bearbeiten] Konfiguration ändern

Die Konfiguration der Gäste liegt als XML Datei in /etc/libvirt/qemu.

Änderungen lassen sich via virt-manager (GUI) oder per Text-Editor vornehmen. Der übliche Weg für letzteres ist virsh edit HOSTNAME.

Falls du eine Hostdatei auf anderem Wege geändert haben solltest, dann muss diese Änderung via virsh define /etc/libvirt/qemu/gast.xml libvirt bekannt gemacht werden.

[Bearbeiten] Zugriff auf virtuellen Host via Konsole

[Bearbeiten] Textkonsole

Der Zugriff via Konsole ist nur für openwrt-Hosts spontan verfügbar. Bei Debian-basierten Hosts muss die Konsole via Kernel-Boot-Parameter explizit aktiviert werden.

  • virsh console HOSTNAME
    • anschließend Enter drücken, um die passwortfreie Konsole zu eröffnen
    • Abbruch der Konsole: STRG-ALT-] (schließende eckige Klammer)

[Bearbeiten] Grafische Konsole (via VNC)

Der Zugriff via VNC ist sowohl für Debian-basierte, als auch für openwrt-basierte Hosts spontan verfügbar.

  1. Konsole ermitteln: virsh vncdisplay HOSTNAME
    1. die Zahl nach dem Dopplpunkt ist die Display-Nummer
  2. Verbindung aufbauen: vncviewer -via root@ryoko.on-i.de :DISPLAYNUMMR

Eventuell ist stattdessen die lokale Installation von virt-manager auf dem eigenen Rechner sinnvoll. Dieses Programm kann sich mit verschiedenen entfernten Virtualisierungsservern bei Bedarf verbinden und auch die VNC-Verbindung komfortabel aufbauen.

[Bearbeiten] Neuen Gast anlegen

Inzwischen verwenden wir LVM-Images für die Hosts. Für das Erzeugen und Löschen von Hosts gibt es ein Verwaltungs-Skript.

[Bearbeiten] Verwaltung mit vhost-admin (LVM)

Siehe Server Installation/vhost-admin.

Die in den nächsten Abschnitten folgenden Hinweise gelten für die ehemaligen/älteren Datei-basierten Virtualisierungsserver.

[Bearbeiten] Debian-System

Mit folgendem Kommando legt man einen neuen Gast mit 256MB Ram und 12GB Harddisk an. Dieser wird sofort gestartet, das iso-CD Image wird gemountet und er staret von CD. Nun kann man sich per VNC mit der Console verbinden und die Installation durchführen. Nach dem ersten Reboot wird die Bootreihenfolge geändert so das der Gast von der virtuellen Festplatte bootet.

virt-install --connect qemu:///system -n gastname -r 256 --vcpus=1 -f /tank/gastname/image.qcow2 \
             -s 12 -k de -c /tank/debian-6.0.4-amd64-netinst.iso --vnc --noautoconsole \
             --os-type linux --os-variant debianSqueeze --accelerate --network=bridge:br0 --hvm

Wenn man in der Grub-Konfig die Kernel Option durch console=tty0 console=ttyS0,115200 ergänzt und in /etc/inittab die Zeile T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100 auskommentiert hat man auch über den Host Zugriff auf die Console.

virsh console <gastname>

[Bearbeiten] OpenWrt / Opennet-Firmware

Mit den folgenden Kommandos lässt sich ein virtualisierter AP mit einer beliebigen Firmware-Version erzeugen:

gastname="ap2-250"
version="0.5.3-unstable-1988"
mkdir -p "/tank/$gastname"
wget -O- "https://downloads.opennet-initiative.de/openwrt/testing/$version/x86/openwrt-$version-x86-generic-combined-ext4.img.gz"  \
    | gunzip >"/tank/$gastname/disk.img"
virt-install --connect qemu:///system -n "$gastname" -r 96 --vcpus=1 \
    --import --disk "path=/tank/$gastname/disk.img,format=raw,bus=sata" \
    --graphics vnc,keymap=de --serial pty --noautoconsole \
    --os-type linux --network=bridge:br1,model=e1000 --hvm

Anschließend kannst du dich mit der seriellen Konsole des AP verbinden, um grundlegende Einstellungen vorzunehmen:

virsh console "$gastname"

Die typischen Zeilen für die Konfiguration für OLSR auf dem ersten Netzwerk-Interface sind folgende:

uci set network.@device[0].ports=none
uci set network.on_eth_0.device=eth0
uci commit
on-function set_opennet_id 2.250

[Bearbeiten] Nacharbeiten

Damit eine Maschine später vom Starten des KVM-Hostsystems automatisch gestartet wird:

virsh autostart <gastname>

[Bearbeiten] Linux System zu KVM Gast migrieren

Folgender Punkt setzt den sicheren Umgang mit Linux über die Console voraus.

  • Disk Image erstellen (z.B. 50GB)
 dd if=/dev/zero of=disk.img bs=1M count=50000
  • Image partitionieren und formatieren
 # Prüfen ob loop0 noch frei ist
 losetup /dev/loop0 
 # disk Image an loop0 binden
 losetup /dev/loop0 disk.img
 # Partitionen anlegen
 cfdisk /dev/loop0
 # Partitionen an loop0pX binden
 kpartx -a -v disk.img 
 # Swap erstellen
 mkswap /dev/mapper/loop0p1
 # Filesystem erstellen
 mkfs.ext4 /dev/mapper/loop0p2
  • Mounten und Daten kopieren
 mount /dev/mapper/loop0p2 /mnt
 rsync -ax --numeric-ids alter-host:/ /mnt/
  • 'Image unmounten.
 umount /mnt
 losetup -d /dev/loop0
  • Bestehende Config aus /etc/libvirt/qemu als Vorlage nehmen und anpassen.
  • MAC Adressen des Gastes in /etc/udev/rules.d/70-persistent-net.rules anpassen
  • Den Booloader habe ich nun wie folgt erstellt (geht vielleicht auch einfacher)
  • Die vDisk in einen zweiten Gast als vdb eingetragen und den Gast gebootet
  • vdb nach /mnt gemountet und /proc und /dev mit der Option -o bind nach /mnt/proc und /mnt/dev gemountet
  • chroot /mnt
  • Grub menu.lst mit update-grub erstellen
  • Grub mit grub-install --no-floppy /dev/vdb schreiben (vdb muß in device.map existieren)

[Bearbeiten] Diagnose und Fehlerbeseitigung

  • Erweiterte Informationen zu einem Gast:
virsh dominfo <vm>
  • Zugriff auf das Filesystem, hierzu zunächst die Maschine herunterfahren per shutdown oder virsh destroy <vm>:
virsh list --all   # pruefen, die VM ausgeschaltet ist
kpartx -av /tank/<vm>/disk.img   # loop devices bauen
mount /dev/mapper/loop1p1 /mnt/<path>
... Arbeiten unter /mnt/<path> durchfuehren ...
umount /mnt/<path>
partx -dv /tank/<vm>/disk.img    # loop devices entfernen
  • Die UUID vom Filesystem kann ermittelt werden (wie oben mit kpartx beginnen):
tune2fs -l /dev/mapper/loop1p1 
file /tank/<vm>/disk.img
  • Zugriff per KVM auf die Console per VNC, hierzu ggf. entsprechende Firewall-Regeln erzeugen für den Zugriff von Aussen:
kvm /tank/<vm>/disk.img -vnc :X   # X = VNC Port ID, z.B. 10
  • Zugriff per Virsh auf die Console per VNC, hierzu ggf. per SSH -L Zugriff von Aussen (Rückgabe liefert VNC-ID, Port 5900+ID):
 virsh vncdisplay <vm>
  • Defekten Boot-Loader eines Gast-Systems übergehen:
    • Boote das Gastsystems mit einem extern vorhandenen Kernel und repariere anschließend aus dem laufenden System heraus den Bootloader.
    • Für einen externen Kernel sind die folgenden Zeilen beispielsweise via virsh edit HOSTNAME in der Sektion <os> einzutragen (die Dateinamen beziehen sich auf das Wirts-Dateisystem):
<kernel>/boot/vmlinuz</kernel>
<initrd>/boot/initrd.img</initrd>
<cmdline>root=/dev/sda</cmdline>
  • Reparatur von GRUB für eine KVM VM (wieder nur bei ausgeschalteter VM):
virsh list --all   # pruefen, die VM ausgeschaltet ist
modprobe nbd max_part=16
kvm-nbd -c /dev/nbd0 /tank/<vm>/disk.img
mount /dev/nbd0p1 /mnt/<path>
mount --bind /dev/ /mnt/<path>/dev
LANG=C chroot /mnt/<path>/ /bin/bash
mount -t proc none /proc
mount -t sysfs none /sys
apt-get install linux-image-amd64 grub  # optional
grub-install /dev/nbd0
update-grub
umount /proc/ /sys/ /dev/
exit
grub-install /dev/nbd0 --root-directory=/mnt/<path> --modules="biosdisk part_msdos"   # wichtiger Schritt!
umount /mnt/<path>
kvm-nbd -d /dev/nbd0
modprobe -r nbd
virsh start <vm>   # nun sollte die VM wieder einwandfrei booten
Meine Werkzeuge
Namensräume

Varianten
Aktionen
Start
Opennet
Kommunikation
Karten
Werkzeuge