FreeBSD 6.3 auf Hetzner DS 3000

Meine Arbeitsumgebung präsentierte sich in Form eines Ubuntu 7.10. Mein Zielobjekt war ein Hetzner DS 3000 (gemietet 01/2008). Das gewünschte Betriebssystem hört auf den Namen FreeBSD (6.3).
Soweit zur Ausgangslage. Das größte Problem ist wohl, dass Hetzner kein BSD-Rettungssystem zur Verfügung stellt, sondern lediglich ein Debian 4.0. Die erste Konsequenz ist also, dass unser UFS2-Filesystem vom Rettungssystem aus zwar gelesen aber nicht beschrieben werden kann. Alle Einstellungen müssen also lokal mit qemu vorgenommen werden, danach heißt es dann rüberladen, rebooten und hoffen.

Ich habe mir den Server mit einem minimalen Debian 4.0 ausliefern lassen. Der erste Schritt ist herauszufinden, welche Hardware in der Kiste steckt. Mittlerweile gibt es mehrere Erfahrungsberichte von depinguisierten Hetzner-Servern und Hardwareunterschiede sind an jeder Ecke auszumachen, von daher bringt dich eine Liste von mir nur bedingt weiter. Wahrscheinlich führt sie dich eher zu falschen Annahmen. Sehr wichtig sind vor allem die Festplatten und die Netzwerkkarte, denn diese Komponenten müssen im Wesentlichen von dir konfiguriert werden.
Folgende Befehle sollten Aufschluss liefern:

lspci
dmesg

Außerdem sollte die Datei /etc/resolv.conf gesichert werden, damit später auch die Namensauflösung auf Anhieb funktioniert.

Erst einmal zurück auf unser lokales System. Ich befinde mich in /home/rtg/Freebsd und habe hierhin auch bereits die erste FreeBSD-CD als ISO geladen. Im ersten Schritt muss die “Festplatte” erschaffen werden, in die unser FreeBSD installiert wird. Dazu benutzen wir dd.

dd if=/dev/zero of=freebsd bs=2048 count=4194304

Diese Anweisung erstellt eine Datei mit etwas mehr als 8GB Größe gefüllt mit frischen Nullen aus /dev/null. Man würde auch mit wesentlich weniger Platz auskommen, so spare ich mir aber das nachträgliche Vergößern von Partition und Filesystem. Beim Upload ist die Größe nicht sonderlich entscheidend, da wir die Datei mit gzip packen werden und viele Nullen lassen sich ganz gut zusammenfassen.
Also dann qemu angeworfen und los geht die Installation:

qemu -hda freebsd -cdrom 6.3-RELEASE-i386-disc1.iso -net none -boot d

Was bedeuten die Parameter?
-hda zeigt auf die Festplatte. Hier geben wir unsere mit Nullen gefüllte Datei an. -cdrom zeigt auf unser ISO-Image, das als Installationsmedium benutzt werden soll. -net steht für Netzwerkunterstützung. Wir schalten sie für die Installation ab. -boot gibt an von welchem Medium gebootet werden soll.
Im FreeBSD-Installationsmenü kann die Standardinstallation genutzt werden. Allen verfügbaren Platz in einen Slice, Root-Partition anlegen und bei Bedarf auch eine Swap-Partition. Die Dialoge können eigentlich alle mit der Standard-Antwort beantwortet werden. Lediglich beim Thema SSH-Login sollte man Yes anwählen. Distributionsset ist bei mir “minimal”, damit mein DSL 3000 nicht all zu viel uploaden muss. Außerdem solltet ihr dringend einen unpreviligierten User anlegen und in die Gruppe wheel packen. Alles fehlende kann später auf dem Server nachgepflegt werden.
Ist die Installation abgeschlossen, schließen wir qemu und booten von unserem FreeBSD-Image:

qemu -net none freebsd

Folgende Dateien müssen angepasst werden:
/etc/resolv.conf
/etc/rc.conf
/etc/fstab

Die resolv.conf kann einfach aus der vorhandenen Debian-Installation übernommen werden, der Syntax ist gleich. In der rc.conf muss das Netzwerk konfiguriert werden. Ich erledige das Ganze mit DHCP, dann muss man sich nicht mit den Hetzner-Routen rumschlagen und schließt einen potentiellen Fehler aus:

