Wer unter Linux den Logical Volume Manager, kurz LVM nutzt, gewinnt an Flexibilität was die Nutzung von Festplatten und die entsprechende Aufteilung von Partionen und Ähnlichem angeht. So kann zum Beispiel eine Partion einfach auf eine zweite Festplatte erweitert werden. Dazu muss im ersten Schritt ein neues Physical Volume erstellt werden:
pvcreate /dev/sdb
Tritt dabei eine Fehlermeldung auf:
WARNING: Device for PV KT64tM-fAuf-zWoj-WuGQ-c5na-Z4x1-5NNwHq not found or rejected by a filter.
Can’t initialize physical volume „/dev/sdb“ of volume group „vgubuntu“ without -ff
/dev/sdb: physical volume not initialized.
muss die entsprechende Festplatte vorher mittels des wipefs-Kommandos bereinigt werden:
wipefs -a /dev/sdb
Anschließend kann das Physical Volume erstellt werden. Im nächsten Schritt muss die entsprechende Volume Group um das neue Physical Volume erweitert werden:
vgextend elementary-vg /dev/sdb
Ist die Volume Group nicht bekannt, so können die vorhandenen Volume Groups über das Kommando:
vgs
eingesehen werden. Nachdem dies geschehen ist, solle der Speicherplatz der entsprechenden Partion zugewiesen und das Dateisystem erweitert werden:
In den letzten Monaten überarbeitete ich mein Buch Selfhosting: Server aufsetzen und betreiben. Wie der Name es andeutet, handelt das Buch vom Betrieb eines eigenen Servers. Im Grunde geht es darum einen Server und seine Dienste aufzusetzen und zu betreiben. Als Betriebssystem wird Ubuntu 18.04 LTS genutzt. Die erste Version erschien im Juli 2015, was mittlerweile knapp vier Jahre her ist. Unter anderem deswegen wurde das Buch komplett überarbeitet.
Der Umfang des Buches hat um 65 Prozent, gegenüber der ersten Version zugenommen. Neben der kompletten Umstellung auf Ubuntu 18.04 LTS wurden viele weitere Themen in das Buch aufgenommen, so wird nun detailliert auf die Erzeugung von Zertifikaten mittels Let’s Encrypt eingegangen, es wird die Aktualisierung des Servers oder die Nutzung von MariaDB genauer beleuchtet und es wurde auf viele weitere Themen genauer und umfangreicher eingegangen.
Die neue Version von Selfhosting ist nun verfügbar
Nach einer kurzen Einleitung behandelt das Buch die Beschaffung eines Servers, die anschließende Installation und Grundeinrichtung. Dazwischen werden benötigte Linux-Grundlagen vermittelt. Nach der Grundeinrichtung werden speziellere Setups, wie Virtualisierung mittels KVM und verschlüsselte Server, beschrieben. Anschließend geht es an die Einrichtung unterschiedlichster Servertypen, wie Mail-, Game- oder Webserver. Neben diesen werden weitere Dienste wie Git und XMPP besprochen. In den weiteren Abschnitten des Buches wird auf Themen wie das Backup von Servern, der Sicherheit, Wartung und Verwaltung derselben eingegangen.
Erhältlich ist das Buch unter anderem bei Amazon, Beam, Google Play, eBook.de und iTunes. Bei den meisten Anbietern, wird das Buch, wenn es bereits gekauft wurde, automatisch aktualisiert. Weitere Informationen über das Buch befinden sich auf der entsprechenden Seite.
Server in einem Rechenzentrum laufen normalerweise unverschlüsselt; was nicht weiter verwundert, immerhin können die Server nicht einfach per Tastatur freigeschaltet werden. Ich habe das Problem vor Jahren so für mich gelöst, dass die Hostmaschine unverschlüsselt lief und auf dieser Maschine verschlüsselte und virtualisierte Gastmaschinen liefen. Genutzt wurde hierfür KVM. Für einen neuen Server möchte ich den physikalischen Server verschlüsseln und diesen per SSH freischalten. Einzig und alleine die boot-Partion sollte dann noch unverschlüsselt.
Die Installation des Servers über das Tool installimage
Beschrieben wird das ganze Prozedere hierbei anhand des Hoster Hetzner. Bei anderen Hostern, werden sich Feinheiten, wie die initiale Installation und ähnliches unterscheiden. Im ersten Schritt wird der Server über das Webinterface von Hetznerim Rescue-Modus gebootet. Dazu muss dieser aktiviert werden und anschließend der Server neugestartet werden. Installiert wird das neue System über das Tool installimage. Um die Installation zu automatisieren, wird im root-Verzeichnis eine Datei mit dem Namen autosetup angelegt:
nano /autosetup
Diese Datei wird mit folgendem Inhalt befüllt:
## Hetzner Online GmbH - installimage - config
## HARD DISK DRIVE(S):
# Onboard: ST4000NM0024-1HT178
DRIVE1 /dev/sda
# Onboard: ST4000NM0024-1HT178
DRIVE2 /dev/sdb
## SOFTWARE RAID:
## activate software RAID? < 0 | 1 >
SWRAID 1
## Choose the level for the software RAID < 0 | 1 | 10 >
SWRAIDLEVEL 0
## BOOTLOADER:
BOOTLOADER grub
## HOSTNAME:
HOSTNAME server
## PARTITIONS / FILESYSTEMS:
PART /boot ext3 2G
PART lvm vg0 all
LV vg0 swap swap swap 64G
LV vg0 root / ext4 all
## OPERATING SYSTEM IMAGE:
IMAGE /root/.oldroot/nfs/install/../images/Ubuntu-1804-bionic-64-minimal.tar.gz
Anschließend wird installimage gestartet:
installimage
Findet installimage beim Start besagte autosetup-Datei wird die Installation automatisch durchgeführt. Nach einigen Minuten ist die Installation abgeschlossen. Die Partitionierung des Servers wurde bewusst einfach gehalten, so existiert eine Boot-, eine Swap- und eine Datenpartion. Im einzelnen existieren technisch gesehen zwei Partitionen, eine boot-Partition und eine Partition für das LVM. Innerhalb des LVM werden zwei logische Partitionen für Swap- und die Datenpartition bzw. das root-Verzeichnis hinterlegt. Nach der Installation kann der Server aus dem Rescue-System heraus neugestartet werden:
reboot
Die Verbindung zum Server wird dadurch getrennt. Diese Pause kann man nun nutzen, um die SSH-Schlüssel für die Freischaltung auf dem lokalen Rechner anzulegen:
ssh-keygen -t rsa -b 4096 -f .ssh/dropbear
Nachdem dies geschehen ist, kann sich wieder per SSH mit dem Server verbunden werden. Dies wird mit einer Fehlermeldung quittiert werden:
Damit wird der entsprechende Eintrag entfernt und die Verbindung per SSH kann wiederhergestellt werden. Auf dem installierten System werden nun die Pakete auf den aktuellen Stand gebracht und anschließend werden BusyBox und Dropbear installiert:
BusyBox und Dropbear werden später für die Freischaltung per SSH benötigt. Bei BusyBox handelt es sich um eine Sammlung von Kommandozeilentools, während Dropbear ein minimaler SSH-Server ist. Diese sollen in das initramfs integriert werden und somit beim Start des System zur Verfügung stehen. Dazu wird im nächsten Schritt die Datei initramfs.conf bearbeitet:
nano /etc/initramfs-tools/initramfs.conf
Dort wird der Wert:
BUSYBOX=auto
in
BUSYBOX=y
geändert. Anschließend werden die Schlüssel für den SSH-Server Dropbear hinterlegt:
nano /etc/dropbear-initramfs/authorized_keys
In die Datei authorized_keys wird nun der, in der auf dem lokalen Rechner enthaltenden Datei dropbear.pub, hinterlegte Schlüssel eingefügt und die Datei gespeichert. Da es einen Bug in Ubuntu 18.04 gibt, welcher das spätere Entsperren verhindern, muss ein passender Workarround installiert werden.
cd /etc/initramfs-tools/hooks/
nano cryptsetup-fix.sh
In die Datei wird nun folgendes Skript kopiert:
#!/bin/sh
# This hook is for fixing busybox-initramfs issue while unlocking a luks
# encrypted rootfs. The problem is that the included busybox version
# is stripped down to the point that it breaks cryptroot-unlock script:
# https://bugs.launchpad.net/ubuntu/+source/busybox/+bug/1651818
# This is a non-aggressive fix based on the original busybox-initramfs hook
# until the bug is fixed.
# busybox or busybox-static package must be present for this to work
# This file should be placed in /etc/initramfs-tools/hooks/ and have +x flag set
# after that you need to rebuild the initramfs with 'update-initramfs -u'
# Users reported the solution working on at least:
# Ubuntu 17.04, 17.10, 18.04
# Also note that this does not replace busybox-initramfs package.
# The package must be present, this hook just fixes what's broken.
# Hamy - www.hamy.io
set -e
case "${1:-}" in
prereqs) echo ""; exit 0;;
esac
[ n = "$BUSYBOX" ] && exit 0
[ -r /usr/share/initramfs-tools/hook-functions ] || exit 0
. /usr/share/initramfs-tools/hook-functions
# Testing the presence of busybox-initramfs hook
[ -x /usr/share/initramfs-tools/hooks/zz-busybox-initramfs ] || exit 0
# The original busybox binary added by busybox-initramfs
BB_BIN_ORG=$DESTDIR/bin/busybox
[ -x $BB_BIN_ORG ] || exit 0
# The one we want to replace it with
[ -x /bin/busybox ] || exit 0
BB_BIN=/bin/busybox
# Ensure the original busybox lacks extended options
# and the soon-to-be-replaced-by one does not
if $BB_BIN_ORG ps -eo pid,args >/dev/null 2>&1; then
exit 0
elif ! $BB_BIN ps -eo pid,args >/dev/null 2>&1; then
exit 0
fi
# Get the inode number of busybox-initramfs binary
BB_BIN_ORG_IND=$(stat --format=%i $BB_BIN_ORG)
# Replace the binary
rm -f $BB_BIN_ORG
copy_exec $BB_BIN /bin/busybox
echo -n "Fixing busybox-initramfs for:"
for alias in $($BB_BIN --list-long); do
alias="${alias#/}"
case "$alias" in
# strip leading /usr, we don't use it
usr/*) alias="${alias#usr/}" ;;
*/*) ;;
*) alias="bin/$alias" ;; # make it into /bin
esac
# Remove (and then re-add) all the hardlinks added by busybox-initramfs
if [ -e "$DESTDIR/$alias" ] && [ $(stat --format=%i "$DESTDIR/$alias") -eq $BB_BIN_ORG_IND ]; then
echo -n " ${alias##*/}"
rm -f "$DESTDIR/$alias"
ln "$DESTDIR/bin/busybox" "$DESTDIR/$alias"
fi
done
# To get a trailing new line
echo
Anschließend muss das Skript ausführbar gemacht werden:
chmod +x cryptsetup-fix.sh
Der betreffende Bug ist zwar mittlerweile mit einem Fix versehen, bisher taucht die Version 2:2.0.2-1ubuntu2 des cryptsetup-Paketes allerdings nur in der nächsten Ubuntu Version 18.10 auf. Der nun installierte Hook sorgt dafür das bestimmte Kommandos beim Generieren des initramfs korrigiert werden. Anschließend muss der Server wieder in das Rescue-System von Hetzner gestartet werden. Dazu wird dieses wieder über das Hetzner-Webinterface aktiviert und anschließend der Server neugestartet:
reboot
Im Rescue-System wird nun das LVM gemountet. Da dieses nicht standardmäßig unter /dev/mapper/ auftaucht muss das Tool lvm bemüht werden:
lvm vgscan -v
lvm vgchange -a y
Dabei werden die Volume Groups gesucht und anschließend aktiviert. Nun kann das LVM gemountet werden.
mount /dev/mapper/vg0-root /mnt/
Vom gemounteten LVM wird nun eine Sicherung im Ordner /oldroot angelegt:
mkdir /oldroot/
rsync -a /mnt/ /oldroot/
Nachdem die Sicherung, welche einige Minuten in Anspruch nehmen kann, durchgeführt wurde, wird das LVM wieder deaktiviert:
umount /mnt/
Im nächsten Schritt wird die Volume Group gelöscht:
vgremove vg0
Dabei muss man eine Reihe von Abfragen mit y beantworten:
Do you really want to remove volume group "vg0" containing 2 logical volumes? [y/n]: y
Do you really want to remove active logical volume swap? [y/n]: y
Logical volume "swap" successfully removed
Do you really want to remove active logical volume root? [y/n]: y
Logical volume "root" successfully removed
Volume group "vg0" successfully removed
Nachdem die alte Volume Group gelöscht wurde, wird das verschlüsselte dm-crypt-Device angelegt:
Während dieses Prozess muss bestätigt werden das /dev/md1, das bei der Installation definierte RAID 0, wirklich gelöscht werden soll und eine sichere Passphrase eingegeben werden:
WARNING!
========
This will overwrite data on /dev/md1 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:
Danach wird das erzeugte dm-crypt-Device geöffnet:
cryptsetup luksOpen /dev/md1 cryptroot
Hierbei muss die verwendete Passphrase wieder eingegeben werden. Danach wird das physische Volume für cryptroot erzeugt:
pvcreate /dev/mapper/cryptroot
Nun wird eine neue Volume Group mit logischen Volumes angelegt:
Beim update-grub kann es zu folgenden Warnungen und Fehlern kommen:
Generating grub configuration file ...
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
error: cannot seek `/dev/mapper/cryptroot': Invalid argument.
error: cannot seek `/dev/mapper/cryptroot': Invalid argument.
error: cannot seek `/dev/mapper/cryptroot': Invalid argument.
error: cannot seek `/dev/mapper/cryptroot': Invalid argument.
Found linux image: /boot/vmlinuz-4.15.0-29-generic
Found initrd image: /boot/initrd.img-4.15.0-29-generic
Found linux image: /boot/vmlinuz-4.15.0-24-generic
Found initrd image: /boot/initrd.img-4.15.0-24-generic
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
error: cannot seek `/dev/mapper/cryptroot': Invalid argument.
error: cannot seek `/dev/mapper/cryptroot': Invalid argument.
error: cannot seek `/dev/mapper/cryptroot': Invalid argument.
error: cannot seek `/dev/mapper/cryptroot': Invalid argument.
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
done
Diese können grundsätzlich ignoriert werden. Die Warnung entsteht durch den im Rescue-System nicht vorhandenen Dienst lvmetad; im eigentlichen System ist dieser Dienst verfügbar. Die Fehlermeldungen entstehen beim Erzeugen der GRUB-Konfiguration mittels update-grub. Wenn man diesen Vorgang mittels grub-mkconfig laufen lässt, wird man feststellen das die Dateien /etc/grub.d/10_linux und /etc/grub.d/20_linux_xen hierfür verantwortlich sind. Um die Fehlermeldung zu deaktivieren muss folgender Block aus beiden Dateien entfernt werden:
# btrfs may reside on multiple devices. We cannot pass them as value of root= parameter
# and mounting btrfs requires user space scanning, so force UUID in this case.
if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
|| ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
|| ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then
LINUX_ROOT_DEVICE=${GRUB_DEVICE}
else
LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
fi
Anschließend kann erneut ein:
update-grub
ausgeführt werden. Danach wird die chroot-Umgebung verlassen, die Dateisysteme werden ausgehangen und der Server neugestartet:
Wenn man sich nun mit dem System über den Dropbear-Schlüssel verbindet:
ssh -i .ssh/dropbear
wird man von BusyBox begrüßt:
To unlock root partition, and maybe others like swap, run `cryptroot-unlock`
BusyBox v1.27.2 (Ubuntu 1:1.27.2-2ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.
Zur Entsperrung muss der Befehl cryptroot-unlock eingegeben und anschließend die Passphrase eingegeben. Dies führt zu folgender Ausgabe:
...
/bin/cryptroot-unlock: line 1: usleep: not found
/bin/cryptroot-unlock: line 1: usleep: not found
/bin/cryptroot-unlock: line 1: usleep: not found
Error: Timeout reached while waiting for PID 388.
Wenige Sekunden später sollte die Verbindung abbrechen und anschließend das System hochfahren. Auf dem System kann sich nun mit dem für den Server verwendeten SSH-Schlüssel angemeldet werden.
Vor einigen Tagen migrierte ich einen Minecraft-Server von einem Server mit Ubuntu 14.04 LTS auf einen Server mit Ubuntu 16.04 LTS. Der Minecraft-Server lief dabei auf dem alten als auch auf dem neuen Server jeweils in einer KVM-Gast-Maschine. Er startete ohne Probleme und wenn man sich das ganze von außen mit nmap anschaute, war der entsprechende Port auch offen gekennzeichnet. Allerdings konnte der Minecraft-Client keinerlei Verbindung mit dem Server aufnehmen. Lösen ließ sich das Problem mit der Änderung einer Einstellung in der server.properties Datei. Konkret ging es dabei um die Einstellung:
use-native-transport = true
welche auf false gesetzt werden musste. Mit diesem Flag wird das optimierte Senden und Empfangen von Paketen unter Linux deaktiviert. Damit funktionierte der Minecraft-Server wieder ohne Probleme.
Wenn man einen KVM Host aufgesetzt hat, steht man vor der Frage wie man diesen effizient verwaltet. Für die grafische Remoteverwaltung gibt es unter Ubuntu den Virtual Machine Manager welcher einfach über die Paketverwaltung installiert werden kann:
apt-get install virt-manager
Im Virtual Machine Manager können dabei neue virtuelle Maschinen angelegt oder bestehende Maschinen verändert werden. Der Virtual Machine Manager stellt dabei eine Abstraktionsebene bereit, so kann er nicht nur KVM, sondern auch Xen und LXC Maschinen verwalten.
Virtual Machine Manager
Unter Mac OS X steht keine Virtual Machine Manager Alternative zur Verfügung. Allerdings kann man hier etwas schummeln, indem man den KVM Host dafür zweckentfremdet. Dazu muss das Paket „virt-manager“ auf dem KVM Host installiert werden. Auf dem Mac muss XQuartz installiert werden, damit eine X11 Implementierung zur Verfügung steht. Nach der Installation öffnet man ein Terminal und gibt dort folgendes ein:
ssh -X
virt-manager -c qemu:///system
Anschließend wird der Manager gestartet und kann wie gewohnt genutzt werden.
Der Virtual Machine Manager unter Mac OS X
Bei diesem Verfahren wird die grafische Ausgabe des KVM Hosts auf den Mac umgeleitet. Somit wird der Virtual Machine Manager auf der Ubuntu-Maschine ausgeführt, präsentiert seine Oberfläche aber unter Mac OS X.