Vielleicht interessiert Sie auch der Beitrag zur Nachfolger-Version von Debian8: Debian9 Stretch per Bootstrap auf einem Root-Server installieren.

Rootserver kann man mieten und einfach benutzen.

Manchmal hat man aber bestimmte Anforderungen, die die Grundinstallation des Anbieters nicht erfüllt, oder man möchte genau wissen und festlegen, was wirklich auf dem Server "läuft".

Dieses Tutorial erklärt ausführlich, wie man einen Root-Server (in diesem Beispiel von Strato) per Rescue-System nach eigenen Vorgaben installiert.

Die Anleitung ist zum Großteil auch bei anderen Anbietern, wie 1und1 oder Hetzner nutzbar, beispielsweise muss man bei Hetzner die Schritte zur Konfiguration/Bekanntmachung der seriellen Konsole nicht durchführen. Ebenso sollte man beachten, dass bei Verwendung einer anderen Festplatten-Konstellation oder eines Hardware-Raid-Controllers die Partitionierung völlig anders durchgeführt werden muss. Bei Hetzner und 1und1 habe ich den letzten Jahren diverse Rechner erfolgreich per Bootstrap installiert.

Die Installation erfolgt über das "Strato-Rescue-System", es handelt sich hierbei um ein per Netzwerk bootendes Linux.
Dieses wird im Strato-Webinterface unter "Recovery-Manager" aktiviert.

Strato Recovery Manager

Anschließend wird der Server ins Rescue-System gebootet und mit dem oben gezeigten Passwort ist der Login per serieller Konsole oder SSH möglich.

Im Rescue installieren wir das Paket parted und schreiben leere GPT-Partitionstabellen auf sda und sdb.

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

#Leeres GPT-Partitions-Schema auf beiden Platten anlegen
parted -s /dev/sda mklabel gpt
parted -s /dev/sdb mklabel gpt

Durch das Anlegen der leeren Partitionstabellen werden zuvor vorhandene Raid-Arrays nicht automatisch beenden, daher führen wir einen Reboot durch, damit der Kernel die neuen Verhältnisse auf den Platten berücksichtigt.

#Neustart des Servers
reboot -n

Wir installieren wieder "parted" und bei dieser Gelegenheit auch gleich "debootstrap".

#Paketlisten auf neuesten Stand bringen
apt-get update

#Pakete "parted" und "debootstrap" installieren
apt-get install parted debootstrap -y

Nun prüfen wir, on die leeren Partitionstabellen vorhanden sind und schreiben anschließend die Partitionen auf die Platten.

#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 17G
parted -s /dev/sda mkpart primary 17G  80G
parted -s /dev/sda mkpart primary 80G 620G
parted -s /dev/sda mkpart primary 620G 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 1 100M
parted -s /dev/sdb mkpart primary 100M 17G
parted -s /dev/sdb mkpart primary 17G  80G
parted -s /dev/sdb mkpart primary 80G 620G
parted -s /dev/sdb mkpart primary 620G 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 

Der nächste Schritt ist das Anlegen der Raid-Arrays und der Filesysteme:

#Anlegen der Software-Raid-Spiegelungen
mdadm --create /dev/md2 --level=mirror --raid-devices=2 /dev/sda2 /dev/sdb2 --metadata 1.2
mdadm --create /dev/md3 --level=mirror --raid-devices=2 /dev/sda3 /dev/sdb3 --metadata 1.2
mdadm --create /dev/md4 --level=mirror --raid-devices=2 /dev/sda4 /dev/sdb4 --metadata 1.2
mdadm --create /dev/md5 --level=mirror --raid-devices=2 /dev/sda5 /dev/sdb5 --metadata 1.2
                
#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

Nun mounten wir die neu erzeugten Filesysteme auf den Arrays in den Ordner /mnt und zu erzeugende Unterordner

#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/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

Wir benutzen den Befehl "blkid" um die UUIDs der Partitionen zu ermitteln, diese UUIDs tragen wir im folgenden Code-Block ein und erzeugen damit die /etc/fstab.

#Ermitteln der Block-IDs der Raid-Arrays
blkid | grep md

#Anlegen der Datei "/etc/fstab" (hier unter /mnt) unter Verwendung der passenden Block-IDs
echo 'proc /proc proc defaults 0 0' >  /mnt/etc/fstab
echo 'UUID="d1326159-21b4-4bf9-9ad8-76ae44706099" none swap defaults,pri=1 0 0 #md2' >>  /mnt/etc/fstab #md2
echo 'UUID="03495ea4-ff80-4bfd-ac00-67ced76d7bf0" / ext4 defaults,errors=remount-ro 0 1 #md3' >>  /mnt/etc/fstab #md3
echo 'UUID="5f3e78ff-6bb9-443a-99ca-6f03af1bba0f" /var ext4 defaults,usrquota  0 2 #md4' >>  /mnt/etc/fstab #md4
echo 'UUID="a92f9883-42e2-4ce1-9447-3b8c89d16372" /backuppartition ext4 defaults  0 2 #md5 ' >>  /mnt/etc/fstab #md5 

