Autor: | B.Sc. Inf. Dominik Schulz <lkml@ds.gauner.org> |
---|---|
Version: | 0.2.495 |
Date: | 2008-07-15 |
Copyright: | This document is released under the terms of the GNU Free Documentation License. |
Status: | Released |
Abstract: | Dieses Dokument beschreibt die Einrichtung eines Rootservers mit Software-RAID unter Debian GNU/Linux etch. |
Dieses Tutorial soll die Einrichtung eines Rootservers mit Debian GNU/Linux auf einem Software RAID erläutern. Als Grundlage dient hierzu ein aktuelles Rootserver Modell von Hetzner. Alle anderen großen Anbieter von Rootservern sollten aber ähnliche Produkte im Angebot haben. Wichtig ist, dass Sie Zugang zu einem sog. Rescue-System haben und der Server über zwei identische Festplatten verfügt. Ob der Anbieter des Rootservers hingeben Debian oder Zusatzfunktionen wie eine serielle Konsole, o.ä. im Angebot hat spielt für dieses Tutorial keine Rolle. Zur Vereinfachung verzichte ich darauf auch das Root-Dateisystem / auf dem Software-RAID abzulegen, da an dieser Stelle der Schutz vor dem Verlust der Daten wichtiger sein soll als maximale Uptime. Ich gehe davon aus, dass im Falle eines Festplattenschadens, eine kurze Downtime des Rechners unumgänglich ist. Durch das Software-RAID soll dann allerdings ein Datenverlust verhindert werden. Bei der Nutzung des des Servers gehe ich davon aus, dass Sie einen Web- sowie einen Mailserver betreiben wollen. Natürlich kann er auch anderweitig genutzt werden, aber z.B. für einen Gameserver macht ein Software-RAID eher weniger Sinn.
Nachdem Sie sich auf Ihrem neuen Rootserver eingeloggt haben sollten Sie zunächst ein Backup des Verzeichnisses /etc erstellen. Hier liegen wichtigen Informationen zur Netzwerkonfiguration und andere Angaben die Sie später möglicherweise noch benötigen werden.
Die Partitionierung der Festplatten sollte von vorneherein gut überlegt sein, da sich Änderungen später kaum noch vornehmen lassen. Ich bevorzuge seperate Partitionen für teilweise schnell wachsende Verzeichnisse wie z.B. /var/log um eine Überfüllung der Festplatte zu vermeiden. Die eigentlichen Nutzdaten liegen bevorzugt unter /srv. Das entspricht zwar nicht dem FHS, aber es ist Ihre Entscheidung. Sie können die Angaben in diesem Tutorial auch leicht abwandeln und dann z.B. die Mails unter /var/mail anstatt unter /srv/mail ablegen. Die Backups werden unter /backup abgelegt. Sofern ich einen MySQL oder PostgreSQL Server einsetze, lege ich für die entsprechenden Datenbanken ebenfalls eine eigene Partition an. Bei MySQL z.B. /var/lib/mysql. Die hier vorgeschlagenen Werte beruhen auf eine Festplatte mit 400GB Nennkapazität. Passen Sie /srv und /backup bei anderen Kapazitätsgrößen entsprechend an.
Ein Vorschlag zur Partitionierung:
Mount Punkt | Größe | Dateisystem | RAID | Gerät |
---|---|---|---|---|
/boot | 128MB | ext2 | sda1/sdb1 | |
/ | 30GB | ext3 | sda2/sdb2 | |
/tmp | 8GB | ext2 | 0 (md0) | sda5/sdb5 |
/var/log | 10GB | ext3 | 1 (md1) | sda6/sdb6 |
/var/lib/mysql | 25GB | ext3 | 1 (md2) | sda7/sdb7 |
/srv | 150GB | ext3 | 1 (md3) | sda8/sdb8 |
/backup | 150GB | ext3 | 1 (md4) | sda9/sdb9 |
swap | 2GB | swap | sda10/sdb10 |
Nachdem Sie sich über die gewünschte Partitionierung klar geworden sind können Sie Ihren Server in das Rescue-System starten. Diese muss bei den meisten Providern über eine Verwaltungsinterface aktiviert und der Rootserver danach mittels reboot neu gestartet werden.
Warnung
Nach dem partitionieren der Festplatten sind alle Daten die sich vorher auf der Festplatte befunden haben verloren. Denken Sie daran alles Wichtige vorher zu sichern!
cfdisk:
cfdisk 2.12r Disk Drive: /dev/sda Size: 500107862016 bytes, 500.1 GB Heads: 255 Sectors per Track: 63 Cylinders: 60801 Name Flags Part Type FS Type [Label] Size (MB) ------------------------------------------------------------------------------ sda1 Boot Primary Linux 131.61 sda2 Primary Linux 30721.43 sda5 Logical Linux raid autodetect 8192.38 sda6 Logical Linux raid autodetect 10240.48 sda7 Logical Linux raid autodetect 25597.08 sda8 Logical Linux raid autodetect 211587.11 sda9 Logical Linux raid autodetect 211587.11 sda10 Logical Linux swap / Solaris 2048.10 [Bootable] [ Delete ] [ Help ] [Maximize] [ Print ] [ Quit ] [ Type ] [ Units ] [ Write ] Toggle bootable flag of the current partition
Nachdem Sie sich am Rescue-System angemeldet haben werden die Festplatten partitioniert. Dafür existieren verschiedene Programme. Ich bevorzuge cfdisk. Rufen Sie es auf und löschen Sie alle vorhandenen Partitionen. Danach können die neuen Partitionen über den Menüpunkt "New" angelegt werden. Erstellen Sie die Partitionen einfach in der Reihenfolge wie sie in der Tabelle angegeben sind. Zunächst auf Festplatte sda (bzw. hda) und danach auf sdb. Beachte Sie dabei, dass alle Partitionen über die ein Software-RAID erstellt wird - also 5-9 - die identische Größe haben sollten, da es sonst zu Problemen kommen kann. Die Partitionen sda1/sdb1 müssen das Boot-Flag erhalten sowie den Typ 83, der gleiche Typ muss für sda2/sdb2 vergeben werden. Die Swap-Partitionen benötigen den Typ 82. Die restliche Partitionen sind für das Software-RAID und brauchen den Typ FD.
Nachdem die Festplatten partitioniert sind, dürfen Sie nicht vergessen das neuen Partitionierungsschema auf die Platte zu schreiben. Dann können die neuen nicht-RAID Partitionen auch sofort formatiert werden. Die /boot Partition mit ext2 ...
mkfs.ext2 /dev/sda1 mkfs.ext2 /dev/sdb1
... und die neue Root-Partition mit ext3.
mkfs.ext3 /dev/sda2 mkfs.ext3 /dev/sdb2
Ausgabe von mkfs.ext3:
mke2fs 1.40-WIP (14-Nov-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 3751936 inodes, 7500346 blocks 375017 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=4294967296 229 block groups 32768 blocks per group, 32768 fragments per group 16384 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 37 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
Die Swap-Partitionen formatieren und aktivieren.
mkswap /dev/sda10 mkswap /dev/sdb10 sync; sync; sync swapon /dev/sda10 swapon /dev/sdb10
Ausgabe von mkswap:
Setting up swapspace version 1, size = 2048057 kB no label, UUID=6a816a01-6a72-4410-bedf-73864d4b0124
Ein Verzeichnis zum einbinden der neu formatierten Laufwerke erstellen ...
mkdir /mnt/newroot
... den neuen Root / einbinden ...
mount -t ext3 /dev/sda2 /mnt/newroot
... darunter ein Verzeichnis für die Boot-Partition erstellen ...
mkdir /mnt/newroot/boot
... und diese ebenfalls einbinden.
mount -t ext2 /dev/sda1 /mnt/newroot/boot
Falls die Special-Devices md1-md4 nicht vorhanden sind müssen sie von Hand angelegt werden:
mknod /dev/md1 b 9 2 mknod /dev/md2 b 9 3 mknod /dev/md3 b 9 4 mknod /dev/md4 b 9 5
Dann können die Software-RAID Verbünde erstellt werden. Dazu dient das Werkzeug mdadm. Zunächst die Partition /tmp im RAID-Level 0 da hier keinerlei Ausfallsicherheit relevant ist.
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sd[ab]5
Bei den anderen Partitionen kommt es hingegen sehr wohl auf die Ausfallsicherheit an. Deshalb ist hier RAID-Level 1 das Mittel der Wahl. Level 1 bedeutet, dass die Daten auf alle beteiligten Partitionen gespiegelt werden. Wer über einen Rootserver mit mehr als 2 Platten verfügt - was bei Mietservern die absolute Ausnahme sein dürfte - kann natürlich anstelle von Level 1 auch gerne Level 5 verwenden, was eine bessere Speicherplatzausnutzung bei ähnlicher Zuverlässigkeit bietet.
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sd[ab]6 mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/sd[ab]7 mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sd[ab]8 mdadm --create /dev/md4 --level=1 --raid-devices=2 /dev/sd[ab]9
Danach sollte man unbedingt warten bis die RAID Verbünde synchronisiert sind. Dies kann man über die Datei /proc/mdstat verfolgen.
watch cat /proc/mdstat
Ausgabe von cat /proc/mdstat während der Rekonstruktion:
Personalities : [raid1] [raid0] md4 : active raid1 sdb9[1] sda9[0] 206627904 blocks [2/2] [UU] resync=DELAYED md3 : active raid1 sdb8[1] sda8[0] 206627904 blocks [2/2] [UU] resync=DELAYED md2 : active raid1 sdb7[1] sda7[0] 24996992 blocks [2/2] [UU] resync=DELAYED md1 : active raid1 sdb6[1] sda6[0] 10000320 blocks [2/2] [UU] [==========>..........] resync = 52.2% (5228544/10000320) finish=0.9min speed=81228K/sec md0 : active raid0 sdb5[1] sda5[0] 16000512 blocks 64k chunks unused devices: <none>
Ausgabe von cat /proc/mdstat nach der Rekonstruktion:
Personalities : [raid1] [raid0] md4 : active raid1 sdb9[1] sda9[0] 206627904 blocks [2/2] [UU] md3 : active raid1 sdb8[1] sda8[0] 206627904 blocks [2/2] [UU] md2 : active raid1 sdb7[1] sda7[0] 24996992 blocks [2/2] [UU] md1 : active raid1 sdb6[1] sda6[0] 10000320 blocks [2/2] [UU] md0 : active raid0 sdb5[1] sda5[0] 16000512 blocks 64k chunks unused devices: <none>
Sobald die Synchronisierung abgeschlossen ist können auch die RAID Partitionen formatiert und gemountet werden. Die Partition /tmp mit dem schnelleren ext2.
mkfs.ext2 /dev/md0
Die weiteren Partitionen werden mit dem sehr zuverlässigen ext3 formatiert. Auch hier besteht natürlich Möglichkeit anstelle von ext3 ein anderes Dateisystem wie z.B. ReiserFS, XFS oder JFS zu verwenden. Ich bevorzuge auf einem Rootserver allerdings deutlich ext3.
mkfs.ext3 /dev/md1 mkfs.ext3 /dev/md2 mkfs.ext3 /dev/md3 mkfs.ext3 /dev/md4
Jetzt können auch die RAID-Partitionen eingebunden werden. Zuerst müssen natürlich die Mount-Points, also die entsprechenden Verzeichnisse, angelegt werden.
mkdir -p /mnt/newroot/var/log mkdir -p /mnt/newroot/var/lib/mysql mkdir /mnt/newroot/srv mkdir /mnt/newroot/backup mkdir /mnt/newroot/tmp
Danach können die Partitionen mit mount eingebunden werden.
mount -t ext2 /dev/md0 /mnt/newroot/tmp mount -t ext3 /dev/md1 /mnt/newroot/var/log mount -t ext3 /dev/md2 /mnt/newroot/var/lib/mysql mount -t ext3 /dev/md3 /mnt/newroot/srv mount -t ext3 /dev/md4 /mnt/newroot/backup
Nochmal kontrollieren ob alle Dateisysteme eingebunden wurden:
root@rescue ~ # mount rootfs on / type rootfs (rw) tmpfs on /dev type tmpfs (rw,size=10M,mode=0755) /dev/sda2 on /mnt/newroot type ext3 (rw) /dev/sda1 on /mnt/newroot/boot type ext2 (rw) /dev/md1 on /mnt/newroot/var/log type ext3 (rw) /dev/md2 on /mnt/newroot/var/lib/mysql type ext3 (rw) /dev/md3 on /mnt/newroot/srv type ext3 (rw) /dev/md4 on /mnt/newroot/backup type ext3 (rw) /dev/md0 on /mnt/newroot/tmp type ext2 (rw)
Bei debootstrap handelt es sich um ein sehr nützliches Werkzeug, das es erlaubt eine Debian System aus einem anderen, laufenden, System heraus zu installieren. Zwar ist es nicht ganz so komfortabel wie der Debian Installer, aber es erledigt alle grundlegenden Schritte. Auf den meisten Rescue-Systemen dürfte debootstrap bereits installiert sein. Ansonsten kann man es auch von Hand nachinstallieren.
cd /tmp wget http://ftp.debian.org/debian/pool/main/d/debootstrap/debootstrap_0.3.3.2_all.deb ar -x debootstrap_0.3.3.2_all.deb cd / zcat /tmp/data.tar.gz | tar xv
Weitere Informationen zur Installation von debootstrap gibt es in den, sehr lesenwerten, Release Notes zu Debian.
Nachdem es installiert wurde wird das Programm mit der richtigen Architektur (z.B. i386 oder AMD64) und Release aufgerufen:
debootstrap --arch amd64 etch /mnt/newroot http://ftp.de.debian.org/debian
Es wird eine Weile benötigen um das Debian-Grundsystem zu installieren. Wenn es seine Arbeit beendet hat wechselt man mit chroot in das neue System, stellt ggf. das Terminal korrekt ein und passt die Datei /etc/fstab an. Diese Datei enhällt die Informationen über die verfügbaren Dateisysteme und sorgt dafür, dass diese beim Startvorgang das Systems über den Befehl mount -a automatisch eingebunden werden.
LANG=C chroot /mnt/newroot /bin/bash export TERM=xterm-color vim /etc/fstab
Anstelle von vim können Sie natürlich einen anderen Editor Ihrer Wahl verwenden, z.B. emacs oder pico.
Der Inhalt von /etc/fstab ist hier exemplarisch aufgeführt. Sie müssen ihn ggf. für Ihr System anpassen.
# file system mount point type options dump pass /dev/sda2 / ext3 defaults 0 1 /dev/sda1 /boot ext2 ro,nosuid,nodev 0 2 /dev/sda10 none swap sw 0 0 /dev/sdb10 none swap sw 0 0 proc /proc proc defaults 0 0 /dev/md0 /tmp ext2 rw,nosuid,nodev,noexec 0 2 /dev/md1 /var/log ext3 rw,nosuid,nodev,noexec 0 2 /dev/md2 /var/lib/mysql ext3 rw,nosuid,nodev,noexec 0 2 /dev/md3 /srv ext3 rw,nosuid,nodev,noexec 0 2 /dev/md4 /backup ext3 rw,nosuid,nodev,noexec 0 2
Das proc Dateisystem einbinden:
mount -t proc proc /proc
In der der List der Paketquellen unter /etc/apt/sources.list sollte die Paketquelle eingetragen sein die auch von debootstrap benutzt wurde. Öffnen Sie die Datei in einem Editor und fügen Sie weitere Paketquellen hinzu. Mindestens die Adresse für Sicherheitsupdates.
rescue:/# cat /etc/apt/sources.list deb http://ftp.de.debian.org/debian etch main deb http://security.debian.org/ etch/updates main contrib non-free
Bringen Sie die Paketliste auf den neusten Stand und installieren Sie auch im neuen System mdadm.
aptitude update aptitude dist-upgrade aptitude install mdadm
Rufen Sie tzconfig auf um die Zeitzone einzustellen. Am besten installieren Sie mit apitude install ntpdate auch noch gleich das Paket ntpdate das die Serveruhr mit der Referenzzeit abgleicht.
Nach der Grundinstallation müssen die Netzwerkschnittstellen konfiguriert werden. Dies erfolgt unter Debian in der Datei /etc/network/interfaces. Öffnen Sie diese Datei und tragen Sie dort die Informationen ein die Sie sich vor dem Reboot gesichert haben. Wichtig ist auf keinen Fall die Konfiguration des localhost Interfaces zu vergessen.
Warnung
Netzwerkeinstellungen
Die hier gezeigten Einstellungen sind nur ein Beispiel und werden so bei Ihnen nicht funktionieren. Sie müssen in jedem Fall die Adressen für Ihr Netzwerk anpassen!
Die Datei /etc/network/interfaces
rescue:/# cat /etc/network/interfaces # Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or # /usr/share/doc/ifupdown/examples for more information. # Loopback device: auto lo iface lo inet loopback # device: eth0 auto eth0 iface eth0 inet static address 88.77.66.55 broadcast 88.77.66.54 netmask 255.255.255.224 gateway 88.77.66.53 # default route to access subnet up route add -net 88.77.66.52 netmask 255.255.255.224 gw 88.77.66.53 eth0
Dann muss noch die DNS Konfiguration in /etc/resolv.conf eingestellt und die Datei /etc/hosts angelegt werden.
Die Datei /etc/resolv.conf:
nameserver 111.222.33.1 nameserver 111.222.33.2 nameserver 111.222.33.3
Die Datei /etc/hosts:
# nameserver config # IPv4 127.0.0.1 localhost 88.77.66.55 hostname.domain.tld hostname # # IPv6 ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
Dannach muss noch der Hostname gesetzt werden.
hostname <hostname> echo <hostname> > /etc/hostname
Installieren Sie noch einen passenden Kernel. Die Kernel Pakete heißen unter Debian linux-image. Wenn Sie ein AMD64 System installiert haben brauchen Sie einen Kernel für amd64.
aptitude install linux-image-2.6-amd64
aptitude install grub grub-install /dev/sda update-grub
An dieser Stelle ist es bei mir wiederholt zur Fehlermeldung /dev/sda: Not found or not a block device gekommen. Wenn dieses Problem auftritt muss man die chroot-Umgebung mit exit verlassen und im Rescue-System den folgenden Befehl ausführen um Grub von dort zu installieren:
grub-install --recheck --no-floppy --root-directory=/mnt/newroot /dev/sda
Grub Fehlermeldung:
rescue:/# grub-install /dev/sda Probing devices to guess BIOS drives. This may take a long time. /dev/sda: Not found or not a block device. rescue:/# exit
Installation ausserhalb des Rescue-Systems:
root@rescue ~ # grub-install --recheck --no-floppy --root-directory=/mnt/newroot /dev/sda Probing devices to guess BIOS drives. This may take a long time. Due to a bug in xfs_freeze, the following command might produce a segmentation fault when /mnt/newroot/boot/grub is not in an XFS filesystem. This error is harmless and can be ignored. xfs_freeze: specified file ["/mnt/newroot/boot/grub"] is not on an XFS filesystem Installation finished. No error reported. This is the contents of the device map /mnt/newroot/boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (hd0) /dev/sda (hd1) /dev/sdb
Sofern man die chroot Umgebung für die Installation von Grub verlassen hat, so sollte man nicht vergessen update-grub auszuführen nachdem man die chroot-Umgebung wieder betreten hat.
Nachdem diese Installation abgeschlossen ist wechselt man wieder in die chroot Umgebung.
LANG=C chroot /mnt/newroot /bin/bash
Vor dem Neustart muss man unbedingt noch ein root-Passwort vergeben. Dazu ist es wichtig, dass man sich sicher in der chroot Umgebung befindet.
passwd
Damit man sich auch über das Netz einloggen kann muss noch der SSH-Server installiert werden.
aptitude install openssh-server
Um in das frisch installierte System zu wechseln verlässt man den chroot und veranlasst mit reboot einen Neustart. Vorher sollte man sichergehen, dass das Rescue-System im Verwaltungsmenü des Providers deaktiviert ist.
Der Neustart des Systems sollte sehr schnell gehen, kann aber unter Umständen auch mal 20 Minuten in Ansruch nehmen. Soviel Zeit sollte man dem System jedenfalls geben bevor man einen Reset auslöst und wieder in das Rescue-System wechselt um auf Fehlersuche zu gehen.
Wenn alles geklappt hat meldet man sich als root am System an und sichert das System erstmal ein wenig ab. Es empfielt sich root-Logins in der Datei /etc/sshd_config abzuschalten und die Benutzung von su auf Mitglieder bestimmer Gruppen einzuschränken.
Zunächst wird dazu ein neuer, administrativer, Benutzer angelegt.
hostname:~# adduser admin Lege Benutzer »admin« an ... Lege neue Gruppe »admin« (1000) an ... Lege neuen Benutzer »admin« (1000) mit Gruppe »admin« an ... Erstelle Home-Verzeichnis »/home/admin« ... Kopiere Dateien aus »/etc/skel« ... Enter new UNIX password: Retype new UNIX password: passwd: Kennwort erfolgreich geändert Ändere Benutzerinformationen für admin Geben Sie einen neuen Wert an oder ENTER für den Standardwert Name []: Raumnummer []: Telefon geschäftlich []: Telefon privat []: Sonstiges []: Sind die Informationen korrekt? [j/N] j
Dieser sollte dann zu allen relevanten Gruppe hinzugefügt werden.
hostname:~# addgroup wheel Lege Gruppe »wheel« (GID 1001) an ... Fertig. hostname:~# usermod -G admin,adm,www-data,staff,wheel admin
Danach wird die Datei /etc/pam.d/su angepasst. Diese Datei kontrolliert wer su wie benutzen darf. Dabei wird die folgende Zeile ausgetauscht.
# auth required pam_wheel.so
Die neue Zeile lautet:
auth required pam_wheel.so group=wheel
Damit ist es nur noch Mitgliedern der Gruppe wheel möglich mit su root zu werden. Jetzt müssen noch root Logins über ssh abgeschaltet werden. Dazu wird die Datei /etc/ssh/sshd_config geöffnet und PermitRootLogin auf no gesetzt.
PermitRootLogin no
Nun sollten auch noch die Regionaleinstellungen vorgenommen werden.
aptitude install locales dpkg-reconfigure locales
Nach dem Aufruf von dpkg-reconfigure locales werden die zu generierenden Regionaleinstellungen abgefragt. Wählen Sie am besten das Ihrere Landessprache entsprechende, also z.B. de_DE.UTF-8, aus.
Danach kann man mit der eigentlichen Softwareinstallation beginnen. Ein paar Programme die ich meist zuerst installiere sind munin zur Serverüberwachung, dirvish zur Datensicherung und htop als moderner Ersatz für top.
aptitude install munin munin-node dirvish htop vim nload
Wer mit meinem Tutorial gar nicht glücklich wird, dem helfen vielleicht die folgenden Links weiter.
Sie können dieses Formular nutzen um mir schnell und unkompliziert eine Nachricht zukommen zu lassen. Wenn Sie eine Antwort erwarten, dann denken Sie bitte daran eine Kontaktmöglichkeit anzugeben.