Hetzner - DokuWiki

OpenBSD

Puffy45.gif

Only two remote holes in the default install, in a heck of a long time!

The OpenBSD project produces a FREE, multi-platform 4.4BSD-based UNIX-like operating system. Our efforts emphasize portability, standardization, correctness, proactive security and integrated cryptography. OpenBSD supports binary emulation of most programs from SVR4 (Solaris), FreeBSD, Linux, BSD/OS, SunOS and HP-UX.

Inhaltsverzeichnis

OpenBSD bei Hetzner mit RAID 1 installieren

In diesem Artikel wird OpenBSD auf einem EQ4 Server von Hetzner installiert mit RAID1-Unterstützung, ohne GB-große Festplattenabbilder hochladen zu müssen oder die LARA dauerhaft zu quälen.

Der Artikel richtet sich generell an jeden der Interesse hat. Prinzipiell sollte man eine gewisse Grunderfahrung mit einem Betriebssystem haben, welches man in das düstere Meer des Internets wirft. Die hier geschilderte Vorgehensweise ist sicherlich kein Patentrezept und Ideallösung, daher lohnt es sich immer die genialen OpenBSD manpages zu Rate zu ziehen oder zu grundsätzlichen Fragen das OpenBSD FAQ zu nutzen.

Ich rate dazu, sich das Howto erst komplett durchzulesen und zu verstehen. Das Hetzner Rescue-System ist nicht in der Lage auf das OpenBSD Dateisystem im nachhinein zuzugreifen daher geht es immer nur mit Umwegen.

Um das RAID zu bilden, benutze ich hier raid(4). Mittlerweile gibt es softraid direkt im Kernel, jedoch ist es noch nicht ganz ausgereift. Wer möchte, kann die meisten Schritte aber ähnlich mit softraid(4) nachbilden. (ccd(4) lass ich mal ganz außen vor.)

Ich übernehme keine Garantie oder Haftung für die hier aufgeführten Anweisungen.

Vorbereitung

Wenn der neue Hetzner Server bereitgestellt wurde, gilt es herauszufinden, ob OpenBSD überhaupt mit der verwendeten Hardware laufen wird. Dazu kann man die Hardware mit der offiziell unterstützten Hardware von OpenBSD vergleichen. In der Regel sollte es dabei kein Problem geben. Wichtig ist natürlich vor allem die Netzwerkkarte. In meinem EQ4 ist ein "Realtek 8168" Chipsatz, welcher durch den re(4) Treiber unterstützt wird.

Als Zweites muss man sich Gedanken darüber machen, welche OpenBSD-Version man nutzen möchte. Dabei gibt es erstmal die Überlegung ob man mit einer amd64-Architektur fahren möchte oder i386. i386 hat den Vorteil das man Linuxbinärkompatibilität bekommen kann; der große Nachteil ist aber natürlich, dass man seine 8GB RAM nichtmal annähernd nutzen kann. Da mich vorkompilierte Linux-Programme nicht interessieren, habe ich die amd64-Architektur gewählt, um meine 8GB RAM genießen zu können. Nun muss nur noch überlegt werden, ob man OpenBSD "stable" oder "current" nutzt. Da ich nicht sehr viele Server verwalte, nutze ich i.d.R. "current" welches zwar ein wenig mehr Administrationsaufwand bedeutet, jedoch immer absolut up-to-date ist (zum Zeitpunkt des HOWTOs ist OpenBSD 4.6 schon im current getaggt, jedoch noch nicht released).

Um gleich zu beginnen, benötigt ihr auf eurem lokalem Rechner einen VNC Viewer (z.B. TightVNC) und ein SSH Client (openssh oder putty).

Letzte und beinah wichtigste Vorbereitung: Kaffee holen; die Installation wird einige Zeit brauchen und erstmal ist dafür keine Zeit mehr ;-)

Kurzüberblick

Ich will einen kleinen Überblick geben, was jetzt eigentlich passieren wird:

Wir werden OpenBSD mittels qemu direkt auf der ersten Server-Platte installieren, konfigurieren und uns einen RAIDframe-tauglichen Kernel basteln. Danach werden wir die andere Festplatte vorbereiten und ein RAID aufbauen, in dem nur diese Platte drin ist. Dort wird die OpenBSD Installation hinkopiert und danach die erste Festplatte gelöscht und in den Raidverbund mit aufgenommen. Diese Vorgehensweise hat den Vorteil, dass auch das root ("/") Verzeichnis gespiegelt auf beiden Platten ist.

