Seit kurzem habe ich einen kleinen Storage-VPS bei Contabo. Dieser wurde auf meinen Wunsch (Kommentar in der Bestellfunktion) am Standort München bereitgestellt und bietet damit eine akzeptable Georedundanz zu Nürnberg, wo die restlichen Server angemietet sind. Mit den ~ 150 km ist man schon recht gut an der Empfehlung des BSI (200 km) für georedundante Rechenzentren dran - für die geplanten Anforderungen auf jeden Fall gut genug!

Um die Vertraulichkeit der Daten zu gewährleisten, wollte ich ein vollverschlüsseltes Debian 10 installieren. Interessanterweise ist es im Kundenpanel von Contabo nicht möglich ISO-Dateien einzubinden - Neuinstallationen des Server sind nur mit fertigen Images des Anbieters möglich, welche natürlich keine Vollverschlüsselung mit sich bringen und welche natürlich ein gesundes Vertrauen in den Anbieter verlangen. Andere Anbieter (z.B. netcup oder Hetzner) bieten neben zahlreichen ISO-Dateien sogar die Möglichkeit eigene ISO-Dateien hochzuladen und zu mounten.

Große ISO-Auswahl bei netcup.
Große ISO-Auswahl bei netcup.

Der Support von Contabo teilte mir auf Anfrage dann mit, dass ISO-Dateien durch den Support händisch eingebunden werden können - verbunden mit zusätzlichen Kosten von 25 € pro 15 Minuten. Dieser Weg war mir zu umständlich, zu teuer (es geht schließlich nur darum eine ISO-Datei einzubinden) und zu langwierig (der Support hat ca. 6 h für die Antwort benötigt).

Also habe ich nach einer Alternative recherchiert und wurde fündig: mit grub lassen sich ISO-Dateien direkt von Datenträgern booten. Die ISO-Datei wird dabei vollständig in den RAM geladen, sodass anschließend auf dem gleichen Datenträger (von dem wir eben noch die ISO-Datei geladen haben) das gewünschte System installiert werden kann. Das Vorgehen ist dabei nicht auf Contabo als Anbieter beschränkt, sondern ist auch bei jedem anderen VPS-Anbieter möglich.

Voraussetzungen

Um die nachfolgenden Schritte durchführen zu können wird folgendes benötigt:

  • Link zur ISO-Datei (in meinem Fall eine Debian 10 Netinst-ISO)
  • ein vorinstallierter Server mit Linux-System und Grub 2 (in meinem Fall Debian 10)
  • VNC-Zugriff auf den virtuellen Server (da wir im Bootprozess eingreifen müssen und die Installation darüber vornehmen wollen)

Meine Partitionierung sieht wie folgt aus:

root@vmd7XXX2:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  5.3M  390M   2% /run
/dev/sda2       294G  967M  278G   1% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda1       922M   47M  812M   6% /boot
tmpfs           395M     0  395M   0% /run/user/0

Auffällig ist, dass /boot eine eigene Partition auf /dev/sda1 ist. Das muss später bei den Pfadangaben entsprechend beachtet werden.

Schritt 1: Download der gewünschten ISO-Datei auf dem Server

Wir erstellen als root-User in der Bootpartition einen neuen Ordner /boot/iso. Dort muss nun die zu bootende ISO-Datei abgelegt werden . Anschließend benötigen wir bei Debian noch die initrd.gz aus dem Ordner hd-media:

root@vmd7XXX2:~# mkdir -p /boot/iso && \
cd /boot/iso && \
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.9.0-amd64-netinst.iso && \
wget https://mirrors.edge.kernel.org/debian/dists/stable/main/installer-amd64/current/images/hd-media/initrd.gz

Schritt 2: Grub-Konfiguration anpassen

Nun referenzieren wir die beiden Dateien in unserer Grub-Konfiguration:

nano /etc/grub.d/40_custom

Die Datei startet mit einigen Zeilen, die wir so belassen. Darunter fügen wir dann folgende Zeilen ein:

menuentry 'Debian Netinstall' {
    set isofile='/iso/debian-10.9.0-amd64-netinst.iso'
    set initrdfile='/iso/initrd.gz'
    loopback loop $isofile
    linux (loop)/install.amd/vmlinuz findiso=$isofile priority=low
    initrd $initrdfile
}

Wichtig: da ich eine eigene Boot-Partition habe, welche unter /boot gemountet wird, muss ich hier das /boot weglassen, sodass meine Pfade direkt mit /iso beginnen. Das kann bei euch (je nach Partitionierung abweichend sein).

Am Ende sieht der Inhalt der Datei dann wie folgt aus:

root@vmd7XXX2:~# cat /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry 'Debian Netinstall' {
    set isofile='/iso/debian-10.9.0-amd64-netinst.iso'
    set initrdfile='/iso/initrd.gz'
    loopback loop $isofile
    linux (loop)/install.amd/vmlinuz findiso=$isofile priority=low
    initrd $initrdfile
}

Nun müssen wir Grub die Datei noch einlesen und die Konfiguration aktualisieren lassen:

root@vmd7XXX2:~# update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.19.0-16-amd64
Found initrd image: /boot/initrd.img-4.19.0-16-amd64
done

Schritt 3: ISO booten

Nach einem Neustart können wir in der VNC-Konsole (z.B. mit KRDC) im Bootmenü die ISO mit den Pfeiltasten auswählen:

Grub bietet uns den ISO-Start direkt im Menü an.
Grub bietet uns den ISO-Start direkt im Menü an.

Die Wahl bestätigen wir mit Enter. Nun bootet auch schon die Netinstall-ISO und wir landen im Installationsprozess.

Hier wählen wir alle benötigten Punkte (Choose language, Configure the keyboard, Scan hard drives for an installer ISO image). Die Dialoge können wir alle mit Enter bestätigen, bis wir die ISO-Datei auswählen können:

Nach der Auswahl der ISO wählen wir Yes um die ISO in den RAM zu laden. Dies ermöglicht es uns anschließend auf dem Datenträger die Installation durchzuführen.

Um nun in den normalen Installationsprozess zu wechseln wählen wir im Installer Menü Change debconf priority und anschließend high.

Ab hier funktioniert die Installation wie gewohnt. Bei der Partitionierung lässt sich der Datenträger, von dem die ISO kopiert wurde, auswählen und die Installation ganz normal durchführen und beenden.