Inhaltsverzeichnis
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.
Beschreibung | Externer Link |
---|---|
Homepage | https://www.archlinux.de/ |
Herunterladen | https://www.archlinux.de/download |
Dokumentation | https://wiki.archlinux.de/title/Hauptseite |
Installation | https://wiki.archlinux.de/title/Anleitung_für_Einsteiger |
- QEMU | https://wiki.archlinux.org/index.php/QEMU |
- libvirt | https://wiki.archlinux.org/index.php/Libvirt |
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 Paketenvirt-manager
- Desktop GUI zur Verwaltung von virtuellen Maschinendnsmasq
- DNS „Forwarder“ und DHCP-Serverdmidecode
- Desktop Management Interface Tabellen Werkzeugeedk2-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-manager
s, könnte dieser nun wie folgt, nach dessen Start, 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