Wenn man sich einen Root-Server mietet, möchte man manchmal sein eigenes Betriebssystem installieren. Vielleicht weil man genau wissen möchte, was da installiert wurde - oder weil der Anbieter das gewünsche Betriebssystem nicht anbietet.

Der Artikel zeigt die Installation von Debian Bullseye auf einem Rootserver (hier im Rechenzentrum von Strato). Bei den meisten Anbietern von Root-Servern kann man nämlich keine virtuelle CD als ISO-Image einlegen und somit nicht auf dem regulären Weg ein eigenes Linux installieren.

Voraussetzung ist, dass man ein anderes Linux booten kann (heisst bei Strato Rescue-System / Recovery Manager) und man sollte den Meldungen des Servers einsehen können (bei Stratro: serielle Konsole).

Hier folgen die nötigen Befehle, die Details sollten für Linux-Admins selbsterklärend sein. Wer es detailierter wissen möchte, kann diesen Artikel: Debian8 Jessie per Bootstap auf Strato Rootserver installieren lesen, dort sind die nötigen Schritte ausführlicher beschrieben.

Kommentare und Befehle befinden sich hier gemeinsam innerhalb eines großen Blocks, da dies das Herauskopieren mehrerer Befehle für Dich vereinfacht.

#Partitionstabellen der Festplatten löschen
dd if=/dev/zero of=/dev/sda bs=1M count=1
dd if=/dev/zero of=/dev/sdb bs=1M count=1

#Rebooten
reboot -n

#Paketlisten auf neuesten Stand bringen und Pakete installieren
apt update && apt-get install parted debootstrap host -y

#Prüfen ob die beiden Platten leer (ohne Partitionen) sind
parted -l 

#Partition 1 benötigt für Nicht-EFI-Systeme nur 1 Mbyte,
#wenn jemand diese Anleitung für EFI-Systeme umändern will,
#sollte er 200 Mbyte vorsehen.
#Daher sieht diese Partitionsempfehlung gleich 200 Mbyte auf
#4 Tbyte große Platten vor.
#Der Start bei 1M sorgt auf einfache Art und Weise für ein korrektes Alignment

#Anlegen einer GPT-Partitionstabelle samt Partitionen auf /dev/sda
parted -s /dev/sda mklabel gpt
parted -s /dev/sda mkpart primary 1M 200M
parted -s /dev/sda mkpart primary 200M 34G
parted -s /dev/sda mkpart primary 34G 156G
parted -s /dev/sda mkpart primary 156G 1595G
parted -s /dev/sda mkpart primary 1595G 100%
parted -s /dev/sda set 1 bios_grub on
parted -s /dev/sda set 2 raid on
parted -s /dev/sda set 3 raid on
parted -s /dev/sda set 4 raid on
parted -s /dev/sda set 5 raid on

#Anlegen einer GPT-Partitionstabelle samt Partitionen auf /dev/sdb
parted -s /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart primary 1M 200M
parted -s /dev/sdb mkpart primary 200M 34G
parted -s /dev/sdb mkpart primary 34G 156G
parted -s /dev/sdb mkpart primary 156G 1595G
parted -s /dev/sdb mkpart primary 1595G 100%
parted -s /dev/sdb set 1 bios_grub on
parted -s /dev/sdb set 2 raid on
parted -s /dev/sdb set 3 raid on
parted -s /dev/sdb set 4 raid on
parted -s /dev/sdb set 5 raid on

#Prüfen auf Vorhandensein der eben angelegten Partitionen
parted -l 

#Anlegen der Software-Raid-Spiegelungen
mdadm --create /dev/md2 --level=mirror --raid-devices=2 /dev/sda2 /dev/sdb2 --metadata 1.2 --bitmap=none
mdadm --create /dev/md3 --level=mirror --raid-devices=2 /dev/sda3 /dev/sdb3 --metadata 1.2 --bitmap=internal
mdadm --create /dev/md4 --level=mirror --raid-devices=2 /dev/sda4 /dev/sdb4 --metadata 1.2 --bitmap=none
mdadm --create /dev/md5 --level=mirror --raid-devices=2 /dev/sda5 /dev/sdb5 --metadata 1.2 --bitmap=internal

#Prüfen ob das Synchronisieren der Raid-Arrays begonnen hat
cat /proc/mdstat

#Nun warten, bis die Arrays vollständig synchronisiert wurden,
#sonst ist der folgende Prozess sehr langsam, weil der Sync der Arrays
#und das Schreiben auf die Filesysteme miteinander konkurrieren.
#Hierzu beobachten wir den Sync, mit STRG-C beenden wir den Befehl "watch"
watch "cat /proc/mdstat"

#Anlegen von SWAP und Dateisystemen
mkswap /dev/md2
mke2fs -t ext4  /dev/md3
mke2fs -t ext4  /dev/md4
mke2fs -t ext4  /dev/md5

#Mounten der Raid-Arrays und Anlegen der im Moment benötigten Verzeichnisse
mount /dev/md3 /mnt/
mkdir /mnt/home /mnt/usr /mnt/var /mnt/boot /mnt/boot/grub /mnt/etc /mnt/tmp /mnt/dev /mnt/proc /mnt/sys /mnt/mnt /mnt/root /mnt/backuppartition
chmod 700 /mnt/root /mnt/backuppartition
chmod 777 /mnt/tmp
chmod +t /mnt/tmp
mount /dev/md4 /mnt/var
mount /dev/md5 /mnt/backuppartition