Rescue System vorbereiten

Damit es losgehen kann, muss der Server erstmal in den Rescue Mode gebootet werden. Damit es keine Verwechslungen gibt, werde ich die Terminals immer entsprechend Kennzeichnen mit "rescue" und "openbsd". Sobald wir im Rescue System angelangt sind, tun wir das auch gleich:

# PS1="rescue # "

Damit wir mit den beiden Festplatte im Server arbeiten können, müssen wir erstmal den alten Raid auflösen:

rescue # mdadm --stop /dev/md0
rescue # mdadm --stop /dev/md1
rescue # mdadm --stop /dev/m2

Da im Rescue System nicht allzuviel Platz ist, nutzen wir die zweite Festplatte erstmal als Speicherplatz für das OpenBSD CD-ISO. Wir partitionieren die Festplatte um auf eine Linux-Partition und formatieren diese.

rescue # fdisk /dev/sdb   # o = alles löschen, n = neue partition anlegen
rescue # mkfs.ext3 -j /dev/sdb1
rescue # mount /dev/sdb1 /mnt

Jetzt ziehen wir uns das CD-ISO nach Wahl. Ich ziehe mir den aktuellsten Snapshot, man kann hier natürlich die Stable Variante auch nutzen. Mirrors findest du hier.

rescue # cd /mnt
rescue # wget <mirror>/pub/OpenBSD/snapshots/amd64/install46.iso

Als nächsten Schritt richten wir das Rescue-System fertig ein. Einen Dank an dieser Stelle an Hetzner dafür, dass das Rescue System schon wesentlich besser is als früher jedoch 1-2 Kleinigkeiten sind "vergessen" worden. Das wollen wir schnell nachholen. Zum einen fehlt die iptables-Regel um den Traffic der virtuellen Maschiene nach aussen weiterzuleiten, zum anderen fehlt das Packet "sudo" für das qemu-ifup Script.

rescue # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
rescue # apt-get install sudo

Wenn qemu gleich startet, gibt es zwei Möglichkeiten es zu nutzen. Entweder man aktiviert bei seiner SSH Verbindung die X11-Weiterleitung (-Y) was allerdings wirklich *sehr* langsam ist oder man nutzt den bei qemu mitgelieferten VNC-Server, welcher ein wenig performanter ist. Ich preferiere Variante 2 ;-) Damit nicht jeder bei unserer Installation mitmacht geben wir den VNC Server lieber nicht der ganzen Welt Preis und steuern ihn verschlüsselt über SSH an. Dazu benötigen wir noch einen Tunnel. Wer auf einem UNIX-artigen System gerade arbeitet, kann das mit folgendem Befehl von seiner lokalen Maschiene aus tun:

lokal # ssh -L 5900:localhost:5900 root@<unsere-server-ip>

Das Äquivalent kann man mit PuTTy auch zusammenklicken, beim Verbindungsmenü gibt es den Unterpunkt "Tunnel".

Jetzt sind wir soweit und können die Installations-CD starten. Dazu führen wir folgenden Befehl aus. Wenn ihr i386 gewählt habt, könnt ihr einfach "qemu" nutzen, i.d.R. habt ihr amd64 gewählt, wozu das entsprechende qemu auch genutzt werden muss:

rescue # qemu-system-x86_64 -m 1024 -hda /dev/sda -net nic -net tap -cdrom /mnt/install46.iso -boot d -vnc localhost:0 &

Bevor wir in qemu einsteigen, benötigen wir noch ein paar Informationen vom Server. Notiert euch IP Adresse und Netzmaske vom eth0- und tap0-Interface. Desweiteren werden die DNS Server benötigt.

rescue # ifconfig tap0
rescue # ifconfig eth0
rescue # cat /etc/resolv.conf

OpenBSD Installation

Jetzt können wir die Installation von OpenBSD beginnen. Dazu startet man den VNC-Viewer seiner Wahl und verbindet sich mit "localhost" (wir haben ja einen Tunnel vorhin erstellt).

