Wenn man sich beispielsweise 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 Stretch 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.

#Paketlisten auf neuesten Stand bringen
#Paket "parted" installieren
apt-get update && apt-get install parted -y

#Leeres GPT-Partitions-Schema auf beiden Platten anlegen
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
#Pakete installieren
apt-get update && apt-get install parted debootstrap host -y

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

#Anlegen der Partitionen auf /dev/sda
parted -s /dev/sda mklabel gpt
parted -s /dev/sda mkpart primary 1 100M
parted -s /dev/sda mkpart primary 100M 33G
parted -s /dev/sda mkpart primary 33G  184G
parted -s /dev/sda mkpart primary 184G 1584G
parted -s /dev/sda mkpart primary 1584G 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 der Partitionen auf /dev/sdb
parted -s /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart primary 1M 100M
parted -s /dev/sdb mkpart primary 100M 33G
parted -s /dev/sdb mkpart primary 33G  184G
parted -s /dev/sdb mkpart primary 184G 1584G
parted -s /dev/sdb mkpart primary 1584G 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

#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 stretch /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 stretch main contrib non-free' > /etc/apt/sources.list
echo 'deb-src http://httpredir.debian.org/debian stretch main contrib non-free' >> /etc/apt/sources.list
echo 'deb http://httpredir.debian.org/debian stretch-updates main contrib non-free' >> /etc/apt/sources.list
echo 'deb-src http://httpredir.debian.org/debian stretch-updates main contrib non-free' >> /etc/apt/sources.list
echo 'deb http://security.debian.org/ stretch/updates main contrib non-free' >> /etc/apt/sources.list
echo 'deb-src http://security.debian.org/ stretch/updates main contrib non-free' >> /etc/apt/sources.list
echo 'deb http://httpredir.debian.org/debian  stretch-backports main contrib non-free' >> /etc/apt/sources.list

#Paketlisten auf neuesten Stand bringen
apt-get 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-get install 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

#Unterstützung der serielle Konsole einschalten
#systemctl enable getty@ttyS0.service

#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
#Unter Debian9 wird trotz systemd nach wie vor die Datei
echo "auto lo" > /etc/network/interfaces
echo "iface lo inet loopback" >> /etc/network/interfaces
echo "auto eno1" >> /etc/network/interfaces
echo "iface eno1 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=60|' /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

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


#Ausloggen und Rebooten
exit
reboot -n