#erzeugen der Datei fstab
my_array=()
while IFS= read -r line; do
    my_array+=( "$line" )
done < <( blkid | grep md | awk '{print $1,$2}' | sort )

md2=`echo ${my_array[0]} | awk '{print $2}'`" none swap defaults,pri=1 0 0 #"`echo ${my_array[0]} | awk '{print $1}' |cut -f1 -d:`
md3=`echo ${my_array[1]} | awk '{print $2}'`" / ext4 defaults,errors=remount-ro 0 1 #"`echo ${my_array[1]} | awk '{print $1}' |cut -f1 -d:`
md4=`echo ${my_array[2]} | awk '{print $2}'`" /var ext4 defaults,usrquota  0 2 #"`echo ${my_array[2]} | awk '{print $1}' |cut -f1 -d:`
md5=`echo ${my_array[3]} | awk '{print $2}'`" /backuppartition ext4 defaults  0 2 #"`echo ${my_array[3]} | awk '{print $1}' |cut -f1 -d:`

echo 'proc /proc proc defaults 0 0' >  /mnt/etc/fstab
echo $md2 >>  /mnt/etc/fstab
echo $md3 >>  /mnt/etc/fstab
echo $md4 >>  /mnt/etc/fstab
echo $md5 >>  /mnt/etc/fstab


#Debian9 Bootstrap in /mnt durchführen (Installation des Basis-Systems)
debootstrap --arch amd64 bullseye /mnt http://ftp.de.debian.org/debian

#Chroot ins neu installierte Debian9
#/dev und /sys ins chroot mounten
mount --bind /dev /mnt/dev
mount -t sysfs /sys /mnt/sys

#chroot
chroot /mnt

#proc verfügbar machen
mount -tproc none /proc
mount -t devpts devpts -o noexec,nosuid,gid=5,mode=620 /dev/pts

#Anlegen eines Passworts für Root
#Achtung, um per SSH zuzugreifen ist ein weiterer Benutzer oder das Hinterlegen eines Zertifikates nötig.
#Bei Strato können wir aber über die serielle Konsole zugreifen und diesen Schritt später noch durchführen
passwd

#Erzeugen der Paketquellen für apt
echo 'deb http://httpredir.debian.org/debian bullseye main non-free contrib' > /etc/apt/sources.list                         
echo 'deb-src http://httpredir.debian.org/debian bullseye main non-free contrib' >> /etc/apt/sources.list                  
echo 'deb http://httpredir.debian.org/debian bullseye-updates main contrib non-free' >> /etc/apt/sources.list              
echo 'deb-src http://httpredir.debian.org/debian bullseye-updates main contrib non-free' >> /etc/apt/sources.list          
echo 'deb http://security.debian.org/debian-security bullseye-security main contrib non-free' >> /etc/apt/sources.list     
echo 'deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free' >> /etc/apt/sources.list 

#Paketlisten auf neuesten Stand bringen
apt update

#Installation einiger wichtiger Pakete und des Kernels
#Einige der genannten Pakete sollten schon durch den Bootstrap im System sein, wie dbus und systemd
apt install postfix locales grub2 mdadm udev ssh host isc-dhcp-client pciutils vim molly-guard locate systemd dbus keyboard-configuration linux-image-amd64 firmware-linux firmware-linux-nonfree memtest86 net-tools man -y

#Hostname und Mailname einstellen
#Reverse-DNS vorher bei Strato festlegen und TTL abwarten
#Dieser Befehl klappt nur für Hostnames mit diesem Schema: server.domain.tld
host `ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -f1 -d/`|  awk '{print $5}' | cut -d. -f1,2,3

#Stimmt der Hostname? Dann legen wir diesen als hostname und mailname fest
host `ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -f1 -d/`|  awk '{print $5}' | cut -d. -f1,2,3 > /etc/hostname
host `ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -f1 -d/`|  awk '{print $5}' | cut -d. -f1,2,3 > /etc/mailname

#Aktivieren von DHCP für eth0
#Achtung, das Netzwerkinterface heisst moeglicherweise nicht eth0
echo "auto lo" > /etc/network/interfaces
echo "iface lo inet loopback" >> /etc/network/interfaces
echo "auto eth0" >> /etc/network/interfaces
echo "iface eth0 inet dhcp" >> /etc/network/interfaces

#Bootloader für deutsches Keyboard und serielle Konsole einrichten
sed -i  's|GRUB_CMDLINE_LINUX_DEFAULT="quiet"|GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,57600"|' /etc/default/grub
sed -i  's|#GRUB_TERMINAL=console|GRUB_TERMINAL=serial|' /etc/default/grub
sed -i  's|GRUB_TIMEOUT=5|GRUB_TIMEOUT=30|' /etc/default/grub
sed -i  's|GRUB_CMDLINE_LINUX=""|GRUB_CMDLINE_LINUX="vconsole.keymap=de-latin1"|' /etc/default/grub
echo 'GRUB_SERIAL_COMMAND="serial --speed=57600 --unit=0 --word=8 --parity=no --stop=1"' >> /etc/default/grub

#Neue Grub-Konfiguration erzeugen lassen
grub-mkconfig
update-grub
grub-install /dev/sda
grub-install /dev/sdb

#SSHD Login per Passwort erlauben
sed -i 's|#PermitRootLogin prohibit-password|PermitRootLogin yes|g' /etc/ssh/sshd_config

#Ausloggen und Rebooten
exit
reboot -n