lokal # vncviewer localhost

Mittlerweile sollte die CD gebootet haben und die normale OpenBSD-Installation beginnt. Wichtig ist nur die Netzwerkkonfiguration. (Das ist nur ein Übergangssystem, man benötigt jetzt KEINE verschiedenen Slices o.ä., die Festplatte wird später noch richtig eingerichtet). Gebt alles ein wie ihr es braucht bis auf die folgenden Dinge:

  • Bei der Netzwerkkonfiguration konfiguriert ihr ne0 mit der IP+1 welche ihr von tap0 bekommen habt (bei mir ist tap0 mit "172.20.0.1" konfiguriert, daher gebe ich meinem OpenBSD die IP "172.20.0.2"). Die Netzmaske wird ebenso von tap0 übernommen.
  • Als Gateway wird die tap0-IP genommen (bei mir "172.20.0.1").
  • Als DNS-Server tragt ihr einen der DNS-Server ein die ihr vorhin aus der /etc/resolv.conf geholt habt (213.133.99.99).
  • Bei der Frage nach der Festplatte wählt ihr wd0 aus (sollte Standard sein) und sagt ihm er solle die gesamte Festplatte nutzen ("w"). Dann gebt ihr "c" ein um ein "custom" Layout zu machen. Wir benötigen nur ein root Slice und ein swap Slice. Root braucht nicht größer als 2GB sein, swap 1GB.

Wenn die Installation beendet ist, könnt ihr mit halt -p das virtuelle OpenBSD herunterfahren.

Die CD benötigen wir nichtmehr:

rescue # cd
rescue # umount /mnt

GENERIC.RAID Kernel bauen

Jetzt können wir das frisch installierte OpenBSD starten.

qemu-system-x86_64 -m 1024 -hda /dev/sda -net nic -net tap -vnc localhost:0 &

Wenn man möchte, kann man den VNC-Viewer erneut starten, sollte aber nicht nötig sein wenn alles richtig konfiguriert wurde. Um Copy&Paste und bessere Tastaturunterstützung zu haben nutz ich lieber mein SSH Client.

rescue # ssh root@<openbsd ip>   # 172.20.0.2 bei mir

Damit wir nicht durcheinander kommen, hier erstmal das Terminal einstellen:

# PS1="openbsd # "

Es sollte alles richtig konfiguriert sein, dass das OpenBSD die Welt erreichen kann.

openbsd # ping google.de

Solltet ihr die "stable" Version nutzen und der ping nicht gehen, ist das nicht weiter schlimm. Die zum Kernel gehörenden Sources sind auf der CD enthalten.

Im Fall, dass ihr wie ich "current" benutzt, müssen wir uns nun erstmal die OpenBSD Sources holen. Sucht euch dazu einen anonymen CVS Server eurer Wahl aus.

openbsd # export CVSROOT=<euer cvs root wir in der liste angegeben>
openbsd # cd /usr
openbsd # cvs checkout -d$CVSROOT checkout -P src

Dieser Schritt kann ein wenig dauern. Jetzt ist der ideale Zeitpunkt, neuen Kaffee zu holen ;-)

Nachdem nun die OpenBSD Sources auf der Platte sind, bauen wir uns einen neuen Kernel mit RAIDframe-Unterstützung. Er basiert auf dem amd64 GENERIC.MP Kernel und fügt nur die RAIDframe-Unterstützung hinzu.

openbsd # cd /usr/src/sys/arch/amd64/conf/   # wenn ihr i386 benutzt entsprechend anders
openbsd # cat > GENERIC.RAID << EOF
include "arch/amd64/conf/GENERIC.MP"  # use multiprocessor kenrel

option RAID_AUTOCONFIG                # enable raid on boot

pseudo-device raid 4                  # RAIDframe disk driver
EOF
openbsd # config GENERIC.RAID

Jetzt den neuen Kernel kompilieren, installieren und OpenBSD herunterfahren.

openbsd # cd ../compile/GENERIC.RAID/
openbsd # make clean && make depend && make
openbsd # cp /bsd /bsd.orig
openbsd # install -o root -g wheel -m 644 bsd /
openbsd # halt -p

OpenBSD für die reale Welt vorbereiten