Nun starten wir den Bootstrap in den Ordner /mnt

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

Nachdem debootstrap fertig ist, führen wir den chroot ins neue System durch. Gleich danach legen wir ein Root-Passwort fest.

#Chroot ins neu installierte Debian8
#/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

Um im neuen System Pakete installieren zu können, müssen wir apt mitteilen, woher er seine Pakete beziehen soll. Dazu befüllen wir die Datei /etc/apt/sources.lst. Wir binden auch das "jessie-backports"-Repository ein.

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

#Paketlisten auf neuesten Stand bringen
apt-get update

Zum Zeitpunkt der Erstellung dieses Blog-Beitrags erzeugte "iucode-tool" einen Fehler bei der Kernel-Installation. Die Version aus den "jessie-backports" hatte dieses Problem nicht, daher installieren wir dieses Paket gezielt aus dem "jessie-backports"-Repository.

#Zum Zeitpunkt der Erstellung des Videos brachte "iucode-tool" einen Fehler bei der Kernel-Installation
#Die Version aus dem Repository "jessie-backports" war dagegen fehlerfrei, daher installieren wir das Paket vorab auf diesem Weg
apt-get install -t jessie-backports iucode-tool -y

Nun folgt die Installation des Kernels, Bootloaders und einiger anderer benötigter Pakete. Der Bootloader soll während dieses Prozesses auf /dev/sda und /dev/sdb installiert werden, dies wird während der Konfiguration abgefragt.

#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  -y

Die folgende Zeile zum Bekanntmachen der seriellen Konsole ist nur dann in die Datei /etc/inittab ein zu fügen, wenn statt systemd sysinit verwendet wird

#Nicht für systemd, aver für sysinit: Bekanntmachen der seriellen Konsole 
echo "T0:23:respawn:/sbin/getty -L ttyS0 57600 vt100" >> /etc/inittab

Nun befüllen wir Die Dateien für /etc/hostname und /etc/mailname. Die Befehle ermitteln den Namen per DNS, man kann den Namen auch manuell in die Dateien eintragen.

#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

Nun legen wie die Netzwerkkonfiguration fest.

#Netzwerk-Konfiguration
#Ändern der Reihenfolge der Netzwerkkarten. Udev legt die Reihenfolge so fest, dass eth1 aktiv ist.
#Ich benenne die Netzwerkkarten so um, dass das im Rescue-System als eth0 benannte Interface auch im späteren System eth0 heisst

#Löschen der Datei, in der udev die Netzwerk-Interfaces konfiguriert, diese sollte eh nicht vorhanden sein.
rm /etc/udev/rules.d/70-persistent-net.rules

#Erzeugen eines Benamungseintrags für eth0
export INTERFACE=eth0
export MATCHADDR=`ip addr show $INTERFACE | grep ether | awk '{print $2}'`
/lib/udev/write_net_rules

#Prüfen ob der Eintrag mit eth0 eingetragen wurde
cat /etc/udev/rules.d/70-persistent-net.rules

#Aktivieren von DHCP für eth0
#Unter Debian8 wird trotz systemd nach wie vor die Datei
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

Und konfigurieren den Bootloader für die Verwendung der seriellen Konsole.

#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_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

Fertig mit dem Bootstrap!

Nun können wir ins neue System booten, folgende Schritte sind nötig:

  • Bei Strato die Boot-Reihenfolge umstellen (danach 3 Minuten warten)
  • Serielle Konsole öffnen um Boot zu beobachten
  • Aus chroot-Umgebung ausloggen
#Aus chroot-Umgebung ausloggen
exit

#ins neue System booten
reboot -n

Nun noch ein paar Nacharbeiten, unter anderem Einstellen der Sprache, Einrichten der Zeitsynchronisation.

#Prüfen ob der Eintrag mit eth1 eingetragen wurde
cat /etc/udev/rules.d/70-persistent-net.rules

#System auf deutsche Sprache einstellen, auch englische locale erzeugen.
#Ich persönlich arbeite lieber mit der englischen Version
sed -i 's|# de_DE.UTF-8 UTF-8|de_DE.UTF-8 UTF-8|' /etc/locale.gen
sed -i 's|# en_US.UTF-8 UTF-8|en_US.UTF-8 UTF-8|' /etc/locale.gen
locale-gen
localectl set-locale LANG="de_DE.UTF-8"

#Ergebnis prüfen
localectl status

#Zeitzone setzen
timedatectl set-timezone Europe/Berlin

#Ergebnis prüfen
timedatectl status

#Zeitsynchronisierung in systemd einschalten

#Aktivieren der Zeit-Server (sind auskommentiert)
sed -i "s|#Servers=|Servers=|"  /etc/systemd/timesyncd.conf
systemctl enable systemd-timesyncd
systemctl start  systemd-timesyncd

#Synchronisierungsstatus der Raid-Arrays prüfen
cat /proc/mdstat

Ausloggen an der seriellen Konsole nicht vergessen!