IT-Blog von Sebastian van de Meer

Schlagwort: ZFS (Seite 1 von 3)

FreeBSD: Unverschlüsseltes ZFS-Dataset nachträglich verschlüsseln

Bild der Bücher FreeBSD Mastery ZFS und FreeBSD Mastery Advanced ZFS

ZFS Encryption lässt sich nicht nachträglich auf ein bestehendes Dataset aktivieren. Die Daten müssen per zfs send | zfs receive in ein neues, verschlüsseltes Dataset geschrieben werden. Typischer Anwendungsfall: Jails, die in eigenen Datasets liegen und nach einem FreeBSD-Upgrade auf 13+ verschlüsselt werden sollen.

Wer die Grundlagen zu ZFS Encryption noch braucht (Dataset anlegen, Passphrase, Mount nach Reboot), findet sie im Beitrag Native ZFS Encryption einrichten.

Ausgangslage

Ein Pool zroot mit dem unverschlüsselten Dataset varta:

zfs list zroot/varta
NAME          USED  AVAIL     REFER  MOUNTPOINT
zroot/varta   100M  12.0G      100M  /zroot/varta

zfs get encryption zroot/varta
NAME         PROPERTY    VALUE   SOURCE
zroot/varta  encryption  off     default

Migration

Bei zfs send | zfs receive kann man kein Passphrase interaktiv eingeben, weil stdin durch die Pipe belegt ist. Deshalb legt man den Schlüssel temporär in einer Datei ab:

echo 'MeinGeheimesPassphrase' > /tmp/keyfile.txt
chmod 600 /tmp/keyfile.txt

Snapshot erstellen und in ein neues verschlüsseltes Dataset senden:

zfs snapshot zroot/varta@migration

zfs send zroot/varta@migration | \
  zfs receive -F \
  -o encryption=on \
  -o keyformat=passphrase \
  -o keylocation=file:///tmp/keyfile.txt \
  zroot/en-varta

Das neue Dataset zroot/en-varta enthält jetzt dieselben Daten, verschlüsselt mit AES-256-GCM:

zfs list zroot/varta zroot/en-varta
NAME             USED  AVAIL     REFER  MOUNTPOINT
zroot/en-varta   100M  11.8G      100M  /zroot/en-varta
zroot/varta      100M  11.8G      100M  /zroot/varta

Aufräumen

Die Keyfile-Referenz auf Passphrase-Abfrage umstellen und die temporäre Datei löschen:

zfs set keylocation=prompt zroot/en-varta

zfs get keylocation zroot/en-varta
NAME            PROPERTY     VALUE   SOURCE
zroot/en-varta  keylocation  prompt  local

rm /tmp/keyfile.txt

Dann das alte Dataset entfernen und das neue umbenennen:

zfs destroy -r zroot/varta
zfs rename zroot/en-varta zroot/varta

Fertig. Das Dataset liegt jetzt verschlüsselt am selben Mountpoint wie vorher:

zfs get encryption,keylocation,keyformat zroot/varta
NAME         PROPERTY     VALUE        SOURCE
zroot/varta  encryption   aes-256-gcm  -
zroot/varta  keylocation  prompt       local
zroot/varta  keyformat    passphrase   -

Hinweise

Bei Jails: Jail vorher stoppen, nach der Migration den Mountpoint anpassen falls nötig (zfs set mountpoint=...), dann neu starten. Bei großen Datasets dauert der zfs send | zfs receive entsprechend lange. Ein Test mit einem kleinen Dataset vorher schadet nicht.

Eine Übersicht über alle ZFS-Funktionen gibt es im ZFS-Überblick. Fragen? Einfach melden.

TRIM für SSDs im ZFS-Pool unter Linux aktivieren

Speicherzellen einer SSD sind nicht unendlich beschreibbar. Damit sie möglichst lange halten, verteilt die interne Logik der SSD Schreibzugriffe gleichmäßig über alle Bereiche — Wear Leveling. Dafür muss die SSD aber wissen, welche Blöcke wirklich frei sind. Diese Information kann sie nur vom Dateisystem bekommen. Genau dafür gibt es TRIM.

Wer sich für TRIM allgemein interessiert — im älteren Beitrag zu TRIM für SSDs und Flash-Speicher steht mehr zu den Grundlagen. Hier geht es nur um ZFS.