ifconfig_re0="DHCP"
hostname="roetgers.org"

In der fstab ist es nun wichtig, dass die Festplattenbezeichnungen stimmen. Mich hat es einige Stunden gekostet, herauszufinden, dass meine Festplatte am dritten Controller hing und dementsprechend über /dev/ad4 angesprochen werden möchte. Dementsprechend sah meine fstab wie folgt aus:

# Device Mountpoint FStype Options Dump Pass#
/dev/ad4s1b none swap sw 0 0
/dev/ad4s1a / ufs rw 1 1
/dev/acd0 /cdrom cd9660 ro,noauto 0 0

Nachdem wir die Anpassungen vorgenommen haben, fahren wir die virtuelle Maschine herunter und bereiten unser FreeBSD auf die Reise ins Rechenzentrum vor:

gzip freebsd

In der Zwischenzeit kann nun über das Kundenmenü von Hetzner der Rescue Modus aktiviert werden. Das System schicken wir danach per

reboot

in ebendiesen.

Jetzt müssen wir das Image hochladen:

ssh root@10.0.0.2 "gunzip > /dev/sda" < freebsd.gz

Nachdem der Upload geglückt ist, können wir im Rescue System mit Hilfe von

cfdisk

die Festplatte weiter aufteilen. Ich lege einen zweiten Slice mit fast allem verfügbaren Speicherplatz an. Das wird später mein Slice für /usr. Zusätzlich lege ich noch einen weiteren Slice mit dem verbliebenen Plattenplatz an. Diesen Slice benötige ich noch, um /usr auf den neuen Slice zu schieben. Dazu später mehr.
Immer daran denken den Slices auch den entsprechenden Typ FreeBSD (A5) mitzugeben. Die erste Partition mit unserem FreeBSD-System muss das bootable-Flag besitzen.
Nachdem die Änderungen geschrieben wurden, gilt es zu rebooten.

Was tun, wenn mein System nicht wieder hochfährt?
Ruhe bewahren und auf Fehlersuche gehen. Es kann dafür sehr unterschiedliche Ursachen geben und ich kann hier nicht alle Gründe aufzählen, aber mal die Gängigsten:

Das Netzwerk ist nicht korrekt eingerichtet!
Auch wenn ihr DHCP benutzt, kann das der Grund sein. Einerseits kann natürlich der DHCP-Server von Hetzner ausfallen, viel wahrscheinlicher ist es aber, dass ihr für euer Interface den falschen Treiber gewählt habt. Wenn das wirklich der Grund ist, konnte euer FreeBSD also booten, nur SSH war logischerweise nicht erreichbar. In diesem Fall habt ihr leichtes Spiel. Aktiviert wieder das Rescue System und löst dann einen Hardware Reset über das Webinterface aus. Wenn ihr wieder im Rescue seid, mounted eure FreeBSD Root Partition:

mount -t ufs -ro ufstype=ufs2 /dev/ad0s1a /mnt

Schaut euch die Logiles unter /var/log an. Die Logeinträge, die während des Bootens gemacht wurden, verraten euch, wie ihr eure Netzwerkkarte ansprechen müsst. Sobald ihr die Bezeichnung herausgefunden habt, geht das Spiel von vorne los: qemu an, Änderungen durchführen, hochladen, rebooten.

Meine Festplatte wird nicht gefunden!
Das war übrigens auch der Fehler, der meinen Depinguinierungsdurchmarsch bei Hetzner behindert hat. Die Festplatten hängen an einem RAID-Controller. Da es sich nicht um SCSI-Devices handelt, beziehen sich die Zahlen der Festplatten auf ihren Platz an den jeweiligen Controllern und werden nicht einfach von 0 startend durchgezählt.
Meine Platten sind /dev/ad4 und /dev/ad6.

Mein Server ist online, aber ich kann mich per SSH nicht als Root einloggen!
Das ist ganz normal. Um dieses “Problem” zu beheben, musst du entweder die SSHd-Konfiguration ändern (PermitRootLogin yes) oder, wie ich weiter oben vermerkt habe, einen unpreviligierten Benutzer anlegen, der sich in der Gruppe wheel befindet. Dann kannst du dich per SSH als dieser User anmelden und mithilfe von su Root-Rechte erlangen.

