Arbeitsumgebung
SimpelMed / PostgreSQL / Python
Benötigt werden:
-
ein Arbeitsrechner mit genügend RAM (mindestens 8 GB, besser 16 GB) und ausreichend schneller Festplatte (vorzugseise SSD)
-
eine PostgreSQL-Datenbank, Server sinnvollerweise in virtueller Maschine
-
(optional, aber empfehlenswert) eine weiterere virtuelle Maschine mit der DB-Management-Oberfläche pgadmin4
-
diese »drei« Rechner werden über ein lokales Netz verbunden und sind gegenseitig ansprechbar/erreichbar.
Die Login-Namen der Standard-Nutzer des Host- und der Gastrechner sind unerheblich und könnten ohne Einschränkungen sogar identisch sein. Namen sind wie fast immer nur Schall und Rauch.
VirtualBox oder KVM (virt-manager)
Pro Virtualbox:
Netzwerk-Bridging einfach einzustellen ohne eigene Konfiguration
Contra:
erheblicher Overhead mit spürbarer Herabsetzung der Ausführungsgeschwindigkeit
sehr langsam sowie sehr hohe Zahl an Zugriffen bei Installation des Image auf eine herkömmliche SATA-Platte → dringend auf eine SSD ausweichen!
Pro KVM:
Schneller, performanter, kein Overhead
Contra:
Umkonfigurierung der Netzwerkeinstellungen notwendig (Bridging)
dies kan aber durch ein »einfaches (Python-)Script« durchgeführt werden
Beide Lösungen ermöglichen auch den Datenaustausch zwischen den (virtuellen) Rechnern;
beide Lösungen simulieren den Einsatz der Software in einem Client-Server-Umfeld.
Im Folgenden werden beide Lösungen beschrieben; beide Lösungen wurden getestet.
Virtualbox
Wichtig: Beim Starten/Installieren wird als »Netzwerk« gewählt:
Adapter … Netzwerkbrücke, nicht die Versäumniseinstellung »NAT«.
Als Distribution für die PostgreSQL-Datenbank kommen in die Auswahl:
1a) Ubuntu-Server oder
1b) Mint (Xfce).
Obwohl 1b) eine grafische Oberfläche bedienen muss, gibt es hier keinen nenennswerten, messbaren Performance-Abfall. Im Folgenden wird nur noch Mint (Xfce) betrachtet.
Als Distri für pgAdmin4 wird
1c) https://q4os.org/ q4OS gewählt.

