ZFS-Root-Partition unter FreeBSD 9

Mit der folgenden Beschreibung lässt sich FreeBSD 9 komplett inklusive ZFS-Root-Partition normal aber auch als Mirror (Raid-1) installieren.

Zunächst wird natürlich ein Boot-Medium benötigt. Ob via CD/DVD, Memory-Stick, PXE, oder Raritan eRic, die folgenden Schritt sind die gleichen.

1. FreeBSD 9 starten

Es reicht die Boot-only Version. Nach dem erfolgreichen Start wird <Shell> oder <Live CD> gewählt. Bis dem BSD Installer <Install> lässt sich derzeit noch kein ZFS verwalten.

Eine deutsche Tastatur kann man schnell mit dem Befehl

  1. kbdmap

auswählen.

Sollten eine oder alle Festplatten bereits partitioniert sein, müssen diese Informationen gelöscht werden. Diese gelingt für ada0 z.B. mit

  1. dd if=/dev/zero of=/dev/ada0 bs=1024 count=1

Ansonsten meldet gpart bereits nach dem ersten Befehl

  1. gpart: geom 'ada0': File exists

2. Partition und Bootcode

Eine SATA-Platte ada0 wird mit folgenden Schritten vorbereitet:

  1. gpart create -s gpt ada0
  2. gpart add -b 34 -s 94 -t freebsd-boot ada0
  3. gpart add -t freebsd-zfs -l disk0 ada0
  4. gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

Für einen Spiegel (Raid-1) sind diese Schritte auch für die zweite SATA-Festplatte ada1 nötig:

  1. gpart create -s gpt ada1
  2. gpart add -b 34 -s 94 -t freebsd-boot ada1
  3. gpart add -t freebsd-zfs -l disk1 ada1
  4. gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

ZFS Pool anlegen

Warnungen während des Mountens können ignoriert werden.

Für eine einzelne Festplatte reicht zum Anlegen des ZFS Pools der Befehl

  1. zpool create zroot /dev/gpt/disk0

Einen Mirror (Raid 1) legt man mit

  1. zpool create zroot mirror /dev/gpt/disk0 /dev/gpt/disk1

an. Die Warnung cannot mount 'zroot': failed to create mountpoint kann ignoriert werden. Dies wird manuel im nächsten Schritt erledigt.

4. Einrichten der bootfs Eigenschaften, Prüfsummen und Mountpoints

  1. zpool set bootfs=zroot zroot
  2. zfs set checksum=fletcher4 zroot
  3. zfs set mountpoint=/mnt zroot

5. Exportieren und Importieren des zroot.cache

zroot.cache wird nach /var/tmp exportiert:

  1. zpool export zroot
  2. zpool import -o cachefile=/var/tmp/zpool.cache zroot

Anlegen des Filesystems

Die richtige Wahl bleibe jedem selbst überlassen.

  1. zfs create zroot/usr
  2. zfs create zroot/usr/home
  3. zfs create zroot/var
  4. zfs create -o exec=on -o setuid=off zroot/tmp
  5. zfs create -o setuid=off zroot/usr/ports
  6. zfs create -o exec=off -o setuid=off zroot/usr/src
  7. zfs create -o exec=off -o setuid=off zroot/var/db
  8. zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
  9. zfs create -o exec=off -o setuid=off zroot/var/run
  10. zfs create -o exec=on -o setuid=off zroot/var/tmp

7. Swap

Für Swap-Space werden Prüfsummen deaktiviert. Die 4GB sollten natürlich auf das System abgestimmt werden.

  1. zfs create -V 4GB zroot/swap
  2. zfs set org.freebsd:swap=on zroot/swap
  3. zfs set checksum=off zroot/swap

8. Links und Rechte

  1. cd /mnt
  2. chmod 1777 tmp
  3. ln -s usr/home .
  4. chmod 1777 var/tmp

9. FreeBSD 9 installieren

Ein Wechsel zur Standard Shell erleichtert den Schleifen-Syntax.

  1. sh
Das Verzeichnis /usr/freebsd-dist ist wohl leer, aber die Dateien können schnell geholt oder bereit gestellt werden. Z.B. lässt sich mit sysinstall: Configure -> Networking -> Interfaces sehr schnell und komfortabel eine Netzwerkkarte einrichten. Die Binaries lassen sich dann schnell mit

  1. cd /mnt/var/tmp
  2. for f in base.txz lib32.txz kernel.txz doc.txz; do
  3. ftp://ftp2.de.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/$f
  4. done

holen. Natürlich sind auch andere Server vorhanden und an Stelle des FQDN kann auch die IP benutzt werden, wenn die Namensauflösung nicht richtig eingerichtet ist.

Doch nun zur eigentlichen Installation

  1. export DESTDIR=/mnt
  2. for f in base.txz lib32.txz kernel.txz doc.txz ports.txz src.txz;do
  3. (cat $f | tar --unlink -xvpJf - -C ${DESTDIR:-/});
  4. done

10. Kopieren des Zpool Caches

Unscheinbarer, aber wichtiger Schritt!

  1. cp /var/tmp/zpool.cache /mnt/boot/zfs/

11. Boot Konfiguration

Dem System muss nun noch mitgeteilt werden, dass von ZFS gebootet werden soll:

  1. echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf
  2. echo 'zfs_load="YES"' >> /mnt/boot/loader.conf
  3. echo 'vfs.root.mountfrom="zfs:zroot"' >> /mnt/boot/loader.conf
  4. touch /mnt/etc/fstab

12. Alles Unmounten und Mountpoints reparieren

  1. zfs umount -af
  2. zfs set mountpoint=legacy zroot
  3. zfs set mountpoint=/tmp zroot/tmp
  4. zfs set mountpoint=/usr zroot/usr

13. Ende

Das System kann nun neu gestartet werden. Danach sollten Root-Passwort gesetzt und ein paar Dienste konfiguriert und gestartet/ausgeführt werden (ssh, nfs, csup). Mit portsnap lassen sich dann die Ports auf den neusten Stand bringen und weiterer Installations- und Konfigurationsarbeit steht nichts mehr im Weg.

Außerdem sollte unbedingt kontrolliert werden, ob das System auch von beiden Platten starten kann.

Kommentare

Hallo, hat super geklappt! Vielen Dank. Jetzt mal sehen was ich mit meiner FreeBSD Installation anfange :)

Nachdem eine Festplatte komplett ausgefallen ist, wurde eine Platte gleichen Typs eingebaut. Nach der gpart-Prozedur - in diesem Fall für /dev/ada1

  1. gpart create -s gpt ada1
  2. gpart add -b 34 -s 94 -t freebsd-boot ada1
  3. gpart add -t freebsd-zfs -l disk1 ada1
  4. gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

Konnte das RAID problemlos mit dem Kommando

  1. zpool replace zroot /dev/ada1p2

wiederhergestellt werden.

Könnte man bitte die Anleitung um Bemerkungen ergänzen welche Schritte notwendig bzw nicht notwendig sind wenn man von einer vollständigen Installations-DVD installiert ? Dann sollte ja der Punkt 9 zum Teil entfallen, oder ?

Ansonsten eine geniale Anleitung, auch für mich als FreeBSD Neuling absolut verständlich und nachvollziehbar.

Richtig. Das Kopieren der Dateien könnte via Sysinstall klappen.
Alternativ sollten die Archive *.tbz auf dem Installations-Medium im Verzeichnis /usr/freebsd-dist vorhanden sein.

Zur Zeit kann ich das leider nicht prüfen