Die Probleme sind es alle nicht!
Hetzner ist so kulant und bietet kostenfrei eine LARA für zwei Stunden an. Damit kannst du den Bootvorgang beobachten und den Fehler leichter lokalisieren.

Wenn dein FreeBSD schlussendlich gebootet hat, hast du es so gut wie geschafft. Um Platzproblemen aus dem Weg zu gehen, wollte ich auf jeden Fall noch /usr auf einen eigenen Slice legen. Den hatte ich bereits, wie weiter oben beschrieben, im Rescue System angelegt. Aber wie verschiebt man nun eigentlich ein elementares Verzeichnis auf eine andere Partition? Was sich erst einmal trivial anhört, ist es leider nicht, schließlich müssen alle Berechtigungen sauber kopiert werden und gerade die erweiterten Dateiattribute werden von Programmen wie tar nicht beachtet.
Glücklicherweise gibt es dump und restore. Unglücklicherweise können damit nur komplette Partitionen verschoben werden und keine einzelnen Verzeichnisse.
Nochmal meine Ausgangslage, damit du die Schritte besser auf dein System ummünzen kannst:
ad4s1a ist meine root-Partition mit ca. 8GB Platz (~100 MB belegt).
ad4s1b ist mein Swap. Ich erwähne ihn nur der Vollständigkeit halber, der ist hierbei nicht relevant.
ad4s2 ist mein unbenutzter Slice mit 350GB, der in Zukunft /usr beherbergen soll.
ad4s3 ist ein Slice mit ein bisschen übrig gebliebenen Platz, der jetzt erst einmal als Hilfsmittel für das Kopieren und später als /tmp dienen soll.
Der Plan ist jetzt, so wird das Vorgehen auch im FreeBSD-Manual beschrieben, die Root-Partition auf ad4s3 zu kopieren, wobei das Verzeichnis /usr auf ad4s2 landet. Danach kann ich ad4s2 problemlos im Realsystem als /usr einhängen. Dieses Vorgehen ist aufgrund des Einsatzes von dump nötig. Soweit die Theorie, hier die Praxis:

newfs /dev/ad4s2
newfs /dev/ad4s3
mount /dev/ad4s3 /mnt
mkdir /mnt/usr
mount /dev/ad4s2 /mnt/usr
cd /mnt
dump 0af - / | restore xf -
cd
umount /mnt/usr
umount /mnt

Das war jetzt ganz schön viel auf einmal. Also nochmal Schritt für Schritt:
Ich lege auf den beiden Slices ein neues Dateisystem an, damit ich mit ihnen arbeiten kann.
Ich mounte meinen Helfs-Slice nach /mnt, lege dort das Verzeichnis usr an und mounte darauf meinen zukünftigen /usr-Slice.
Dann dumpe ich / nach /mnt, damit wird auch automatisch /mnt/usr mit den Daten aus /usr befüllt. Ist das geschafft, löse ich die Mounts wieder.
Jetzt nur noch kurz die /etc/fstab bearbeiten:

# Device Mountpoint FStype Options Dump Pass#
/dev/ad4s1b none swap sw 0 0
/dev/ad4s1a / ufs rw 1 1
/dev/ad4s2 /usr ufs rw 1 2

Danach könnt ihr das aktuelle /usr verschieben und das neue /usr mounten.

mv /usr /usr.old
mkdir /usr
mount /usr

Achtet bloß darauf, dass ihr die Datei fstab richtig bearbeitet und speichert. Ich hatte /usr temporär gemounted und vergessen die fstab zu editieren. Nach einem Reboot fehlte /usr, da das alte /usr nun unter /usr.old lag, das neue /usr aber nicht gemounted wurde. Solltet ihr diesen Punkt erreicht haben, hilft soweit ich das überblicke nur das neue Herüberladen eures Images. Das Rettungssystem kann das Filesystem nicht beschreiben und eine LARA anfordern, bringt nicht viel, da man sich aufgrund des fehlenden /usr gar nicht erst einloggen kann.

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • StumbleUpon
  • Reddit
  • Webnews
  • MisterWong
  • Y!GG
  • Technorati
  • Facebook
  • Furl
  • Google Bookmarks
  • Slashdot
  • Ask
  • Hype
  • Netscape
  • Readster
  • YahooMyWeb