Netzwerk-Anhangs-Speicher

Ich habe einen kleinen Würfel, hinten mit Netzwerk-Buchse & Strom, innen sind fünf Festplatten. Feine Sache, das.

Hier ein paar Notizen zur Installation.

Vorbereitung

Das USB-Image schreiben (hier z.B. von einem Mac aus):

sudo dd if=FreeBSD-11.0-RELEASE-amd64-memstick.img of=/dev/rdisk4 bs=1m conv=sync

Davon booten, den Installer abbrechen, und in die Live-Shell wechseln.

Als root einloggen, und erstmal Module nachladen:

kldload geom_eli zfs aesni

Partitionieren

Das System soll eigenständig laufen können, die Daten sollen aber trotzdem verschlüsselt sein.

Weiterhin sollen die Festplatten alle gleich partitioniert sein, da diese im Verbund laufen.

Das System wird natürlich mit UEFI aufgesetzt - modern, modern!

Dies ergibt dann sechs Partitionen pro Platte…

  • zwei Boot-Partitionen (efi & gpt)
  • eine Partition für den zfs mirror bootpool (unverschlüsselt - /boot)
  • eine Swap-Partition (verschlüsselt)
  • eine Partition für den raidz2-Pool zroot (unverschlüsselt - System /)
  • eine Partition für den raidz2-Pool tank (verschlüsselt - Daten /tank)

Zurecht finden:

  • Ein gpart show listet die Platten mit ihren Partitionen sowie deren Start und End-Sektoren.

  • Ein camcontrol devlist zeigt die Herstellerdaten der Platten, und deren Device-Files (z.B. /dev/ada0).

  • camcontrol identify ada0 zeigt noch mehr Informationen zur Platte an.

Frisch ans Werk:

foreach i ( 0 1 2 3 4 )
foreach? gpart create -s GPT "ada$i"
foreach? gpart add -t efi          -l "efiboot$i" -s 800K       "ada$i"
foreach? gpart add -t freebsd-boot -l "gptboot$i" -s 512K       "ada$i"
foreach? gpart add -t freebsd-zfs  -l "boot$i"    -s 2G   -a 4K "ada$i"
foreach? gpart add -t freebsd-swap                -s 2G   -a 4K "ada$i"
foreach? gpart add -t freebsd-zfs  -l "zroot$i"   -s 15G  -a 4K "ada$i"
foreach? gpart add -t freebsd-zfs  -l "tank$i"            -a 4K "ada$i"
foreach? end
  • Die Blockgrößen werden auf 4K festgezurrt (gpart ... -a 4K)

Hinweis:

  • foreach funktioniert natürlich nur in der csh (und Varianten).

Als nächstes kommt der Bootloader:

foreach i ( 0 1 2 3 4 )
foreach? dd if=/boot/boot1.efifat of="/dev/ada${i}p1"
foreach? gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 2 "ada$i"
foreach? end
  • Der EFI-Loader wird in die erste Partition geschrieben (dd ...).
  • Die GPT-Boot-Partitionen bekommen ihren Bootstrap-Code verpasst (gpart bootcode ... -i 2).

An dieser Stelle kann man bereits einmal neu starten, um zu testen, ob der Bootloader geladen wird, und soweit alles funktioniert. Muss man aber nicht.

Jetzt sind die zfs-Pools dran:

zpool create …

Wir erstellen jetzt jeweils vier Partitionen für den Rest. Diese beheimaten dann bootpool, swap, zroot und tank.

foreach i ( 0 1 2 3 4 )
foreach? gpart add -t freebsd-zfs -l "boot$i" -s 2G -a 4K "ada$i"
foreach? gpart add -t freebsd-swap -s 2G -a 4K "ada$i"
foreach? gpart add -t freebsd-zfs -l "zroot$i" -s 15G -a 4K "ada$i"
foreach? gpart add -t freebsd-zfs -l "tank$i" -a 4K "ada$i"
foreach? end

Jetzt die Pools:

zpool create -o cachefile=/var/tmp/zpool.cache \
    -o altroot=/mnt zroot raidz2 \
    /dev/gpt/zroot0.nop /dev/gpt/zroot1.nop \
    /dev/gpt/zroot2.nop /dev/gpt/zroot3.nop \
    /dev/gpt/zroot4.nop

deltree:

Damit das System später Platz hat, legen wir den RAIDz2 Pool zroot an. Wir erstellen davor aber noch einen Mountpoint in den wir schreiben dürfen:

mkdir /tmp/zroot
zpool create -m /tmp/zroot zroot raidz2 ada0p3 ada1p3 ada2p3 ada3p3 ada4p3

Dann werden die Mountpoints für das System eingetragen:

zfs create zroot/home
zfs create zroot/root
zfs create zroot/tmp

zfs create zroot/usr
zfs create zroot/usr/home
zfs create zroot/usr/ports
zfs create zroot/usr/src

zfs create zroot/var
zfs create zroot/var/audit
zfs create zroot/var/crash
zfs create zroot/var/log
zfs create zroot/var/mail
zfs create zroot/var/tmp

Access Time ausschalten:

zfs set atime=off zroot

Installieren

Sind die Platten soweit partitioniert, wird das System entpackt:

tar -xvf /usr/freebsd-dist/base.txz -C /tmp/zroot
tar -xvf /usr/freebsd-dist/kernel.txz -C /tmp/zroot
tar -xvf /usr/freebsd-dist/doc.txz -C /tmp/zroot
tar -xvf /usr/freebsd-dist/lib32.txz -C /tmp/zroot

Jetzt wird konfiguriert! In die /tmp/zroot/boot/loader.conf kommt:

geom_eli_load="YES"
zfs_load="YES"
aesni_load="YES"

vfs.root.mountfrom="zfs:zroot/ROOT/default"
autoboot_delay="3"

Die /tmp/zroot/etc/fstab wird erstellt:

/dev/ada0p2.eli     none        swap    sw          0   0
/dev/ada1p2.eli     none        swap    sw          0   0
/dev/ada2p2.eli     none        swap    sw          0   0
/dev/ada3p2.eli     none        swap    sw          0   0
/dev/ada4p2.eli     none        swap    sw          0   0

zroot               /           zfs     rw,noatime  0   0
zroot/root          /root       zfs     rw,noatime  0   0
zroot/home          /home       zfs     rw,noatime  0   0
zroot/tmp           /tmp        zfs     rw,noatime  0   0

zroot/usr           /usr        zfs     rw,noatime  0   0
zroot/usr/home      /usr/home   zfs     rw,noatime  0   0
zroot/usr/ports     /usr/ports  zfs     rw,noatime  0   0
zroot/usr/src       /usr/src    zfs     rw,noatime  0   0

zroot/var           /var        zfs     rw,noatime  0   0
zroot/var/audit     /var/audit  zfs     rw,noatime  0   0
zroot/var/crash     /var/crash  zfs     rw,noatime  0   0
zroot/var/log       /var/log    zfs     rw,noatime  0   0
zroot/var/mail      /var/mail   zfs     rw,noatime  0   0
zroot/var/tmp       /var/tmp    zfs     rw,noatime  0   0