Nun wird das OpenBSD wieder gestartet.

rescue # qemu-system-x86_64 -m 1024 -hda /dev/sda -net nic -net tap -vnc localhost:0 &
rescue # ssh root@<openbsd ip>

Und wieder per SSH rein ins System und das Terminal einstellen:

# PS1="openbsd # "

Jetzt konfigurieren wir OpenBSD so um, dass es mit der realen Hardware bootet. Jetzt ist es wichtig zu wissen, welcher Treiber eure reale Netzwerkkarte steuert. Bei meiner Karte ist es re(4).

openbsd # echo 'inet <server-ip> <netmask>' > /etc/hostname.re0
openbsd # echo '<gateway-ip>' > /etc/mygate

Es ist sehr wichtig, dass ihr die Eingaben mehrfach überprüft. Sind diese nicht korrekt, bekommt ihr keine Verbindung zum Server und müsst wieder ins Rescue System booten und per qemu euer OpenBSD starten um den Fehler zu beheben.

Anschließend muss noch die "fstab"-Datei geändert werden, denn auf dem Live System haben wir mit Sicherheit SCSI-Karten welchen den "sd" Treiber nutzen (bei mir wollte die qemu SCSI-Emulation nicht mit OpenBSD harmonieren - daher auf diesem Weg).

openbsd # vi /etc/fstab

Ändert dort "wd0a" und "wd0b" in "sd0a" und "sd0b" - anschließend wird das System wieder heruntergefahren.

openbsd # halt -p

Daumen drücken

Der spannende Moment einer jeden Serverinstallation: ist mein Server nach dem Reboot in da oder nicht.

 rescue # reboot
    • daumen drücken*
 lokal # ssh root@<server ip>

Wenn ihr jetzt zur Shell kommt, habt ihr den ersten Part geschafft. OpenBSD läuft auf der realen Hardware und steht nun zur Verfügung. Das markieren wir uns gleich:

# PS1="live # "

RAID einrichten

Damit wir den RAID nun einrichten können, nutzen wir die andere Platte (auf der vorhin noch das CD Image drauf war) um unser später reales System laufen zu lassen.

live # fdisk -i sd1    # y wir wollen mbr schreiben

Nun richten wir die Slices ein, die das Grundsystem braucht. Es sind genau zwei. Ein Slice auf dem der Kernel draufliegt, damit der Bootloader was zum Booten hat und ein Slice in welchen das RAID reinkommt.

live # disklabel -E sd1

Slice 1 kann man mit 128MB einrichten (mehr als ausreichend) als 4.2BSD Slice. Slice 2 richtet man mit dem restlichen Space ein und wählt hier "RAID" statt "4.2BSD".

Jetzt formatieren wir noch unseren boot-Slice und machen ihn bootbar.

live # newfs sd1a
live # cp /bsd /usr/mdec/boot /mnt
live # /usr/mdec/installboot -v /mnt/boot /usr/mdec/biosboot sd1
live # umount /mnt

Nun wird der RAID konfiguriert. Um den RAID1 einzurichten benötigen wir zwei Festplatten. Da aber auf der einen ja noch unser aktuelles System läuft, geben wir ihm eine nicht-existierende Platte und heucheln ihm vor, die wäre einfach kaputt.

live # cat > /root/raid0.conf << EOF
START array
# numRow numCol numSpare
1 2 0

START disks
/dev/sd2b
/dev/sd1b

START layout
128 1 1 1

START queue
fifo 100
EOF

/dev/sd2b existiert nicht, das wird später korrigiert. Erstmal jetzt das RAID initialisieren.

live # raidctl -C /root/raid0.conf raid0
live # raidctl -I $(date +%y%m%d)0 raid0

Wenn alles funktioniert hat, bekommen wir jetzt hier eine Statusausgabe in welcher unsere richtige Festplatte funktioniert und die zweite nicht existiert:

live # raidctl -s raid0

Damit der Kernel noch weiß, dass auf dem RAID auch ein root-Slice liegen kann, müssen wir es markieren.

live # raidctl -A root raid0

Jetzt kommen wir zur individuellen "Partitionierung" der Festplatte.

live # disklabel -E raid0