autotrim — kontinuierliches TRIM

ZFS kennt die Pool-Eigenschaft autotrim. Wenn aktiviert, schickt ZFS nach jedem Freigeben von Blöcken automatisch TRIM-Befehle an die darunterliegenden Geräte. Prüfen, ob es aktiv ist:

$ zpool get autotrim bpool rpool
NAME   PROPERTY  VALUE  SOURCE
bpool  autotrim  off    local
rpool  autotrim  off    local

Aktivieren:

$ zpool set autotrim=on bpool
$ zpool set autotrim=on rpool

Kontrolle — jetzt sollte on stehen:

$ zpool get autotrim bpool rpool
NAME   PROPERTY  VALUE  SOURCE
bpool  autotrim  on     local
rpool  autotrim  on     local

zpool trim — manuelles TRIM

Neben dem kontinuierlichen autotrim gibt es auch manuelles TRIM. Das ist sinnvoll, wenn man autotrim bisher nicht aktiviert hatte und den Pool einmalig aufräumen will:

$ zpool trim rpool

Der Fortschritt lässt sich mit zpool status -t rpool beobachten. Bei großen Pools kann das eine Weile dauern.

Tipp: SSD-Wartungsmodus

Wenn eine SSD nur am Strom hängt, ohne dass ein Rechner darauf zugreift, fallen viele SSDs in einen internen Wartungs- und Reparaturmodus. Die Firmware sortiert dann selbstständig Speicherzellen um, führt Diagnosen durch und versucht schwache Zellen zu retten. Einfach 2–3 Stunden laufen lassen. Über diesen Weg lassen sich manchmal sogar „tote“ SSDs wiederbeleben. Mit aktivem TRIM funktioniert das alles natürlich deutlich besser.

Hinweis für FreeBSD: autotrim und zpool trim funktionieren dort genauso — FreeBSD nutzt seit langem OpenZFS.

Fragen? Einfach melden.

Linux Mint mit verschlüsseltem ZFS-Root-Pool installieren

ZFS als Root-Dateisystem unter Linux — will man haben. Verschlüsselung auf der Festplatte — will man auch haben. Die Kombination aus beidem war unter Linux lange ein manueller Kraftakt. Seit Linux Mint 20 bringt der Installer aber fast alles mit. Man muss ihm nur an zwei Stellen unter die Arme greifen.

Linux Mint Boot-Bildschirm: ZFS-Pool-Passwortabfrage nach erfolgreicher Verschluesselung.

Hinweis: Diese Anleitung wurde mit Linux Mint 20.1 geschrieben, funktioniert aber genauso mit Mint 21.x und 22.x — der Installer nutzt das gleiche zsys-setup-Skript.

Pakete im Live-System nachinstallieren

Die gewünschte Linux Mint ISO herunterladen und davon booten. Im Live-System ein Terminal öffnen und die ZFS-Pakete installieren:

sudo aptitude -y install libzfs2linux zfs-initramfs zfsutils-linux zfs-zed

Wer nur ZFS ohne Verschlüsselung will, ist damit schon fertig. Einfach den Installer starten, bei der Festplattenauswahl auf Advanced features… klicken und EXPERIMENTAL: Erase disk and use ZFS wählen. Für Verschlüsselung weiter lesen.

Installer-Skript für Verschlüsselung anpassen

Der Installer fragt kein Passwort für die ZFS-Verschlüsselung ab — das muss man ihm vorher ins Skript schreiben. Im Terminal:

sudo vi /usr/share/ubiquity/zsys-setup

Nach zpool create suchen — es taucht zweimal auf. Beim rpool (nicht beim bpool) zwei Änderungen vornehmen:

1. Vor die zpool create-Zeile des rpool ein echo mit dem gewünschten Passwort setzen:

echo 'EUER-PASSWORT' | zpool create -f \

2. Vor die Zeile -O mountpoint=/ -R "${target}" rpool "${partrpool}" die Encryption-Optionen einfügen:

-O encryption=aes-256-gcm \
-O keylocation=prompt \
-O keyformat=passphrase \

Das fertige Ergebnis sieht dann so aus:

echo 'Kennwort!' | zpool create -f \
        -o ashift=12 \
        -O compression=lz4 \
        -O acltype=posixacl \
        -O xattr=sa \
        -O relatime=on \
        -O normalization=formD \
        -O mountpoint=/ \
        -O canmount=off \
        -O dnodesize=auto \
        -O sync=disabled \
        -O encryption=aes-256-gcm \
        -O keylocation=prompt \
        -O keyformat=passphrase \
        -O mountpoint=/ -R "${target}" rpool "${partrpool}"

Sicherheitshinweis: Das Passwort steht kurzzeitig im Klartext in der Datei und in der Bash-History. Im Live-System ist das unkritisch — nach dem Reboot ins installierte System ist das Live-System weg. Trotzdem nicht das Produktivpasswort in Screenshots posten.

Jetzt den Installer starten, ZFS als Dateisystem wählen — fertig. Funktioniert mit EFI und Legacy-Boot.

Verschlüsselung prüfen

Nach dem ersten Boot ins neue System — Terminal öffnen und prüfen, ob die ZFS-Verschlüsselung aktiv ist und sich durch den Pool bis zu den Benutzerdaten vererbt hat:

$ zpool get feature@encryption bpool rpool
NAME   PROPERTY            VALUE     SOURCE
bpool  feature@encryption  disabled  local
rpool  feature@encryption  active    local

$ zfs get encryption rpool/USERDATA/test_9d9i92
NAME                        PROPERTY    VALUE        SOURCE
rpool/USERDATA/test_9d9i92  encryption  aes-256-gcm  -

feature@encryption: active beim rpool und aes-256-gcm auf den Benutzerdaten — alles korrekt. Der bpool (Boot-Pool) bleibt unverschlüsselt — GRUB muss den Kernel lesen können, bevor das Passwort eingegeben wird.

Wer seine SSDs im ZFS-Pool auch gleich mit TRIM versorgen will — das ist in einem separaten Beitrag beschrieben.


Bilder von der Installation zum Durchklicken:

Siehe auch: ZFS Encryption

Fragen? Einfach melden.

FreeBSD: Native ZFS Encryption einrichten und nutzen

Seit FreeBSD 13 steht native ZFS Encryption zur Verfügung. Datasets lassen sich mit AES-256-GCM verschlüsseln, ohne dass der gesamte Pool verschlüsselt sein muss. Die Verschlüsselung greift pro Dataset und vererbt sich auf Kind-Datasets.

Verschlüsseltes Dataset anlegen

Ein neues Dataset mit Passphrase-Abfrage:

zfs create -o encryption=aes-256-gcm -o keyformat=passphrase usbpool/test01
Enter passphrase:
Re-enter passphrase:

Das Dataset wird sofort gemountet und ist einsatzbereit. Alles was hineingeschrieben wird, liegt verschlüsselt auf der Platte:

zfs list usbpool/test01
NAME             USED  AVAIL     REFER  MOUNTPOINT
usbpool/test01    99K   899G       99K  /usbpool/test01

zfs get encryption usbpool/test01
NAME            PROPERTY    VALUE        SOURCE
usbpool/test01  encryption  aes-256-gcm  -

Nach einem Reboot

Bei einem Passphrase-geschützten Dataset hat ZFS nach einem Reboot den Schlüssel nicht mehr. Das Dataset existiert, ist aber nicht gemountet:

zfs get mounted usbpool/test01
NAME            PROPERTY  VALUE    SOURCE
usbpool/test01  mounted   no       -

Mit zfs mount -l wird der Schlüssel geladen und das Dataset eingehängt:

zfs mount -l usbpool/test01
Enter passphrase for 'usbpool/test01':

zfs get mounted usbpool/test01
NAME            PROPERTY  VALUE    SOURCE
usbpool/test01  mounted   yes      -

Keyfile statt Passphrase

Statt einer Passphrase-Abfrage kann der Schlüssel auch in einer Datei liegen. Praktisch für Server die ohne Interaktion booten sollen:

zfs create -o encryption=aes-256-gcm \
  -o keyformat=passphrase \
  -o keylocation=file:///root/keys/pool.key \
  zroot/encrypted-data

Die Key-Datei enthält das Passphrase als Text. Wichtig: Die Datei muss beim Boot erreichbar sein, also auf einem unverschlüsselten Dataset liegen. Berechtigungen auf 0400 setzen.

