- Wenn man ein einfaches NAS ohne GUI braucht, reicht die Kombination aus einem ZFS-Dataset und einer Freigabe per Samba aus, um einen ausreichend schlanken Netzwerkspeicher aufzubauen.
- Die Beispielumgebung nutzt Debian 12 Bookworm, OpenZFS zfs-2.1.1, RAIDZ1, 16 GB ECC-RDIMM-RAM und 4×4-TB-NVMe-SSDs; Verschlüsselung und Backup-Strategie sind nicht Teil dieses Umfangs.
- ZFS speichert Pool- und Dateisystemkonfiguration auf den Datenträgern selbst, sodass sich die Daten auch dann auf einem anderen Rechner per
zfs import wieder einbinden lassen, wenn das OS ausfällt.
- Datenträger sollten besser über
/dev/disk/by-id oder Aliase in /etc/zfs/vdev_id.conf angegeben werden als über reihenfolgeabhängige Namen wie /dev/nvme1.
- Die eigentliche Netzwerkfreigabe übernimmt Samba; normale Dokumentfreigaben und macOS-Time Machine-Freigaben werden dabei in die Datasets
docs und backups getrennt.
Umfang eines selbstgebauten Minimal-NAS
- Das Ziel ist, ein einfaches NAS selbst aufzubauen, ohne voll ausgestattete NAS-Produkte wie Synology, QNAP oder TrueNAS.
- Die Beispielkonfiguration ist auf folgenden Umfang begrenzt:
- RAID-Level: RAIDZ1, Ausfall eines Laufwerks tolerierbar
- Betriebssystem: Debian 12 Bookworm
- Verschlüsselung: keine
- ZFS-Implementierung: OpenZFS, zfs-2.1.1
- CPU: 4 Kerne, günstige Xeon-Server-CPU möglich
- RAM: 16 GB ECC-RDIMM-RAM
- Speicher: 4×4-TB-NVMe-SSD
- Backup: wird nicht behandelt und erfordert eine separate Konfiguration
- TrueNAS ist eher mit einer voll ausgestatteten Software-Suite auf Enterprise-Niveau vergleichbar; je einfacher die benötigten Funktionen sind, desto größer wird die Diskrepanz zwischen bereitgestellten Funktionen und Anforderungen.
- Mit einer Eigenkonfiguration kann man die einzelnen Bestandteile des Systems verstehen und ist nicht auf eine weitere Software-Suite angewiesen.
Von ZFS auf den Datenträgern gespeicherte Konfigurationsinformationen
- Das ZFS-Dateisystem ist selbstenthaltend; selbst wenn das Host-OS beschädigt wird, lassen sich die Daten wiederherstellen, solange die Datenträger intakt sind.
- Verbindet man die Datenträger mit einem neuen Rechner oder einem neuen OS, installiert das
zfs-Werkzeug und führt danach zfs import aus, kann der bestehende Pool importiert werden.
- Konfiguration und Details von ZFS werden auf den Datenträgern selbst gespeichert.
- Wenn man zum Beispiel ein RAIDZ2 aus 6 Datenträgern aufgebaut hat, wird es auch dann wieder als RAIDZ2 erkannt, wenn man die Datenträger auf einen neuen Rechner mit installiertem ZFS-Werkzeug umzieht und nur
zfs import ausführt.
- Selbst wenn es Probleme mit dem Host-OS oder dem Rechner gibt, bleiben die Daten erhalten, solange die Datenträger nicht beschädigt sind.
Datenträgererkennung und Alias-Konfiguration
- Auf einem Linux-Rechner lässt sich die Datenträgerliste mit
lsblk -d -o TRAN,NAME,TYPE,MODEL,SERIAL,SIZE prüfen.
- Im Beispiel werden vier Samsung SSD 990 PRO 4TB NVMe-Laufwerke verwendet.
- Jeder Datenträger hat unter
/dev/disk/by-id einen symbolischen Link zwischen seiner ID und dem Gerätenamen /dev/nvme....
- Definiert man Aliase in
/etc/zfs/vdev_id.conf, lassen sich lange Datenträger-IDs auf kurze Namen abbilden.
alias nvme0 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
alias nvme1 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
alias nvme2 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
alias nvme3 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
- Führt man
udevadm trigger aus oder startet neu, werden die Aliase angewendet.
- Ob sie angewendet wurden, lässt sich mit
ls -lh /dev/disk/by-vdev prüfen.
- Alias mapping ist optional; beim Erstellen eines zpool kann man auch direkt den vollständigen Pfad
/dev/disk/by-id/... verwenden.
- Gerätenamen wie
/dev/nvme1 oder /dev/nvme2 sollte man vermeiden, weil ihre Reihenfolge beim Einbau neuer Laufwerke nicht garantiert ist.
/etc/zfs/vdev_id.conf ist eine Komforteinstellung für die Erstellung des zpool; selbst wenn diese Datei bei einem OS-Schaden verloren geht, ist der ZFS-Pool selbst davon nicht betroffen.
zpool-Erstellung und Dataset-Konfiguration
- Im Beispiel wird mit vier NVMe-Laufwerken ein RAIDZ1-zpool erstellt, der wie RAID 5 den Ausfall eines Laufwerks toleriert.
- Wenn höhere Fehlertoleranz nötig ist, ist RAIDZ2, also eine RAID-6-Konfiguration, robuster.
- Für die ZFS-Installation wird auf die OpenZFS-Installationsdokumentation verwiesen; im Beispiel wird unter RHEL 9 etwa mit
dnf install zfs installiert.
- Beim Erstellen des zpool wird die Option
ashift=12 empfohlen.
- Viele Datenträger melden dem OS aus Kompatibilitätsgründen eine Sektorgröße von 512 KB.
- Große Datenträger wie die Samsung 990 Pro können eine Sektorgröße von 4 KB oder 8 KB haben.
ashift=12 steht für eine Sektorgröße von 4 KB und kann die Performance deutlich verbessern.
- Der Zeitpunkt der zpool-Erstellung ist die letzte Gelegenheit, diesen Wert zu setzen.
zpool create -o ashift=12 s16z1 raidz1 nvme0 nvme1 nvme2 nvme3
zpool status s16z1
zpool ist die Datenträgerabstraktion, zfs ist das Dateisystem.
- Wenn
zpool create ausgeführt wird, wird zugleich auch das ZFS-Dateisystem erstellt.
- Mit
zdb | grep ashift lässt sich prüfen, ob ashift: 12 gesetzt wurde.
- Vor der Freigabe werden Einhängepunkt und Komprimierung konfiguriert.
zfs set mountpoint=/mnt/s16z1 s16z1
zfs set compression=lz4 s16z1
- Unterhalb des Root-Datasets werden die Datasets
docs und backups erstellt.
zfs create s16z1/docs
zfs create s16z1/backups
docs wird für Dokumente verwendet, backups für Time-Machine-Backups.
- ZFS-Datasets bieten mehr Funktionen als einfache Ordner.
- Verwaltung von Eigenschaften pro Dataset
- Verschlüsselung
- Übertragung und Replikation
- Snapshots
- Für große Dateikategorien ist es sinnvoll, separate Datasets anzulegen.
- Wenn man zum Beispiel nur
docs auf einen Remote-Server sichern möchte, muss man nicht das gesamte Root-Dataset s16z1 übertragen.
Freigabekonto mit Samba anlegen
- Die Art der Netzwerk-Dateifreigabe ist unabhängig von ZFS; wichtig ist nur, dass ZFS auf dem Hostsystem eingehängt ist.
- Samba wird installiert.
apt install samba
- Es wird ein dedizierter UNIX-Benutzer
john für Samba angelegt und mit einem Passwort versehen.
useradd -m john
passwd john
- Mit
smbpasswd -a john wird der UNIX-Benutzer john dem Samba-Benutzer zugeordnet.
- Zugreifende Hosts können auf die Freigabe als
SYS\\john zugreifen.
- Mit
pdbedit -L -v john lässt sich prüfen, ob der Samba-Benutzer registriert wurde.
- Das Löschen eines Samba-Benutzers erfolgt mit
pdbedit -x -u john.
Normale Freigaben und Time-Machine-Freigaben
- Durch Bearbeiten von
/etc/samba/smb.conf werden die Freigaben docs und backups konfiguriert.
[docs]
path = /mnt/s16z1/docs
browseable = yes
read only = no
guest ok = no
valid users = john
create mask = 0755
[backups]
path = /mnt/s16z1/backups
read only = no
guest ok = no
inherit acls = yes
spotlight = yes
fruit:aapl = yes
fruit:time machine = yes
vfs objects = catia fruit streams_xattr
valid users = john
docs ist als SMB-Freigabe für allgemeine Zwecke konfiguriert.
backups enthält Eigenschaften für macOS Time Machine.
fruit:aapl = yes
fruit:time machine = yes
vfs objects = catia fruit streams_xattr
- Unter macOS wird die Freigabe im Finder mit
cmd+K und einem Pfad wie smb://10.0.0.6/docs oder smb://10.0.0.6/backups eingebunden.
- Auf Debian-basierten Systemen wird nach der Installation von
smbclient folgendermaßen getestet:
apt install smbclient
smbclient -U john //10.0.0.6/docs -c 'ls'
- Wenn
smb://10.0.0.6/backups eingebunden wird, erscheint die Freigabe unter macOS als Time-Machine-Freigabe.
- Nach dem Einbinden kann man die Freigabe unter macOS in Settings > General > Time Machine hinzufügen und damit Time-Machine-Backups starten.
Nicht enthaltene Punkte
- Die Konfiguration der Verschlüsselung ist nicht Teil dieses Verfahrens.
- Eine Backup-Strategie ist ebenfalls nicht enthalten.
- Die Replikationsfunktionen von ZFS-Datasets sollen später in einem separaten Beitrag erweitert werden.
1 Kommentare
Hacker-News-Kommentare
Preislich ist jetzt kein guter Zeitpunkt, um ein NAS aufzubauen, aber ich baue seit den letzten zwei Wochen eines. Ich nutze ein Jonsbo-N6-Gehäuse, und mit seinem SATA-Backplane für 8 Laufwerke und den Drive Bays ist es im Gegensatz zu früheren Jonsbo-Modellen ziemlich ordentlich.
Am Ende habe ich mich entschieden, vier 14TB WD Elements Desktop auszuschlachten; darin steckten WD140EDGZ, also heliumgefüllte Laufwerke. Sie waren ungefähr ein Drittel günstiger als vier 12TB WD Red Plus und die Leistung scheint ähnlich zu sein. Die Garantie ist klar ein Nachteil, aber wenn innerhalb der 2-jährigen Garantie etwas ausfällt, könnte ich sie wohl wieder in die externen Gehäuse zurückbauen.
Als Boot-Laufwerk habe ich eine gebrauchte 256GB M.2 SSD eingebaut, und es hat mich einiges an Mühe gekostet, LUKS, TPM-Schlüssel und Root-ZFS so zusammenzubringen, dass ein einzelner Laufwerksausfall den Bootvorgang nicht blockiert. Dabei habe ich viel über systemd-boot gelernt, und es wirkt deutlich vernünftiger als grub.
Ich hatte auch den Eindruck, dass es rund um ZFS viele Mythen und viel Cargo Cult gibt. Der Artikel erwähnt zum Beispiel ECC-RAM, aber dass er zwingend nötig sei, weil ZFS sonst beim Scrub den Pool zerstöre, ist eher ein Mythos, und dieses Jahr ist er besonders teuer. ZFS braucht auch nicht Unmengen an RAM, und L2ARC verbraucht ebenfalls nicht viel RAM.
Ich überlege noch, ob ich
dnodesize=autoaktiviert lassen soll; dazu gibt es einige Horrorgeschichten: https://github.com/openzfs/zfs/issues/11353. Und es ist schwer, einen Cloud-Storage-Anbieter zu finden, derzfs sendzu einem vernünftigen Preis unterstützt; Rsync.net hat die Mindestbestellung kürzlich auf 10TiB angehoben, was für meinen Anwendungsfall zu groß ist: https://www.rsync.net/products/zfsintro.htmlWenn es eine magische Alternative gäbe, würde ich fast lieber die wählen, bei der es überhaupt keine KI gibt, dafür aber Storage nur ein Zehntel der Preise aus der Zeit vor dem KI-Boom kostet.
Für die Redundanz verzichte ich bereits auf zwei Laufwerke, und das hat tatsächlich geholfen, als kürzlich zwei SSDs aus scheinbar derselben Charge kurz hintereinander gestorben sind. Aber wenn man zusätzlich noch den Rat befolgen soll, mindestens die Kapazität eines weiteren Laufwerks für Performance und Zuverlässigkeit freizuhalten, tut das bei den aktuellen Preisen ziemlich weh.
Nachdem ich https://words.filippo.io/frood/ und https://0pointer.net/blog/fitting-everything-together.html gelesen habe, schaue ich mir gerade an, einen Heimserver bzw. ein NAS mit mkosi/systemd aufzubauen. Es ist interessant zu sehen, wie unterschiedliche Setups dieses Problem lösen.
/bootverschlüsselt und gegen Manipulation geschützt, und hält das auch einem Evil-Maid-Angriff stand?Es ist ein Rabbit Hole, aber wenn das alles gelöst ist, wäre das wirklich spannend.
https://www.samsung.com/us/memory-storage/nvme-ssd/990-pro-p...
Dinge, die sich bei einem NAS als nützlich erwiesen haben: Installiert man avahi-daemon, kündigt Samba SMB/CIFS automatisch per DNS-SD gegenüber macOS- und Linux-Clients an.
Für die automatische Erkennung im Explorer von Clients mit deaktiviertem SMB 1.0 unter Windows 10 oder neuer reicht die Installation von wsdd2.
Linux-Hostnamen sind normalerweise kleingeschrieben, aber Samba veröffentlicht standardmäßig für NetBIOS und Avahi einen Namen, der mit einem Großbuchstaben beginnt. Wenn einen das stört, kann man in
/etc/avahi/avahi-daemon.confunter[server]host-name=somethingsetzen und in/etc/samba/smb.confunter[global]mdns name = mdnseintragen.Wenn es macOS-Clients gibt, ist es sinnvoll, in der Samba-Konfiguration vfs_fruit zu aktivieren: https://www.samba.org/samba/docs/current/man-html/vfs_fruit..... Das ist nicht nur aus Kompatibilitätsgründen nützlich, sondern vor allem, weil man mit
fruit:modellustige Icons in der Finder-Seitenleiste anzeigen lassen kann.Das Erzeugen von
.DS_Storekann man unterbinden: https://ryanoberto.github.io/blog/2015/04/01/disabling-the-c.... Vielleicht kann man mitfruit:resource = xattrFinder-Einstellungen auch in erweiterten Attributen speichern, ich habe das aber selbst nicht ausprobiert.macOS hat schon vor langer Zeit angekündigt, AFP durch SMB zu ersetzen, und in macOS 27 soll auch die AFP-Client-Unterstützung entfernt werden, aber die SMB-Client-Unterstützung von macOS ist immer noch ziemlich schlecht. Bis dahin werde ich neben Samba weiter auch Netatalk betreiben; Netatalk registriert sich ebenfalls bei Avahi, und macOS bevorzugt bezeichnenderweise AFP vor SMB, sodass Clients sich automatisch mit dem passenden Daemon verbinden.
homes-Verzeichnisses triggert bei mir irgendwie den inneren Zwangsneurotiker.Es wäre wohl passend, hier auch meinen Blogbeitrag zu verlinken, in dem ich ein solches NAS gebaut habe, allerdings mit den ziemlich anderen Technologien dm-integrity, mdadm, XFS. Als C/C++-Entwickler, der die OpenZFS-Entwicklung aus der Nähe verfolgt hat, machten mir aus Stabilitätssicht die anhaltenden Probleme Sorgen, die durch den Fokus auf riesige Features und durch SPL/den separaten Page-Cache entstehen
Statt der Bequemlichkeit von ZFS als Allzweckwerkzeug habe ich die anfänglichen Mühen in Kauf genommen, bin mit der Entscheidung jetzt aber sehr zufrieden
https://world-playground-deceit.net/blog/2025/06/nas-setup-l...
Beim Bau meines NAS bin ich zum gleichen Schluss gekommen. Als System reichte Nix, für RAID zfs, und für die Dienste, die ich ausführen wollte, war docker compose genug
https://www.splitbrain.org/blog/2025-08/03-diy_nas_on_nixos
Ich hatte die lauten, stromhungrigen Racks im Schrank satt, also wurde es am Ende ein All-in-One-Home-Server und Router
https://HomeFree.host
Ich zahle immer noch für Synology, weil bei einem Plattenausfall einfach das Tray herausgezogen, die Platte ersetzt, wieder eingeschoben und nur ein paar Widgets angeklickt werden müssen. Ich weiß dann, dass korrekt neu aufgebaut wird
Wenn eine Platte ausfällt, piept es, und die LED in der Nähe der betroffenen Platte leuchtet auf, sodass man auch weiß, was zu tun ist
So ein NAS wie im Artikel zu bauen ist einfach, aber langfristig ist das Risiko von Datenverlust viel höher
Und ich halte solche Anleitungen, die nicht behandeln, „wie man eine ausgefallene Platte 3 sicher ersetzt“, für unvollständig. Auch wenn nicht erklärt wird, wie man den Ausfall erkennt, sollte dieses Verfahren enthalten sein
Deshalb muss mdadm beim Austausch eines Laufwerks das gesamte Laufwerk neu erstellen, während ZFS nur die tatsächlich genutzten Daten neu erstellt
zpool replace my_pool disk3 newdiskEs gibt sicher Gründe, warum Leute ZFS und die Komponenten so weit treiben, die man üblicherweise „NAS“ nennt, aber ich kam auch gut damit zurecht, auf einer Linux-Maschine einfach eine einzelne große HDD mit ext4 mit einer strikt konfigurierten NFSv3-Freigabe zu betreiben
Es ist ohnehin mein Hauptsystem, das während meiner Wachzeit immer eingeschaltet ist, und so kann es mit dem Stromverbrauch und Overhead nur einer Maschine Dateien an andere Geräte bereitstellen
Ich versuche die Netzwerkkonfiguration grundsätzlich restriktiv zu halten, daher mache ich mir auch um die Sicherheitsaspekte eines Dienstes auf der Hauptmaschine nicht allzu viele Sorgen. Vielleicht begehe ich damit ein großes Verbrechen, aber reichen pures NFSv3 und Samba für die Kompatibilität wirklich nicht aus?
Der Hauptgrund, warum Leute ZFS und ein „NAS“ wählen, sind Prüfsummen und Schutz der Datenintegrität, und auch, dass sie ihre Hauptmaschine nicht ständig eingeschaltet lassen wollen
Funktionen wie Snapshots sind ebenfalls nützlich, weil sie die Sorge verringern, Daten durch versehentliches Löschen oder Überschreiben von Dateien zu verlieren
Ich finde es an sich nicht problematisch, eine 24/7 laufende Hauptmaschine als NAS zu verwenden. Man muss sich nicht zwanghaft extra etwas anschaffen, aber ich würde mir Sorgen um Zuverlässigkeit und Schutz vor Bitrot machen. Das passiert tatsächlich, und dank ZFS habe ich es selbst schon gesehen
Wenn du die Konfiguration einfach halten willst, könnte es sich lohnen, eine Liste von Dateihashes aufzubewahren und sie regelmäßig zu prüfen
Außerdem wäre ein Backup-Programm mit Snapshot-Unterstützung sinnvoll, und Restic ist dafür eine gute Wahl
Du könntest auch eine weitere Festplatte in derselben Größe wie die aktuelle kaufen und mit SnapRAID die Dateiintegrität verwalten oder mit btrfs ein 2-Platten-Mirror aufsetzen
Cockpit war für die Verwaltung von NAS und VPS sehr nützlich. Auch wenn die Konfiguration dank LLMs an sich kein großes Problem mehr ist, sind ein Dashboard mit Schaltern und übersichtliche Logs praktisch, und man kann sogar ohne SSH vom Handy aus Shell-Befehle ausführen
Auf einem NAS kann man die Ergebnisse von Backup-/Wartungs-cron-Jobs leicht ansehen, Samba verwalten und die Festplattennutzung überwachen. Gerade auf dem iPhone Samba ordentlich zum Laufen zu bringen, ist wirklich mühsam
Bei der Server-Authentifizierung neige ich dazu, lieber SSH auf dem Handy zu ermöglichen, statt auf etwas anderes als Public/Private Keys herunterzugehen. Da bin ich etwas verschwörungstheoretisch vorsichtig
Als ich früher mein eigenes NAS gebaut habe, habe ich auch diesen Artikel als Lernmaterial verwendet: https://xyny.art/blog/2026-building-nas/
Ein NAS von Grund auf zu bauen macht wirklich Spaß. Dass es kein „vollständiges Material“ gibt, das das ganze Thema lückenlos behandelt, ist zwar ein kleines Hindernis, aber zugleich auch Teil des Spaßes
Das Ziel meines Artikels ist ebenfalls eher, dem Internet noch einen weiteren voreingenommenen „Guide“ zur NAS-Konfiguration hinzuzufügen. Ich zögere, ihn überhaupt einen Guide zu nennen, aber wenn ich dasselbe noch einmal machen müsste, würde ich definitiv zuerst meinen eigenen Artikel lesen
Konzeptionell läuft dasselbe, aber statt Debian wird FreeBSD verwendet. Nicht unbedingt besser oder schlechter, sondern mit anderen Trade-offs, und am Ende funktioniert es genauso gut.
Beim Neuaufbau des NAS habe ich mich für NFS auf ZFS entschieden. Das Ziel unterscheidet sich aber etwas von dem des Autors. Ich habe eine stromsparende CPU bzw. ein stromsparendes Mainboard verwendet und zwei separate Systeme mit Failover aufgebaut, um eine Hochverfügbarkeitskonfiguration zu erhalten.
Ich habe dafür auch eigene Software geschrieben, die tatsächlich das Failover und die Datenreplikation übernimmt. In Tests pausieren Schreibvorgänge der Clients während des Failovers nur für ein paar Sekunden. Ich frage mich, ob Interesse an einem Artikel dazu bestünde.