Dieser Teil ist so individuell, wie es Servereinsatzgebiete gibt. Hier solltet ihr selbst wissen, was für Slices ihr haben wollt und wie groß sie sein sollen. Ich habe zum Testen folgende Aufteilung genommen und werde damit auch hier alles weiterhin darstellen:

/       # raid0a 50gb
swap    # raid0b 10gb
/tmp    # raid0d 10gb
/var    # raid0e restlicher space

Wenn die Slices erstellt sind, formatieren wir sie.

live # newfs raid0a
live # newfs raid0d
live # newfs raid0e

Und mounten sie in /mnt

live # mount /dev/raid0a /mnt
live # mkdir /mnt/tmp
live # mount /dev/raid0d /mnt/tmp
live # mkdir /mnt/var
live # mount /dev/raid0e /mnt/var

Und jetzt kopieren wir die aktuelle OpenBSD-Installation in das neue RAID.

live # cd /mnt
live # tar -Xcpf - / | tar -xvpf -
live # cd

Schlussendlich müssen wir die fstab-Datei nurnoch so modifizieren, sodass die Mountpunkte auch stimmen.

live # cat > /mnt/etc/fstab << EOF
/dev/raid0a / ffs rw 1 1
/dev/raid0d /tmp ffs rw 1 2
/dev/raid0e /var ffs rw 1 2
EOF

Jetzt alles unmounten.

live # umount /mnt/var
live # umount /mnt/tmp
live # umount /mnt

Das System ist nun fertig zum Booten vom RAID - allerdings nur Festplatte 2. Wenn das BIOS korrekt konfiguriert ist, können wir es jetzt mit folgendem Befehl zwingen, die zweite Festplatte mit unserem neuen System zu booten. Wenn es das nicht ist, müsst ihr jetzt wohl die LARA bemühen.

live # dd if=/dev/zero of=/dev/sd0 bs=1m count=1

Alles soweit fertig für den nächsten Reboot.

live # reboot

Wenn der Server jetzt nicht von der zweiten Festplatte bootet, müsst ihr die LARA holen und beim Booten im OpenBSD-Bootloader folgende Zeile eintippen:

boot sd1a:/bsd

RAID vervollständigen

Nachdem jetzt das neue System gebootet ist, sollte man kontrollieren, ob es tatsächlich alles richtig ist:

# PS1="live # "
live # uname -v
live # mount
live # raidctl -s raid0

Vor allem "mount" sollte zeigen, dass alle eure Slices von raid0 richtig gemountet sind.

Damit das RAID vollständig wird, spiegeln wir die Struktur von der zweiten Festplatte auf die erste.

live # fdisk -i sd0
live # disklabel sd1 > /root/disklabel.sd1
live # disklabel -R sd0 /root/disklabel.sd1

Jetzt fügen wir die "neue" Festplatte dem RAID hinzu.

live # raidctl -a /dev/sd0b raid0
live # raidctl -vF component0 raid0

Das dürfte nun einige Zeit dauern. Wenn das RAID fertig ist, brauchen wir nurnoch den Bootslice gleich wie bei der anderen Festplatte einrichten.

live # mount /dev/sd0a /mnt
live # cp /bsd /usr/mdec/boot /mnt
live # /usr/mdec/installboot -v /mnt/boot /usr/mdec/biosboot sd0
live # umount /mnt

Fertig

live # reboot

Ihr solltet in euer neues OpenBSD booten (inkl. funktionierendem RAID1). Gratulation! ;-)

Jetzt kann man gleich weitermachen mit

# man afterboot

und das schicke neue System einrichten.

Update-Hinweis

WICHTIG: Wenn ihr ein Kernelupdate einspielt, müsst ihr den Kernel sowohl in sd0a als auch sd0b austauschen - sonst bootet im Fall der Fälle ein alter Kernel.


Quellen

Als Vorlage für die RAID Konfiguration, diente ein Artikel von linux.com. Desweiteren wurden natürlich zahlreiche OpenBSD man-pages gequält und die qemu-Dokumentation.

Ende

Danke an das Hetznerteam für guten Support, ein mittlerweile recht gutes Rescue System und gute Hardware.

--Tobias Sarnowski 07:57, 29. Aug. 2009 (UTC)



© 2014. Hetzner Online AG. Alle Rechte vorbehalten.