Bestehende Datasets verschlüsseln

Verschlüsselung lässt sich nicht nachträglich auf ein bestehendes Dataset aktivieren. Man muss die Daten per zfs send | zfs receive in ein neues, verschlüsseltes Dataset migrieren. Die komplette Anleitung dafür steht im Beitrag ZFS-Dataset nachträglich verschlüsseln.

Eine Übersicht über alle ZFS-Funktionen gibt es im ZFS-Überblick. Wer sich für ZFS Encryption unter Solaris/OpenIndiana interessiert, findet die Anleitung unter ZFS Encryption unter Solaris. Fragen? Einfach melden.

FreeBSD Jail Upgrade: Wenn freebsd-update die Version nicht erkennt

FreeBSD-Jails lassen sich mit freebsd-update genauso upgraden wie das Host-System. Der Parameter -b gibt den Pfad zur Jail an:

# Normales Jail-Upgrade
freebsd-update -r 14.2-RELEASE upgrade -b /zroot/jails/myjail
freebsd-update install -b /zroot/jails/myjail
service jail restart myjail
freebsd-update install -b /zroot/jails/myjail
# Pakete aktualisieren
jexec myjail pkg upgrade
freebsd-update install -b /zroot/jails/myjail

Das Problem: Falsche Versionserkennung

Manchmal ist freebsd-update davon überzeugt, dass die Jail bereits auf der Zielversion läuft, obwohl sie es nicht ist. Prüft man manuell, steht da noch die alte Version:

jexec myjail freebsd-version
13.2-RELEASE-p9

Das passiert typischerweise wenn die Jail schon Patches bekommen hat oder wenn der Host auf einer anderen Version läuft als die Jail. freebsd-update liest die Version aus Dateien im Jail-Dateisystem und kommt durcheinander.

Die Lösung: –currently-running

Mit --currently-running gibt man freebsd-update die aktuelle Version explizit vor:

freebsd-update -b /zroot/jails/myjail --currently-running 13.2-RELEASE-p9 -r 14.2-RELEASE upgrade

Danach läuft das Upgrade normal durch. Die Version, die man bei --currently-running angibt, muss exakt der Ausgabe von freebsd-version in der Jail entsprechen, inklusive Patchlevel.

Tipp: Vor dem Upgrade einen ZFS-Snapshot der Jail anlegen. Falls etwas schiefgeht, ist ein Rollback in Sekunden erledigt.

Fragen? Einfach melden.

bhyve und vm-bhyve: Windows-VM auf FreeBSD einrichten

FreeBSD bringt seit Version 10.0 einen eigenen Typ-2-Hypervisor mit: bhyve. Für den täglichen Umgang empfiehlt sich vm-bhyve als Verwaltungstool — damit lässt sich eine Windows-VM in wenigen Minuten einrichten, ohne sich mit den bhyve-Basistools herumschlagen zu müssen.

vm-bhyve installieren und einrichten

# Installation
pkg install vm-bhyve grub2-bhyve uefi-edk2-bhyve

# ZFS-Dataset für VMs anlegen
zfs create pool/vm

# Autostart aktivieren
sysrc vm_enable="YES"
sysrc vm_dir="zfs:pool/vm"

