Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:archlinux_-_virtualisierung_mit_kvm

ArchLinux - Virtualisierung mit KVM

Bekanntlich führen viele Wege nach Rom, deswegen erhebt diese Beschreibung auch keinen Anspruch auf die einzige Wahre Lösung! Vielmehr ist es ein Versuch eine Virtualisierungsumgebung mit ArchLinux abzubilden.

Die hier vorgestellte Möglichkeit dies zu realisieren soll möglichst nach folgenden Vorgaben erfolgen:

  • möglichst nur mit Bordmitteln
  • möglichst wenig externen Paketen/Programmen/Quellen
  • einfache Realisierung

Ab hier werden root-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um der Benutzer root zu werden, geben Sie bitte nachfolgenden Befehl ein:

$ su -
Password: 

Vorbereitung

Es soll als Grundlage eine Installation in den Varianten:

oder

und die zusätzlich noch benötigten Installationen für das

durchgeführt werden, auf die dann aufbauend die noch benötigte Installation für eine grafische Benutzeroberfläche, hier z.B.

oder

sukzessive durchgeführt werden soll.

Installation

Nachfolgende Pakete ermöglichen die Installation der Virtualisierungsplattform KVM (qemu) und die Möglichkeit über das Desktop-Programm virt-manager über eine GUI komfortabel virtuelle Maschinen unter ArchLinux zu erstellen.

  • qemu-desktop - Virtualisierungsumgebung mit allen dafür benötigten Paketen
  • virt-manager - Desktop GUI zur Verwaltung von virtuellen Maschinen
  • dnsmasq - DNS „Forwarder“ und DHCP-Server
  • dmidecode - Desktop Management Interface Tabellen Werkzeuge
  • edk2-ovmf - Firmware für virtuelle Maschinen (x86_64, i686)
  • guestfs-tools - Zugriff und Änderung von Festplatten-Images virtueller Maschinen
# pacman -S qemu-desktop virt-manager dnsmasq dmidecode edk2-ovmf guestfs-tools

Konfiguration

:!: WICHTIG - Dies Konfiguration ist NUR erforderlich, wenn iptables verwendet wird!

Wenn als Firewall iptables bzw. ip6tables verwendet werden soll und nicht nftables, was auch die Installation von iptables-nft betrifft, so ist es erforderlich nachfolgende Konfiguration durchzuführen, da der neue Standard für Virtualisierungsplattform KVM (qemu) und libvritd - nftables ist!

/etc/libvirt/network.conf

Nachfolgend die Komplette Konfigurationsdatei mit den entsprechend relevanten Änderungen:

# Master configuration file for the network driver.
# All settings described here are optional - if omitted, sensible
# defaults are used.
 
# firewall_backend:
#
#   determines which subsystem to use to setup firewall packet
#   filtering rules for virtual networks.
#
#   Supported settings:
#
#     iptables - use iptables commands to construct the firewall
#     nftables - use nft commands to construct the firewall
#
#   If firewall_backend isn't configured, libvirt will choose the
#   first available backend from the following list:
#
#     [nftables, iptables]
#
#   If no backend is available on the host, then the network driver
#   will fail to start, and an error will be logged.
#
#   (NB: switching from one backend to another while there are active
#   virtual networks *is* supported. The change will take place the
#   next time that libvirtd/virtnetworkd is restarted - all existing
#   virtual networks will have their old firewalls removed, and then
#   reloaded using the new backend.)
#
# Tachtler
# default: #firewall_backend = "nftables"
firewall_backend = "iptables"

Erklärungen

  • firewall_backend = "iptables"

Änderung der zu verwendenden „backends“ für die automatische Generierung der nachfolgenden Firewall-Regeln für - iptables:

IPv4:

# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2459 1965K LIBVIRT_INP  0    --  *      *       0.0.0.0/0            0.0.0.0/0           
 2415 1962K ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     1    --  *      *       0.0.0.0/0            0.0.0.0/0           
    2   120 ACCEPT     0    --  lo     *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
   42  3032 LOG        0    --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 5 prefix "REC-INP Defend "
    0     0 REJECT     6    --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with tcp-reset
   10  1992 REJECT     17   --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
   32  1040 REJECT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-proto-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 LIBVIRT_FWX  0    --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 LIBVIRT_FWI  0    --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 LIBVIRT_FWO  0    --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 2091 packets, 473K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2091  473K LIBVIRT_OUT  0    --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain LIBVIRT_FWI (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     0    --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
    0     0 REJECT     0    --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     0    --  *      virbr1  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain LIBVIRT_FWO (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     0    --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
    0     0 REJECT     0    --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     0    --  virbr1 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain LIBVIRT_FWX (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     0    --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     0    --  virbr1 virbr1  0.0.0.0/0            0.0.0.0/0           

Chain LIBVIRT_INP (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     17   --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     6    --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 ACCEPT     17   --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
    0     0 ACCEPT     6    --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67
    0     0 ACCEPT     17   --  virbr1 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     6    --  virbr1 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 ACCEPT     17   --  virbr1 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
    0     0 ACCEPT     6    --  virbr1 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67

Chain LIBVIRT_OUT (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     17   --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     6    --  *      virbr0  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 ACCEPT     17   --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:68
    0     0 ACCEPT     6    --  *      virbr0  0.0.0.0/0            0.0.0.0/0            tcp dpt:68
    0     0 ACCEPT     17   --  *      virbr1  0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     6    --  *      virbr1  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 ACCEPT     17   --  *      virbr1  0.0.0.0/0            0.0.0.0/0            udp dpt:68
    0     0 ACCEPT     6    --  *      virbr1  0.0.0.0/0            0.0.0.0/0            tcp dpt:68

ipv6:

# ip6tables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   56  4968 LIBVIRT_INP  0    --  *      *       ::/0                 ::/0                
    2   120 ACCEPT     0    --  *      *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     1    --  *      *       ::/0                 ::/0                
    2   160 ACCEPT     0    --  lo     *       ::/0                 ::/0                
    0     0 ACCEPT     6    --  *      *       ::/0                 ::/0                 tcp dpt:22
   52  4688 LOG        0    --  *      *       ::/0                 ::/0                 LOG flags 0 level 5 prefix "REC-INP Defend "
    0     0 REJECT     6    --  *      *       ::/0                 ::/0                 reject-with tcp-reset
    2   128 REJECT     17   --  *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable
   50  4560 REJECT     0    --  *      *       ::/0                 ::/0                 reject-with icmp6-addr-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 LIBVIRT_FWX  0    --  *      *       ::/0                 ::/0                
    0     0 LIBVIRT_FWI  0    --  *      *       ::/0                 ::/0                
    0     0 LIBVIRT_FWO  0    --  *      *       ::/0                 ::/0                

Chain OUTPUT (policy ACCEPT 26 packets, 1944 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   23  1696 LIBVIRT_OUT  0    --  *      *       ::/0                 ::/0                

Chain LIBVIRT_FWI (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     0    --  *      virbr0  ::/0                 fd00:0:0:22::/118   
    0     0 REJECT     0    --  *      virbr0  ::/0                 ::/0                 reject-with icmp6-port-unreachable
    0     0 REJECT     0    --  *      virbr1  ::/0                 ::/0                 reject-with icmp6-port-unreachable

Chain LIBVIRT_FWO (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     0    --  virbr0 *       fd00:0:0:22::/118    ::/0                
    0     0 REJECT     0    --  virbr0 *       ::/0                 ::/0                 reject-with icmp6-port-unreachable
    0     0 REJECT     0    --  virbr1 *       ::/0                 ::/0                 reject-with icmp6-port-unreachable

Chain LIBVIRT_FWX (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     0    --  virbr0 virbr0  ::/0                 ::/0                
    0     0 ACCEPT     0    --  virbr1 virbr1  ::/0                 ::/0                

Chain LIBVIRT_INP (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     17   --  virbr0 *       ::/0                 ::/0                 udp dpt:547
    0     0 ACCEPT     17   --  virbr0 *       ::/0                 ::/0                 udp dpt:53
    0     0 ACCEPT     6    --  virbr0 *       ::/0                 ::/0                 tcp dpt:53
    0     0 ACCEPT     17   --  virbr1 *       ::/0                 ::/0                 udp dpt:547
    0     0 ACCEPT     17   --  virbr1 *       ::/0                 ::/0                 udp dpt:53
    0     0 ACCEPT     6    --  virbr1 *       ::/0                 ::/0                 tcp dpt:53

Chain LIBVIRT_OUT (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     17   --  *      virbr0  ::/0                 ::/0                 udp dpt:546
    0     0 ACCEPT     17   --  *      virbr0  ::/0                 ::/0                 udp dpt:53
    0     0 ACCEPT     6    --  *      virbr0  ::/0                 ::/0                 tcp dpt:53
    0     0 ACCEPT     17   --  *      virbr1  ::/0                 ::/0                 udp dpt:546
    0     0 ACCEPT     17   --  *      virbr1  ::/0                 ::/0                 udp dpt:53
    0     0 ACCEPT     6    --  *      virbr1  ::/0                 ::/0                 tcp dpt:53

Dienst/Daemon einrichten

Damit nach einem Neustart des Servers auch die Virtualisierungsumgebung zur Verfügung steht, muss der libvirtd-Dienst/Daemon gestartet werden, was mit nachfolgendem Befehl eingerichtet werden muss:

[root@archlinux ~]# systemctl enable libvirtd.service
Created symlink /etc/systemd/system/multi-user.target.wants/libvirtd.service → /usr/lib/systemd/system/libvirtd.service.
Created symlink /etc/systemd/system/sockets.target.wants/virtlockd.socket → /usr/lib/systemd/system/virtlockd.socket.
Created symlink /etc/systemd/system/sockets.target.wants/virtlogd.socket → /usr/lib/systemd/system/virtlogd.socket.
Created symlink /etc/systemd/system/sockets.target.wants/libvirtd.socket → /usr/lib/systemd/system/libvirtd.socket.
Created symlink /etc/systemd/system/sockets.target.wants/libvirtd-ro.socket → /usr/lib/systemd/system/libvirtd-ro.socket.

Eine Überprüfung, ob beim Neustart des Server der libvirtd-Dienst/Daemon wirklich mit gestartet wird, kann mit nachfolgendem Befehl erfolgen und sollte eine Anzeige, wie ebenfalls nachfolgend dargestellt ausgeben:

[root@archlinux ~]# systemctl list-unit-files --type=service | grep -E ^libvirtd
libvirtd.service                           enabled         disabled

bzw.

[root@archlinux ~]# systemctl is-enabled libvirtd.service
enabled

Dienst: libvirtd starten

Anschließend kann der Dienst/Daemon gestartet werden, was mit nachfolgendem Befehl durchgeführt wird:

# systemctl start libvirtd.service

und mit nachfolgendem Befehl überprüft werden, ob der Start auch erfolgreich funktioniert hat:

# systemctl status libvirtd.service
● libvirtd.service - Virtualization daemon
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: disabled)
     Active: active (running) since Mon 2020-07-13 13:06:28 CEST; 2s ago
TriggeredBy: ● libvirtd-admin.socket
             ● libvirtd-ro.socket
             ● libvirtd.socket
       Docs: man:libvirtd(8)
             https://libvirt.org
   Main PID: 6340 (libvirtd)
      Tasks: 17 (limit: 32768)
     Memory: 8.4M
     CGroup: /system.slice/libvirtd.service
             └─6340 /usr/bin/libvirtd --timeout 120

Jul 13 13:06:28 archlinux systemd[1]: Started Virtualization daemon.

Benutzer libvirt anlegen

Nachfolgender Befehl erstellt einen neuen Benutzer mit

  • dem Kommentar: libvirt
  • der Gruppen-ID: 975
  • und mit der Erstellung eines home-Verzeichnisses
  • der shell: /bin/bash
  • der Benutzer-ID: 975
  • der Bezeichnung: hier libvirt
[root@archlinux ~]# useradd -c 'libvirt' -g 975 -m -s /bin/bash -u 975 libvirt

Ein Überprüfung ob der Benutzer ordnungsgemäß erstellt wurde, kann durch ausführen von nachfolgendem Befehl und einer Anzeige wie folgt, durchgeführt werden:

[root@archlinux ~]# cat /etc/passwd | grep libvirt
libvirt:x:975:975:libvirt:/home/libvirt:/bin/bash

Abschließend soll noch ein Passwort für den Benutzer libvirt mit nachfolgendem Befehl gesetzt werden:

[root@archlinux ~]# passwd libvirt
New password
Retype new password:
passwd: password updated successfully

X-Session Übernahme ermöglichen

Damit eine Übernahme der X-Session vom Benutzer der sich via SSH verbindet, auf den zuvor engelegten Benutzer libvirt möglich wird, sind nachfolgende Ergänzungen der Konfigurationsdateien:

  • /etc/pam.d/su
  • /etc/pam.d/su-l

notwendig.

Nachfolgende Zeilen sind an die jeweils zuvor genannten Konfigurationsdateien anzuhängen was mit nachfolgenden Befehlen durchgeführt werden kann:

/etc/pam.d/su

# echo session         optional        pam_xauth.so >> /etc/pam.d/su

/etc/pam.d/su-l

# echo session         optional        pam_xauth.so >> /etc/pam.d/su-l

Starten des virt-managers über eine Remote-Verbindung

Login via SSH-Benutzer

Zuerst soll eine SSH-Remote-Verbindung zum Server hergestellt werden, auf dem der libvirtd-Dienst/Daemon läuft. Nachfolgend soll der Benuzter klaus dazu verwendet werden:

$ ssh -A -X -2 -t klaus@192.168.0.125
klaus@192.168.0.125's password: 
Last login: Mon Jul 13 15:36:07 2020 from 192.168.0.20
[klaus@archlinux ~]$

Benutzerwechsel: libvirt

Anschließend soll vom Benutzer klaus zum Benutzer libvirt mit nachfolgendem Befehl gewechselt werden:

[klaus@archlinux ~]$ su libvirt -
Password: 
[libvirt@archlinux klaus]$

Starten des virt-manager

Nun kann als Benutzer libvirt der virt-manager mit nachfolgendem Befehl gestartet werden:

$ virt-manager &
[1] 1074
[libvirt@archlinux klaus]$

Mit nachfolgendem Befehl kann nach erfolgreichem Wechsel zum Benutzer libvirt und Start des virt-manager's überprüft werden, ob dieser auch unter dem Benutzer libvirt gestartet wurde und nicht unter dem Benutzer, unter dem die SSH-Verbindung hergestellt wurde:

$ ps auxwf | grep virt-manager 
libvirt      978  0.0  0.0   6596  2256 pts/0    S+   15:33   0:00                      \_ grep virt-manager
libvirt      922  2.1  0.1 784460 76688 ?        Ssl  15:31   0:01 python3 /usr/share/virt-manager/virt-manager

Nach ein wenig Anpassungen am Aussehen des virt-managers, könnte dieser nun wie folgt, nach dessen Start, aussehen:

ArchLinux - virt-manager - angepasstes Aussehen

Problembehandlung

cannot open display

Falls nach einer erfolgreichen SSH-Remote-Verbindung und der Wechsel zum Benutzer libvirt nachfolgende Fehlermeldung beim Starten des virt-manager's erscheinen sollte:

[libvirt@archlinux klaus]$ virt-manager &
[1] 1158
[libvirt@archlinux klaus]$ Unable to init server: Could not connect: Connection refused
Unable to init server: Could not connect: Connection refused
Unable to init server: Could not connect: Connection refused

(virt-manager:1159): Gtk-WARNING **: 15:45:42.590: cannot open display: 

liegt dies daran, dass in der Konfigurationsdatei

  • /etc/ssh/sshd_config

das

  • X11Forwarding no

noch gesetzt ist.

Eine Korrektur der Einstellung in der Konfigurationsdatei /etc/ssh/sshd_config bei X11Forwarding wie folgt dargestellt, einem Neustart des SSH-Dienstes/Daemon und dem kompletten Verlassen der SSH-Remote-Verbindung mit allen Benutzer und einer entsprechenden Neuanmeldung, sollte das Problem lösen:

Nur relevanter Ausschnitt:

# Tachtler
# default: #X11Forwarding no
X11Forwarding yes
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/archlinux_-_virtualisierung_mit_kvm.txt · Zuletzt geändert: 2024/06/13 08:36 von klaus