Vorinstalliertes System durch Alpine Linux ersetzen

Nur wenige Anbieter bieten virtuelle private Server (VPS) mit Alpine Linux an. Oft ist allerdings ein “Rettungsmodus” verfügbar, der grundlegende Änderungen am System ermöglicht.

Diese Anleitung beschreibt wie man diesen Rettungsmodus nutzt um ein vorinstalliertes Betriebssystem komplett durch ein “diskless” Alpine Linux zu ersetzen.

Obgleich sie auf die Änderungen in einem VPS optimiert ist, kann die gleiche Vorgehensweise bei Bedarf auch für lokale Installationen genutzt werden.

Rettungsmodus aktivieren

Der Rettungsmodus wird für gewöhnlich über die Web-Verwaltungsoberfläche des Hosting-Anbieters aktiviert.

Sobald sich das System in diesem Modus befindet, kann man mit folgenden Schritten fortfahren.

Im Rettungssystem: Alpine Linux herunterladen

Das ISO-Abbild dient als Vorlage für die bootbare Partition die eingerichtet werden soll.
Das minirootfs-Archiv stellt eine Alpine Linux chroot-Umgebung mit dem notwendigen Werkzeug `setup-bootable`1 bereit.
Die headless.apkovl passt die Konfiguration so an, dass bereits beim ersten Start Fernzugriff per SSH möglich wird.

wget --no-check-certificate \
        https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/alpine-minirootfs-3.17.2-x86_64.tar.gz \
        https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/alpine-virt-3.17.2-x86_64.iso \
        https://github.com/macmpi/alpine-linux-headless-bootstrap/raw/main/headless.apkovl.tar.gz

Im Rettungssystem: Partitionen vorbereiten

Achtung: Ab hier werden die bisherigen Inhalte des angegebenen Geräts zerstört.

Es ist auch zu berücksichtigen, dass sich im Rettungssystem der Gerätename der Festplatte oft von dem im Normalbetrieb unterscheidet.

# Diese drei Konstanten anpassen
BLOCK_DEVICE=/dev/vdb
PARTITION1_MB=500
PARTITION2=${BLOCK_DEVICE}2

start=2048
sector_size=512
part1_sectors=$(($PARTITION1_MB *1024*1024/ $sector_size))

echo "label: dos
sector-size: $sector_size
start=$start, size=$part1_sectors, type=b, bootable
start=$(($start + $part1_sectors)), type=83
" | sfdisk $BLOCK_DEVICE

# Dateisystem der zweiten Partition initialisieren
mkfs.ext4 $PARTITION2

Im Rettungssystem: Temporäres Alpine Linux einrichten

# Diese Konstante anpassen
PARTITION1=${BLOCK_DEVICE}1

mkdir /alpine
tar xzvf alpine-minirootfs-3.17.2-x86_64.tar.gz -C /alpine

for d in dev sys proc tmp ; do mount --rbind /$d /alpine/$d ; done

cp /etc/resolv.conf /alpine/etc/resolv.conf 
cp /etc/network/interfaces /alpine/etc/network/interfaces
cp alpine-virt-3.17.2-x86_64.iso /alpine/root/

chroot /alpine mkfs.vfat -vn ALPINE $PARTITION1
chroot /alpine apk update
chroot /alpine apk add alpine-conf

Im Rettungssystem: Alpine Linux auf Zielgerät installieren

# Diese Konstante anpassen
BLOCK_DEVICE=/dev/vdb

chroot /alpine setup-bootable -v /root/alpine-virt-3.17.2-x86_64.iso $PARTITION1

mount $PARTITION1 /mnt
cp headless.apkovl.tar.gz /mnt/

poweroff

Rettungsmodus deaktivieren

An dieser Stelle schaltet man System wieder zurück in den Normalbetrieb und startet das neu installierte Alpine Linux.

Alpine Linux System konfigurieren

# Diese Konstante anpassen
PARTITION2=vda2

# System nach Wunsch konfigurieren
setup-alpine

# Zweite Partition beim Start einhängen
mkdir /media/${PARTITION2}
printf "\n/dev/${PARTITION2}\t/media/${PARTITION2}\text4\trw\t0 0\n" >> /etc/fstab

# Public Key SSH-Rootzugang vorbereiten
mkdir /root/.ssh && touch /root/.ssh/authorized_keys
chmod -R go-rwx /root/.ssh
lbu include /root/.ssh/authorized_keys

Änderungen dauerhaft übernehmen

lbu commit -d

lbu commit muss immer ausgeführt werden, wenn Änderungen dauerhaft übernommen werden sollen. Es schreibt Konfigurationsanpassungen in /media/$PARTITION1/$HOST.apkovl.tar.gz.

Von dieser Datei werden sie dann beim nächsten Systemstart wiederhergestellt. Das Grundsystem bleibt unverändert.


1 https://wiki.alpinelinux.org/wiki/Alpine_setup_scripts#setup-bootable