# Initialisieren und Templates kopieren
vm init
cp /usr/local/share/examples/vm-bhyve/* /pool/vm/.templates/

# Netzwerk-Switch erstellen und physisches Interface anhängen
vm switch create public
vm switch add public em0

Windows-VM erstellen

ISO-Dateien importieren — die Windows-ISO und die virtio-Treiber für die Netzwerkkarte:

# Windows-ISO importieren
vm iso /home/kernel/Download/win10.iso

# virtio-net Treiber (für die Netzwerkkarte in der VM)
fetch https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
vm iso /home/kernel/Download/virtio-win.iso

VM aus dem mitgelieferten Windows-Template erstellen:

vm create -t windows -s 200G win10

VM-Konfiguration anpassen

Das Windows-Template kommt mit 2 CPUs und 2 GB RAM. Für eine brauchbare Windows-VM besser anpassen:

vm configure win10
uefi="yes"
cpu=4
memory=8G
graphics="yes"
graphics_port="5999"
graphics_listen="127.0.0.1"
graphics_res="1280x1024"
graphics_wait="auto"
xhci_mouse="yes"
network0_type="virtio-net"
network0_switch="public"
disk0_type="ahci-hd"
disk0_name="disk0.img"

Die wichtigsten Optionen: graphics="yes" aktiviert einen VNC-Server für die Grafikausgabe, xhci_mouse="yes" sorgt für eine brauchbare Maus in der VM, network0_type="virtio-net" nutzt den schnelleren paravirtualisierten Netzwerktreiber statt einer emulierten Karte.

Installation und Zugriff

# VM starten und ISO einlegen
vm install win10 win10.iso

Dann mit einem VNC-Viewer auf 127.0.0.1:5999 verbinden und Windows installieren. Nach der Installation die virtio-Treiber-ISO einlegen (vm install win10 virtio-win.iso) und Windows die Netzwerktreiber dort suchen lassen.

Für den täglichen Zugriff RDP in der VM aktivieren — dann braucht man den VNC-Viewer nur noch für die Ersteinrichtung.

VM verwalten

# Laufende VMs anzeigen
vm list
NAME   DATASTORE  LOADER  CPU  MEMORY  VNC  AUTOSTART  STATE
win10  default    uefi    4    8G      -    No         Running (10638)

# VM stoppen / starten
vm stop win10
vm start win10

# Snapshot erstellen (ZFS-Snapshot der VM-Disk)
vm snapshot win10

Details und weitere Optionen im vm-bhyve Wiki. Fragen? Einfach melden.

ioping: Read- und Write-Latency schnell messen

Für ausführliche Storage-Benchmarks gibt es Tools wie bonnie++ oder fio. Wenn man nur schnell die Read- oder Write-Latency eines Dateisystems prüfen will, reicht ioping — ein einzelner Befehl, Ergebnis in Sekunden.

Installation

# FreeBSD
pkg install ioping

# Debian/Ubuntu
apt install ioping

Read-Latency messen

ioping -s 256k -T 120 -D -c 20 ./
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=1 time=16.0 us (warmup)
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=2 time=35.7 us
256 KiB <<< ./ (zfs tanksmeer/usr/home): request=3 time=45.8 us
...

--- ./ (zfs tanksmeer/usr/home) ioping statistics ---
19 requests completed in 853.7 us, 4.75 MiB read, 22.3 k iops, 5.43 GiB/s
generated 20 requests in 19.0 s, 5 MiB, 1 iops, 269.2 KiB/s
min/avg/max/mdev = 35.7 us / 44.9 us / 52.8 us / 3.85 us

Die Parameter im Detail:

  • -s 256k — Blockgröße pro Request (hier 256 KiB)
  • -T 120 — Timeout in Sekunden, Requests die länger brauchen werden ignoriert
  • -D — Direct I/O, umgeht den Kernel-Cache (misst die echte Disk-Latency)
  • -c 20 — Anzahl der Requests
  • ./ — Pfad zum Dateisystem das gemessen werden soll

Die Summary am Ende zeigt min/avg/max/mdev — genau wie bei ping. Hier: durchschnittlich 44,9 µs Read-Latency auf einem ZFS-Dataset.

Write-Latency messen

Für die Write-Latency kommt ein einziger Parameter dazu — -W:

ioping -s 256k -T 120 -D -W -c 20 ./
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=1 time=27.0 us (warmup)
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=2 time=54.4 us
256 KiB >>> ./ (zfs tanksmeer/usr/home): request=3 time=60.6 us
...

--- ./ (zfs tanksmeer/usr/home) ioping statistics ---
19 requests completed in 3.86 ms, 4.75 MiB written, 4.93 k iops, 1.20 GiB/s
generated 20 requests in 19.0 s, 5 MiB, 1 iops, 269.5 KiB/s
min/avg/max/mdev = 51.6 us / 202.9 us / 2.65 ms / 577.9 us

Write ist hier erwartungsgemäß langsamer — 202,9 µs im Schnitt gegenüber 44,9 µs beim Lesen. Die höhere Standardabweichung (577,9 µs vs. 3,85 µs) zeigt, dass einzelne Writes deutlich länger dauern können (hier ein Ausreißer mit 2,65 ms — vermutlich ein ZFS Transaction Group Commit).

Weitere nützliche Optionen

# Fortlaufend messen (wie ping ohne -c)
ioping -D ./

# Nur die Summary nach 10 Requests
ioping -D -c 10 -q ./

# Bestimmte Blockgröße (4k für Random I/O)
ioping -s 4k -D -c 20 ./

# Netzlaufwerk / NFS-Mount testen
ioping -D -c 20 /mnt/nfs-share/

Praktisch für einen schnellen Vergleich: Lokale SSD, NFS-Share und USB-Platte mit dem gleichen Befehl messen — die Unterschiede werden sofort sichtbar. Fragen? Einfach melden.

ZFS send/recv: „Cannot receive incremental stream“ beheben

Inkrementelle Replikation mit ZFS

Mit zfs send und zfs recv lassen sich Datasets über SSH auf ein anderes System replizieren. Das Schöne daran: Nach einem initialen Vollabgleich muss man nur noch die Differenz zwischen zwei Snapshots übertragen. Bei großen Datasets spart das enorm Bandbreite und Zeit.

Beispiel: Eine FreeBSD Jail mit 100 GB Mediadaten. Wöchentliche Snapshots werden automatisch erstellt. Der initiale Transfer:

zfs send zroot/jails/subsonic@weekly-2017-03-12 | ssh zfsrecv@system02 zfs recv zroot/backup/subsonic

Ab jetzt nur noch das Delta zum nächsten Snapshot:

zfs send -i zroot/jails/subsonic@weekly-2017-03-12 zroot/jails/subsonic@weekly-2017-03-19 \
  | ssh zfsrecv@system02 zfs recv zroot/backup/subsonic

Der Fehler

Das funktioniert nur, solange das Ziel-Dataset seit dem letzten Snapshot nicht verändert wurde. Jede Änderung — und sei es nur ein Update der Access-Time (atime) durch einen Lesezugriff — reicht aus, damit ZFS den inkrementellen Stream ablehnt:

cannot receive incremental stream: destination zroot/backup/subsonic has been modified
since most recent snapshot
warning: cannot send 'zroot/jails/subsonic@weekly-2017-03-19': signal received

ZFS sagt damit: Zwischen dem letzten gemeinsamen Snapshot und jetzt hat sich am Ziel etwas geändert. Das Delta passt nicht mehr.

Lösung und Prävention

Man muss nicht alles neu übertragen. Mit -F weist man zfs recv an, das Ziel-Dataset auf den letzten gemeinsamen Snapshot zurückzurollen und dann das Delta anzuwenden:

zfs send -i zroot/jails/subsonic@weekly-2017-03-12 zroot/jails/subsonic@weekly-2017-03-19 \
  | ssh zfsrecv@system02 zfs recv -F zroot/backup/subsonic

Damit das Problem gar nicht erst auftritt, setzt man das Ziel-Dataset auf readonly:

zfs set readonly=on zroot/backup/subsonic

So kann nichts am Ziel verändert werden — kein atime-Update, kein versehentliches Schreiben. Das -F im Skript schadet trotzdem nicht als Sicherheitsnetz. Und nicht vergessen: Auf dem Zielsystem regelmäßig alte Snapshots aufräumen, sonst wächst der Plattenverbrauch stetig.

Mehr Details in der OpenZFS-Dokumentation zu zfs send. Mehr zu ZFS: ZFS Compression und Deduplication und TRIM im ZFS-Pool aktivieren. Fragen? Einfach melden.

FreeBSD: Automatische ZFS-Snapshots mit zfs-auto-snapshot

Automatische Snapshots einrichten

Auf FreeBSD gibt es mehrere Wege, ZFS-Snapshots zu automatisieren. Ein bewährtes Tool ist zfs-auto-snapshot aus den Ports (sysutils/zfstools). Es orientiert sich an der Snapshot-Automatisierung von Solaris/OpenSolaris und kann auch konsistente Snapshots einer MySQL- oder PostgreSQL-Datenbank erstellen.

Hinweis: Seit FreeBSD 13 gibt es mit periodic(8) und dem ZFS-Periodic-Script eine eingebaute Alternative, die ohne zusätzliche Pakete auskommt. Für ältere Systeme oder mehr Kontrolle über die Retention bleibt zfstools eine gute Wahl.

Installation:

pkg install zfstools

Danach die Cronjobs in /etc/crontab eintragen:

# ZFS snapshots
15,30,45 * * * * root /usr/local/sbin/zfs-auto-snapshot frequent  4
0        * * * * root /usr/local/sbin/zfs-auto-snapshot hourly   24
7        0 * * * root /usr/local/sbin/zfs-auto-snapshot daily     7
14       0 * * 7 root /usr/local/sbin/zfs-auto-snapshot weekly    4
28       0 1 * * root /usr/local/sbin/zfs-auto-snapshot monthly  12

Falls zfs im Cronjob nicht gefunden wird, die PATH-Variable in der Crontab erweitern:

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin

Jetzt noch die Snapshots für das gewünschte Dataset aktivieren:

zfs set com.sun:auto-snapshot=true zroot/usr/home

Retention-Schema

Mit der Crontab oben werden folgende Snapshots vorgehalten:

  • Alle 15 Minuten — 4 Snapshots vorgehalten
  • Stündlich — 24 Snapshots vorgehalten
  • Täglich — 7 Snapshots vorgehalten
  • Wöchentlich — 4 Snapshots vorgehalten
  • Monatlich — 12 Snapshots vorgehalten

Snapshots prüfen

zfs list -r -H -t snapshot zroot/usr/home
zroot/usr/home@zfs-auto-snap_hourly-2016-05-19-11h00     21,5M  -  82,5G  -
zroot/usr/home@zfs-auto-snap_frequent-2016-05-19-11h30   14,6M  -  82,6G  -
zroot/usr/home@zfs-auto-snap_frequent-2016-05-19-11h45   13,3M  -  82,6G  -
zroot/usr/home@zfs-auto-snap_hourly-2016-05-19-12h00     14,0M  -  82,7G  -

Datenbank-Snapshots

Für konsistente Datenbank-Snapshots muss das Property auf dem Datenbank-Dataset speziell gesetzt werden — zfs-auto-snapshot friert die Datenbank dann vor dem Snapshot kurz ein:

# PostgreSQL
zfs set com.sun:auto-snapshot=postgresql zroot/data/postgres

# MySQL/MariaDB
zfs set com.sun:auto-snapshot=mysql zroot/data/mysql

Wichtig: Snapshots auf demselben System sind kein Backup-Ersatz. Geht die Platte kaputt, sind die Snapshots mit weg. Für eine echte Sicherung die Snapshots per zfs send/recv auf ein zweites System replizieren.

Mehr zu ZFS: ZFS Compression und Deduplication. Details zu allen Snapshot-Optionen in der OpenZFS-Dokumentation. Fragen? Einfach melden.

FreeBSD auf dem Desktop: Grundinstallation mit MATE

Nach der Grundinstallation von FreeBSD hängt man auf der Konsole. Kein Fenstermanager, kein Browser, keine grafische Oberfläche. Für Serverleute normal, für Desktopnutzer erstmal irritierend. Hier die Schritte von der nackten FreeBSD-Installation zu einem funktionierenden MATE-Desktop mit deutschem Layout.

Screenshot vom FreeBSD Desktop

Pakete installieren

Ein Einzeiler holt alles was man für den Anfang braucht. MATE als Desktop, Xorg als Display-Server, LightDM als Login-Manager und die üblichen Anwendungen:

pkg install xorg mate mate-desktop lightdm lightdm-gtk-greeter \
  firefox thunderbird pidgin vlc libreoffice gimp \
  de-aspell de-hunspell cups cups-pdf sudo

rc.conf anpassen

In der /etc/rc.conf die nötigen Dienste aktivieren:

# Deutsche Konsolenschriftarten
font8x8="iso15-8x8"
font8x14="iso15-8x14"
font8x16="iso15-8x16"

# D-Bus für den Desktop
dbus_enable="YES"

# Grafischer Login
lightdm_enable="YES"

# Drucken über CUPS
cupsd_enable="YES"
lpd_enable="NO"

# Temp-Verzeichnisse aufräumen
clear_tmp_enable="YES"
clean_tmp_X="YES"

# Erweiterte Device-Regeln aktivieren
devfs_system_ruleset="devfsrules_common"

Deutsche Locale

FreeBSD setzt Sprache und Zeichensatz über Login-Klassen. In der /etc/login.conf eine neue Klasse anlegen:

german|German Users Accounts:\
      :charset=UTF-8:\
      :lang=de_DE.UTF-8:\
      :tc=default:

Danach die Login-Datenbank neu bauen und dem Benutzer die Klasse zuweisen:

cap_mkdb /etc/login.conf

In vipw die Klasse german im fünften Feld eintragen:

kernel:*:1001:1001:german:0:0:Sebastian:/home/kernel:/usr/local/bin/fish

Xorg: Deutsches Tastaturlayout

Datei /usr/local/etc/X11/xorg.conf.d/keyboard-de-nodeadkeys.conf anlegen:

Section "InputClass"
    Identifier  "KeyboardDefaults"
    Driver      "keyboard"
    MatchIsKeyboard "on"
    Option      "XkbLayout" "de"
    Option      "XkbVariant" "nodeadkeys"
EndSection

Hardware-Berechtigungen

Normale Benutzer brauchen Zugriff auf Laufwerke, USB-Geräte und Soundkarten. Die /etc/devfs.rules regelt das. Wer das Thema im Detail verstehen will: Im Beitrag zu CD/DVD-Brenner-Berechtigungen unter FreeBSD ist das ausführlicher erklärt.

[devfsrules_common=7]
add path 'ada[0-9]\*'   mode 666
add path 'da[0-9]\*'    mode 666
add path 'cd[0-9]\*'    mode 666
add path 'pass[0-9]\*'  mode 666
add path 'xpt[0-9]\*'   mode 666
add path 'ugen[0-9]\*'  mode 666
add path 'usb/\*'       mode 666
add path 'video[0-9]\*' mode 666
add path 'mmcsd[0-9]\*' mode 666
add path 'lpt[0-9]\*'   mode 666
add path 'ulpt[0-9]\*'  mode 666

sudo und wheel-Gruppe

Den Benutzer in die Gruppe wheel aufnehmen und per visudo die sudo-Berechtigung setzen:

pw groupmod wheel -m kernel
# visudo
root   ALL=(ALL) ALL
kernel ALL=(ALL) ALL

loader.conf: Kernel-Module

In der /boot/loader.conf ein paar Module die auf einem Desktop sinnvoll sind:

# Neuer Grafik-Konsolentreiber
kern.vty=vt

# Kernel-Tuning
kern.ipc.shmseg=1024
kern.ipc.shmmni=1024
kern.maxproc=10000

# SD-Kartenleser
mmc_load="YES"
mmcsd_load="YES"
sdhci_load="YES"

# FUSE (Dateisysteme im Userspace, z.B. NTFS)
fuse_load="YES"

# CPU-Temperatursensoren (Intel)
coretemp_load="YES"

# tmpfs und asynchrone I/O
tmpfs_load="YES"
aio_load="YES"

# Unicode auf Wechselmedien
libiconv_load="YES"
libmchain_load="YES"
cd9660_iconv_load="YES"
msdosfs_iconv_load="YES"

# Sound
snd_driver_load="YES"

# Linux-Kompatibilität
linux_load="YES"

# ZFS ARC begrenzen (hier 2 GB, an RAM anpassen)
vfs.zfs.arc_max="2048M"

Die vfs.zfs.arc_max Einstellung ist wichtig. ZFS nutzt standardmäßig so viel RAM wie verfügbar für den Dateisystem-Cache. Auf einem Desktop mit 8 GB will man das begrenzen, damit für Anwendungen genug übrig bleibt.

Fertig

Nach einem Neustart sollte LightDM den grafischen Login zeigen. MATE als Session auswählen, anmelden, fertig. Firefox, Thunderbird, LibreOffice und der Rest sind installiert und startbereit.

FreeBSD auf dem Desktop ist nicht so komfortabel wie ein Ubuntu. Dafür hat man ein sauberes ZFS, ein durchdachtes System und eine Dokumentation die ihresgleichen sucht. Wer sich darauf einlässt, wird es mögen.

Fragen? Einfach melden.

« Ältere Beiträge

© 2026 -=Kernel-Error=-RSS

Theme von Anders NorénHoch ↑