Es werden unter Virtualbox zwei Maschinen eingerichtet, der einfacheren Bedienung wegen jeweils mit Gasterweiterungen und gemeinsamen Ordner: je einmal Mint (Download der Xfce-Edition https://linuxmint.com/edition.php?id=304) für den PostgreSQL-Server und einmal q4os (Download der empfehlenswerten Trinity-Version https://sourceforge.net/projects/q4os/files/stable/q4os-4.12-x64-instcd.r1.iso/download) für pgAdmin4.
Das eigentliche Einrichten/Installieren von VirtualBox und seinen virtuellen Maschinen wird hier nicht beschrieben. Es lässt sich falls gewünscht durch ein Script automatisieren: https://blogs.oracle.com/virtualization/post/guide-for-virtualbox-vm-unattended-installation oder https://www.youtube.com/watch?v=ypkItN4d4Y0
KVM/Qemu
Statt eines »Virtualbox-Netzwerkes« kann das benötigte Schema mit den drei virtuellen Rechnern auch über KVM/Qemu aufgebaut werden. Diese Lösung scheint nach unserer Erfahrung etwas bessere bzw. stabilere Ergebnisse zu zeigen. Alle weiteren Arbeitsschritte finden deswegen auf dieser Plattform statt.
Als Voreinstellung nutzt KVM/Qemu zur Netzanbindung NAT; das ist allerdings hier nicht geeignet, da sich damit die virtuellen Maschinen nicht »sehen« können. Durch das folgende (Python-)Skript kann aber problemlos eine virtuelle Brücke »Bridge« eingerichtet werde. Diese stört den sonstigen Internetverkehr in keinster Weise.
Bridge für KVM
Im ersten Schritt führen Sie das folgende Kommando aus, um die Daten für Ihren (Host-)Rechner zu erhalten:
(Ausgabe leicht gekürzt …)
bge ~ > ip -a address 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc ... UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host noprefixroute valid_lft forever preferred_lft forever 2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ... default qlen 1000 link/ether 24:be:05:17:7c:e2 brd ff:ff:ff:ff:ff:ff altname enp0s25 inet 192.168.178.20/24 brd 192.168.178.255 scope ... noprefixroute eno1 valid_lft 858650sec preferred_lft 858650sec <...>
Daraus ist zu entnehmen: der Ethernet-Adapter hat die Bezeichnung eno1, diesem ist die IP-Adresse 192.168.178.20/24 zugeteilt.
Mit diesen Angaben kann das folgende Skript seine Aufgabe erfüllen:
Die im Programm gekennzeichneten IP-Adressen des Host-Rechners und des Gateways müssen Sie natürlich an Ihre Daten anpassen!
Die gewünschten Information lassen sich auch durch folgendes kleines Python-Programm auslesen. Sie können die Werte dann Variablen zuweisen und müssen bridge.py nicht manuell konfigurieren. So wie hier geht es etwas schneller, darüber hinaus ist dieser Schritt nur einmal notwendig und eine Optimierung des Vorgehens scheint überflüssig.
#!/usr/bin/env python3 """ Ermittel den »Namen« der Netzwerkkarte und die TCP/IP-Adresse des Gateways. Root-Rechte sind nicht erforderlich. Beispielhafte Ausgabe: [(1, 'lo'), (2, 'eno1')] 127.0.1.1 192.168.178.20 Falls die Bridge schon eingerichtet wurde, sieht die Ausgabe wie folgt aus: [(1, 'lo'), (2, 'eno1'), (3, 'brbr0'), (4, 'taptap0'), (5, 'vnet0')] 127.0.1.1 192.168.178.20""" import socket print(socket.if_nameindex()) print(socket.gethostbyname(socket.gethostname())) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) print(s.getsockname()[0]) s.close()
Mit den jetzt vorliegenden Infos kann die virtuelle Bridge eingerichtet werden.
#!/usr/bin/env python3 """Richtet eiine virtuelle Bridge auf der vorhandenen Netzwerkkarte ein, damit Gäste untereinander und den Host-Rechner über TCP/IP »sehen« können. Angelehnt an: »QEMU - Bridged Networking« https://www.youtube.com/watch?v=VCAqkyVd7dM Muss als root/sudo gestartet werden! 'subprocess' wäre streng genommen gegenüber 'os.system' zu bevorzugen ...""" import os import time print("Start ...") try: os.system("modprobe tun tap") print("modprobe tun tap ... ok") time.sleep(1) # 'brbr0' ist ein beliebiger Platzhalter os.system("ip link add brbr0 type bridge") print("ip link add brbr0 type bridge ... ok") time.sleep(1) # 'taptap0' ist ein beliebiger Platzhalter os.system("ip tuntap add dev taptap0 mode tap") print("tuntap add dev taptap0 mode tap ... ok") time.sleep(1) # 'eno1' ist die Bezeichnung der Netzwerkkarte os.system("ip link set dev eno1 master brbr0") print("ip link set dev eno1 master brbr0 ... ok") time.sleep(1) os.system("ip link set dev taptap0 master brbr0") print("ip link set dev taptap0 master brbr0 ... ok") time.sleep(1) os.system("ip link set dev brbr0 up") print("ip link set dev brbr0 up ... ok") time.sleep(1) # IP-Adresse entsprechend einsetzen os.system("ip address delete 192.168.178.20/24 dev eno1") print("ip address delete 192.168.178.20/24 dev eno1 ... ok") time.sleep(1) os.system("ip address add 192.168.178.20/24 dev brbr0") print("ip address add 192.168.178.20/24 dev brbr0 ... ok") time.sleep(1) # Diese IP-Adresse benennt den Gateway os.system("ip route add default via 192.168.178.1 dev brbr0") print("ip route add default via 192.168.178.1 dev brbr0 ... ok") time.sleep(1) os.system("resolvectl dns brbr0 192.168.178.1") print("resolvectl dns brbr0 192.168.178.1 ... ok") time.sleep(1) os.system("systemctl restart systemd-resolved.service") print("systemctl restart systemd-resolved.service ... ok") time.sleep(1) print("... fertig!") except OSError: print("ERROR!")
Installation der Virtuellen Maschinen
Ganz analog zum Vorgehen bei VirtualBox werden nun zwei Maschinen installiert.
Wie bereits erwähnt, kommen hier sinnvollerweise alle Debian-Derivate in Frage. Gewählt wurde in unserer Umgebung LMDE (Linux Mint Debian Edition) - möglich wäre auch Mint Xfce, das ist Geschmacksache. Als zweites System kommt wie oben q4os zum Zuge (q4os.org).
Netzwerk einrichten und prüfen
Egal ob die Virtualbox- oder wie hier im Folgenden die KVM/Qemu-Lösung (über den virtuellen Netzwerkmanager apt-get install virt-manager) gewählt wird:
Für die weitere Administration des »Netzwerkes« aus Host und den beiden Guests benötigen wir noch jeweils die internen IP-Adressen. Diese werden mit folgendem Schritt mit dem Kommando ip a ermittelt.
(Ausgabe leicht gekürzt …)
<home>:~$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue ...default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ... default qlen 1000 link/ether 08:00:27:db:24:da brd ff:ff:ff:ff:ff:ff inet 192.168.178.63/24 brd 192.168.178.255 scope global dynamic noprefixroute enp0s3 valid_lft 863740sec preferred_lft 863740sec inet6 fd00::f17e:19b1:ac43:e604/64 scope global temporary dynamic valid_lft 6943sec preferred_lft 3343sec inet6 fd00::f4c:fcb9:430b:bf80/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 6943sec preferred_lft 3343sec inet6 2001:a61:ad3:4c01:2146:46a7:6de2:4847/64 scope global temporary dynamic valid_lft 5852sec preferred_lft 2252sec inet6 2001:a61:ad3:4c01:d799:6115:804c:b43f/64 scope ... noprefixroute valid_lft 5852sec preferred_lft 2252sec inet6 fe80::d228:2500:56e8:ada7/64 scope link noprefixroute valid_lft forever preferred_lft forever
Die Loopback-Adresse lautet erwartungsgemäß 127.0.0.1/8; diese wird nicht weiter benötigt. Unsere virtuelle Bridge liefert 192.168.178.63/24.
Analog gehen wir mit allen virtuellen Maschinen und unserem Gastrechner vor. Als Ergebnis haben wird schließlich drei IP-Adressen, die unser virtuelles Netzwerk bilden, z.B.:
192.168.178.63/24 für virtuelle Maschine Eins,
192.168.178.82/24 für virtuelle Maschine Zwei und schließlich
192.168.178.20/24 für den Wirtrechner.
Jede der Maschinen kann jeweils die beiden anderen über TCP/IP erreichen, das kann z.B. mit einem Ping bestätigt werden.
bge ~ > ping 192.168.178.63 PING 192.168.178.63 (192.168.178.63) 56(84) bytes of data. 64 bytes from 192.168.178.63: icmp_seq=1 ttl=64 time=0.263 ms 64 bytes from 192.168.178.63: icmp_seq=2 ttl=64 time=0.299 ms 64 bytes from 192.168.178.63: icmp_seq=3 ttl=64 time=0.307 ms 64 bytes from 192.168.178.63: icmp_seq=4 ttl=64 time=0.337 ms ^C --- 192.168.178.36 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3075ms rtt min/avg/max/mdev = 0.263/0.301/0.337/0.026 ms bge ~ >
DHCP konfigurieren
Der Arbeitsplatz bekommt vom DHCP-Server (z.B. einer Fritz-Box, einem Speedport oder ähnliches) die Adresse zugeteilt, hier 192.168.178.20/24. Wegen unserer Bridge erhalten auch die Virtuellen Maschinen eigene IP-Adressen. Es ist für die spätere Arbeit sehr hilfreich, wenn diese Adressen auch nach einem Neustart identisch sind. Andernfalls müsste z.B. pgAdmin4 und der GNUmed-Client jedes Mal neu auf die richtige Adresse eingerichtet werden.
In der Fritz-Box wird dies erreicht mittels
Startseite -> Heimnetz -> Netzwerk öffnen
Im Reiter Netzwerkverbindungen erscheinen unsere drei Netzrechner mit den eben ermittelten IP-Adressen.
Jetzt das Zeichen Bearbeiten (in der Fritz-Box ein Bleistift) anklicken, im nächsten Schritt die Zeile Adressen im Heimnetz (IP-Adressen) anklicken und einen Haken bei »Diesem Netzwerkgerät immer die gleiche IPv4-Adresse zuweisen.« Dann noch »Übernehmen«. Diese Schritte wie gesagt für alle beteiligten drei (virtuellen) Rechner durchführen. Diese festen Adressen beeinflussen das übrige Heimnetz nicht - auch wenn diese nicht online sind, verfügt die FritzBox über mehr als genug freie Adressen.

-> Weiter zu postgresql-pgadmin.