1 points par GN⁺ 4 시간 전 | 1 commentaires | Partager sur WhatsApp
  • Pour un NAS de base qui n’a pas besoin d’interface graphique, créer des datasets ZFS et les partager avec Samba suffit à mettre en place un stockage réseau simple
  • L’environnement d’exemple est Debian 12 Bookworm, OpenZFS zfs-2.1.1, RAIDZ1, 16 Go de RAM ECC RDIMM et 4 SSD NVMe de 4 To ; le chiffrement et la stratégie de sauvegarde sont hors périmètre
  • ZFS stocke la configuration des pools et des systèmes de fichiers sur les disques ; même si l’OS tombe en panne, on peut récupérer les données sur une autre machine avec zfs import
  • Pour désigner les disques, il est plus sûr d’utiliser /dev/disk/by-id ou des alias dans /etc/zfs/vdev_id.conf plutôt que des noms dépendants de l’ordre comme /dev/nvme1
  • Le partage réseau proprement dit est assuré par Samba ; on sépare un partage de documents classique et un partage macOS Time Machine en deux datasets, docs et backups

Périmètre d’un NAS minimal fait maison

  • L’objectif est de construire soi-même un NAS de base, sans produit NAS complet comme Synology, QNAP ou TrueNAS
  • La configuration d’exemple se limite au périmètre suivant
    • Niveau RAID : RAIDZ1, tolérance à la panne d’un disque
    • Système d’exploitation : Debian 12 Bookworm
    • Chiffrement : aucun
    • Implémentation ZFS : OpenZFS, zfs-2.1.1
    • CPU : 4 cœurs, possibilité d’utiliser un CPU serveur Xeon peu coûteux
    • RAM : 16 Go de RAM ECC RDIMM
    • Stockage : 4 SSD NVMe de 4 To
    • Sauvegarde : non traitée, nécessite une configuration séparée
  • TrueNAS s’apparente davantage à une suite logicielle complète de niveau entreprise ; plus les besoins sont simples, plus le décalage entre les fonctionnalités fournies et les exigences devient important
  • En le configurant soi-même, on peut comprendre chaque élément du système et éviter de dépendre d’une autre suite logicielle

Informations de configuration stockées par ZFS sur les disques

  • Le système de fichiers ZFS est autoportant : même si l’OS hôte est endommagé, les données peuvent être récupérées tant que les disques sont intacts
  • Il suffit de connecter les disques à une nouvelle machine ou à un nouvel OS, d’installer les outils zfs, puis d’exécuter zfs import pour importer le pool existant
  • La configuration et les détails de ZFS sont stockés sur les disques eux-mêmes
    • Par exemple, si un RAIDZ2 a été constitué avec 6 disques, il suffit de déplacer ces disques vers une nouvelle machine équipée des outils ZFS et d’exécuter zfs import pour qu’ils apparaissent comme un RAIDZ2
  • Même en cas de problème avec l’OS hôte ou la machine, les données sont conservées si les disques n’ont pas été endommagés

Identification des disques et configuration des alias

  • Sur une machine Linux, la liste des disques se consulte avec lsblk -d -o TRAN,NAME,TYPE,MODEL,SERIAL,SIZE
  • L’exemple utilise 4 SSD NVMe Samsung SSD 990 PRO 4 To
  • Chaque disque dispose, sous /dev/disk/by-id, d’un lien symbolique associant son ID à un nom de périphérique /dev/nvme...
  • En définissant des alias dans /etc/zfs/vdev_id.conf, on peut mapper de longs ID de disque vers des noms courts
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
  • Les alias sont appliqués après exécution de udevadm trigger ou après redémarrage
  • On peut vérifier leur prise en compte avec ls -lh /dev/disk/by-vdev
  • Le mappage d’alias est optionnel ; lors de la création du zpool, on peut aussi écrire directement le chemin complet /dev/disk/by-id/...
  • Les noms de périphériques comme /dev/nvme1 ou /dev/nvme2 doivent être évités, car leur ordre n’est pas garanti lors de l’ajout d’un nouveau disque
  • /etc/zfs/vdev_id.conf est un réglage destiné à faciliter la création du zpool ; même si l’OS est endommagé et que ce fichier est perdu, le pool ZFS lui-même n’est pas affecté

Création du zpool et configuration des datasets

  • L’exemple crée un zpool RAIDZ1 avec 4 NVMe, tolérant la panne d’un disque comme en RAID 5
  • Si une tolérance aux pannes plus élevée est nécessaire, RAIDZ2, c’est-à-dire une configuration RAID 6, est plus résilient
  • Pour l’installation de ZFS, consulter la documentation d’installation d’OpenZFS ; à titre d’exemple, sur RHEL 9, on l’installe avec dnf install zfs
  • Lors de la création du zpool, l’option ashift=12 est recommandée
    • De nombreux disques déclarent à l’OS une taille de secteur de 512 Ko pour des raisons de compatibilité
    • Les disques de grande capacité comme le Samsung 990 Pro peuvent avoir une taille de secteur de 4 Ko ou 8 Ko
    • ashift=12 indique une taille de secteur de 4 Ko et peut améliorer fortement les performances
    • Le moment de la création du zpool est la dernière occasion de définir cette valeur
zpool create -o ashift=12 s16z1 raidz1 nvme0 nvme1 nvme2 nvme3
zpool status s16z1
  • zpool est l’abstraction des disques, tandis que zfs est le système de fichiers
  • L’exécution de zpool create crée également un système de fichiers ZFS
  • On peut vérifier que ashift: 12 est bien configuré avec zdb | grep ashift
  • Avant le partage, définir le point de montage et la compression
zfs set mountpoint=/mnt/s16z1 s16z1
zfs set compression=lz4 s16z1
  • Créer les datasets docs et backups sous le dataset racine
zfs create s16z1/docs
zfs create s16z1/backups
  • docs sert aux documents, backups aux sauvegardes Time Machine
  • Les datasets ZFS offrent davantage de fonctionnalités que de simples dossiers
    • Gestion des propriétés par dataset
    • Chiffrement
    • Envoi et réplication
    • Snapshots
  • Il est préférable de créer des datasets séparés par grandes catégories de fichiers
  • Par exemple, si l’on souhaite sauvegarder uniquement docs vers un serveur distant, il n’est pas nécessaire d’envoyer tout le dataset racine s16z1

Créer un compte de partage avec Samba

  • Le mode de partage de fichiers réseau est indépendant de ZFS ; il suffit que ZFS soit monté sur le système hôte
  • Installer Samba
apt install samba
  • Créer un utilisateur UNIX dédié à Samba, john, puis définir son mot de passe
useradd -m john
passwd john
  • Associer l’utilisateur UNIX john à un utilisateur Samba avec smbpasswd -a john
  • Les hôtes clients peuvent accéder au partage sous la forme SYS\john
  • Vérifier l’enregistrement de l’utilisateur Samba avec pdbedit -L -v john
  • La suppression d’un utilisateur Samba se fait avec pdbedit -x -u john

Partage classique et partage Time Machine

  • Modifier /etc/samba/smb.conf pour configurer les partages docs et backups
[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 est configuré comme un partage SMB à usage général
  • backups inclut les propriétés destinées à macOS Time Machine
    • fruit:aapl = yes
    • fruit:time machine = yes
    • vfs objects = catia fruit streams_xattr
  • Sous macOS, appuyer sur cmd+K dans le Finder pour monter le partage sous la forme smb://10.0.0.6/docs ou smb://10.0.0.6/backups
  • Sur les systèmes de la famille Debian, installer smbclient, puis tester comme suit
apt install smbclient
smbclient -U john //10.0.0.6/docs -c 'ls'
  • Une fois smb://10.0.0.6/backups monté, il apparaît dans macOS comme un partage Time Machine
  • Après le montage, on peut ajouter ce partage dans Settings > General > Time Machine de macOS pour lancer les sauvegardes Time Machine

Éléments exclus

  • La configuration du chiffrement n’est pas incluse dans cette procédure
  • La stratégie de sauvegarde n’est pas incluse non plus
  • La fonctionnalité de réplication de datasets ZFS sera développée ultérieurement dans un article séparé

1 commentaires

 
GN⁺ 4 시간 전
Avis sur Hacker News
  • Côté prix, ce n’est pas le bon moment pour monter un NAS, mais j’en construis un depuis deux semaines. J’utilise un boîtier Jonsbo N6, qui est plutôt correct contrairement aux anciens modèles Jonsbo, avec 8 backplanes SATA et baies de disques.
    J’ai finalement décidé de désosser 4 WD Elements Desktop de 14 To, qui contenaient des WD140EDGZ, des disques remplis à l’hélium. Ils sont environ un tiers moins chers que 4 WD Red Plus de 12 To et les performances semblent comparables. La garantie est clairement un inconvénient, mais s’ils tombent en panne pendant les 2 ans de garantie, je pense pouvoir les remettre dans leur boîtier externe.
    J’ai mis un SSD M.2 256 Go d’occasion comme disque de démarrage, et j’ai pas mal galéré pour combiner LUKS, des clés TPM et un ZFS racine de façon à ce qu’une panne de disque n’empêche pas le démarrage. J’ai beaucoup appris sur systemd-boot, qui me paraît bien plus sain que grub.
    J’ai aussi l’impression qu’il y a beaucoup de mythes et de culte du cargo autour de ZFS. Par exemple, l’article mentionne la RAM ECC, mais l’idée qu’elle serait indispensable parce que ZFS détruirait le pool pendant un scrub tient surtout du mythe, et cette année elle est particulièrement chère. ZFS n’a pas non plus besoin de tant de RAM, et le L2ARC n’en consomme pas énormément.
    J’hésite encore à activer dnodesize=auto, mais il y a des histoires effrayantes à ce sujet : https://github.com/openzfs/zfs/issues/11353. Et il est difficile de trouver un fournisseur de stockage cloud prenant en charge zfs send à un prix raisonnable ; Rsync.net a récemment relevé sa commande minimale à 10 Tio, ce qui est trop pour mon usage : https://www.rsync.net/products/zfsintro.html

    • Dire que « ce n’est pas le bon moment côté prix » est un euphémisme. En ce moment, les prix sont atroces pour monter un NAS.
      S’il existait une option magique, je serais presque tenté de choisir un monde sans IA du tout, mais avec un stockage à un dixième des prix d’avant l’IA.
    • Je fais tourner un pool ZFS RAIDZ2 de 8 disques, et je me demande si les recommandations de ZFS sur l’espace libre relèvent du culte du cargo ou sont réellement fondées.
      Je sacrifie déjà 2 disques pour la redondance, ce qui m’a effectivement aidé récemment quand deux SSD apparemment du même lot sont morts coup sur coup. Mais si je suis aussi le conseil de laisser au moins l’équivalent d’un disque supplémentaire libre pour les performances et la stabilité, aux prix actuels ça fait assez mal.
    • Je me demande si une partie au moins du « gros script qui debootstrap un NAS basé sur Debian » est publiée quelque part.
      Après avoir lu https://words.filippo.io/frood/ et https://0pointer.net/blog/fitting-everything-together.html, je regarde comment configurer un serveur domestique/NAS avec mkosi/systemd. C’est intéressant de voir comment différentes configurations résolvent ce problème.
    • Je me demande si l’association LUKS et clés TPM fonctionne vraiment bien en pratique. Si le serveur redémarre, est-ce que le TPM peut déverrouiller le système de fichiers racine, est-ce que /boot est chiffré et protégé contre les altérations, et est-ce que ça résiste à une attaque evil maid ?
      Je sais que c’est un terrier de lapin, mais si tout cela a été résolu, c’est vraiment intéressant.
    • Quatre Samsung SSD 990 PRO 4TB NVMe SSD coûtent 1 100 dollars pièce. Vertigineux.
      https://www.samsung.com/us/memory-storage/nvme-ssd/990-pro-p...
  • Quelques éléments utiles sur un NAS : installer avahi-daemon permet à Samba d’annoncer automatiquement SMB/CIFS via DNS-SD aux clients macOS et Linux.
    Pour la découverte automatique dans l’Explorateur de clients Windows 10 ou plus récents ayant désactivé SMB 1.0, il suffit d’installer wsdd2.
    Les noms d’hôte Linux sont généralement en minuscules, mais Samba publie par défaut dans NetBIOS et Avahi un nom commençant par une majuscule. Si ça vous gêne, définissez host-name=something dans [server] de /etc/avahi/avahi-daemon.conf, et mettez mdns name = mdns dans [global] de /etc/samba/smb.conf.
    Si vous avez des clients macOS, il vaut mieux activer vfs_fruit dans la configuration Samba : https://www.samba.org/samba/docs/current/man-html/vfs_fruit..... Il y a des raisons de compatibilité, mais c’est surtout utile pour définir fruit:model et afficher une icône amusante dans la barre latérale du Finder.
    Pour empêcher la création de .DS_Store, on peut les interdire : https://ryanoberto.github.io/blog/2015/04/01/disabling-the-c.... Il semble aussi possible d’enregistrer les réglages du Finder dans les attributs étendus avec fruit:resource = xattr, mais je ne l’ai pas testé moi-même.
    macOS a annoncé il y a longtemps qu’il remplaçait AFP par SMB, et la prise en charge du client AFP doit être supprimée dans macOS 27, mais le support du client SMB sous macOS reste assez médiocre. D’ici là, je continuerai à faire tourner Netatalk en plus de Samba ; Netatalk s’enregistre aussi dans Avahi, et macOS privilégie ostensiblement AFP à SMB, donc les clients se connectent automatiquement au bon démon.

    • Avec Samba, il vaut mieux ajouter les répertoires personnels des utilisateurs comme entrées séparées. La configuration par défaut du répertoire homes déclenche quelque chose d’obsessionnel.
  • Il me semble aussi pertinent de lier mon billet de blog où j’ai construit ce type de NAS, mais avec une pile assez différente basée sur dm-integrity, mdadm et XFS. En tant que développeur C/C++, en suivant de près le développement d’OpenZFS, le fait que le projet se concentre sur d’énormes fonctionnalités et les problèmes récurrents liés au SPL / au cache de pages séparé m’inquiétaient du point de vue de la stabilité
    J’ai accepté des galères au départ au lieu de profiter de la commodité de l’outil universel qu’est ZFS, mais aujourd’hui je suis très satisfait de ce choix
    https://world-playground-deceit.net/blog/2025/06/nas-setup-l...

  • J’en suis arrivé à la même conclusion en construisant mon NAS. Pour le système, Nix ; pour le RAID, zfs ; et pour les services que je voulais lancer, docker compose suffisait
    https://www.splitbrain.org/blog/2025-08/03-diy_nas_on_nixos

    • Moi aussi, j’utilise NixOS sur mon NAS. Pour la gestion des conteneurs, il vaut la peine de regarder, avec Nix, les quadlets, c’est-à-dire des conteneurs Docker gérés par systemd
    • J’utilise moi aussi NixOS comme NAS, et le projet a pris de l’ampleur au point que je suis maintenant en train de le partager avec d’autres. En revanche, j’utilise BTRFS au-dessus de MDADM
      Lassé du rack bruyant et énergivore dans le placard, j’ai fini avec un serveur domestique tout-en-un qui fait aussi routeur
      https://HomeFree.host
  • La raison pour laquelle je continue à payer pour Synology, c’est que lorsqu’un disque tombe en panne, il suffit de sortir le tiroir, remplacer le disque, le remettre, puis cliquer sur quelques widgets, et c’est terminé. Je sais que la reconstruction se fera correctement
    Quand un disque tombe en panne, il y a un bip et la LED près du disque problématique s’allume, donc je sais quoi faire
    Construire un NAS comme celui décrit dans l’article est facile, mais à long terme le risque de perte de données est bien plus élevé
    Et je considère qu’un guide de ce type est incomplet s’il n’explique pas « comment remplacer en toute sécurité le disque 3 quand il tombe en panne ». Même sans expliquer comment détecter la panne du disque, la procédure devrait y être

    • Je me demande si « snooty » est une faute de frappe due à l’autocomplétion pour Synology, ou si c’est un autre produit
    • En fait, c’est exactement comme ça que fonctionne ZFS. Le guide n’est certes pas complet, mais reconstruire la grappe revient à remplacer le disque puis lancer une seule commande ZFS
    • ZFS gère les pannes de disque plus solidement que quasiment tout le reste. Ce n’est pas pour rien que Synology utilise mdadm sous BTRFS au lieu de la fonctionnalité RAID intégrée de BTRFS, et mdadm opère au niveau du périphérique
      Donc, quand on remplace un disque, mdadm doit reconstruire tout le disque, alors que ZFS ne reconstruit que les données réellement utilisées
      zpool replace my_pool disk3 newdisk
    • Avec ZFS, cette procédure devient complètement triviale, à part la partie « bip et LED »
  • Il y a sûrement des raisons pour lesquelles les gens poussent ZFS et les composants de ce qu’on appelle généralement un « NAS » aussi loin, mais pour ma part, je me suis plutôt bien accommodé d’une configuration NFSv3 stricte sur un gros disque dur unique en ext4 dans une machine Linux
    C’est de toute façon ma machine principale, toujours allumée quand je suis éveillé, et elle peut servir des fichiers à d’autres appareils avec l’alimentation et l’overhead d’une seule machine
    J’essaie de garder la configuration réseau restrictive par défaut, donc les questions de sécurité liées à ce qui tourne sur la machine principale ne m’inquiètent pas trop. Je commets peut-être un péché terrible, mais est-ce que du NFSv3 pur, avec Samba seulement pour la compatibilité, est vraiment si insuffisant ?

    • Ma première question serait de savoir si tu as une sauvegarde de ce gros disque unique. C’est ma principale inquiétude. Ce disque finira forcément par tomber en panne un jour, et ce qui compte, c’est ton plan à ce moment-là
      Les principales raisons pour lesquelles les gens choisissent ZFS et un « NAS » sont les sommes de contrôle et la protection de l’intégrité des données, et aussi le fait de ne pas vouloir garder leur machine principale toujours réveillée
      Les fonctionnalités comme les instantanés sont aussi utiles : elles réduisent le risque de perdre des données après avoir supprimé ou écrasé un fichier par erreur
      Utiliser sa machine principale allumée 24 h/24 comme NAS n’est pas un problème en soi. Pas besoin d’acheter quelque chose à tout prix, mais la fiabilité et la protection contre la corruption silencieuse des bits m’inquiètent. Ça arrive vraiment, et je l’ai déjà constaté moi-même grâce à ZFS
    • Dans cette configuration, le plus gros problème est le stockage sur un seul disque. Si ce disque tombe en panne, rien ne permet d’encaisser le choc, et si le matériel commence à corrompre silencieusement les données, toutes les données sont en danger. Cela suppose aussi que les sauvegardes se basent sur les données de ce disque dur unique
      Si tu veux garder une configuration simple, tu pourrais envisager de conserver une liste de hachages de fichiers et de la vérifier périodiquement
      Il vaut aussi mieux utiliser un programme de sauvegarde qui prend en charge les instantanés ; Restic est un bon choix
      Tu peux aussi acheter un autre disque dur de la même taille que l’actuel et gérer l’intégrité des fichiers avec SnapRAID, ou bien créer un miroir à deux disques avec btrfs
    • Tu atteindras les limites dès que plusieurs machines commenceront à lire et écrire en même temps. Mais il suffit de construire ce dont tu as besoin aujourd’hui, inutile de sur-optimiser
  • Cockpit m’a été très utile pour gérer des NAS et des VPS. Même si la configuration elle-même n’est plus un gros problème grâce aux LLM, c’est pratique d’avoir un tableau de bord avec des interrupteurs et des journaux bien organisés, et de pouvoir exécuter des commandes shell depuis son téléphone sans SSH
    Sur un NAS, on peut facilement voir les résultats des tâches cron de sauvegarde/maintenance, gérer Samba et surveiller l’utilisation des disques. Faire fonctionner correctement Samba sur iPhone en particulier est vraiment pénible

    • Si tu exécutes des commandes shell depuis ton téléphone sans SSH, comment fais-tu l’authentification Cockpit ? Avec une authentification HTTP basique en frontal, par exemple ?
      Pour l’authentification aux serveurs, au lieu de descendre vers autre chose qu’une clé publique/privée, je finis généralement par rendre SSH possible depuis le téléphone. Je suis un peu paranoïaque sur ce point
  • À l’époque où j’ai construit mon propre NAS, j’ai aussi utilisé cet article comme support d’apprentissage : https://xyny.art/blog/2026-building-nas/
    Construire un NAS à partir de zéro est vraiment amusant. Le fait qu’il n’existe pas de « ressource complète » couvrant absolument tout le sujet est un petit obstacle, mais c’est aussi une partie du plaisir
    Le but de mon article est lui aussi plutôt d’ajouter à Internet un « guide » de configuration NAS de plus, forcément biaisé. J’hésite à l’appeler un guide, mais si je devais refaire la même chose, je commencerais clairement par relire mon propre article

  • Conceptuellement, je fais tourner la même chose, mais avec FreeBSD au lieu de Debian. Ce n’est pas vraiment mieux ou moins bien : les compromis sont différents, et au final ça fonctionne tout aussi bien

  • En reconstruisant mon NAS, j’ai opté pour NFS sur ZFS. Cela dit, mon objectif est un peu différent de celui de l’auteur. J’utilise un CPU/une carte mère basse consommation et j’ai mis en place deux systèmes séparés capables de basculer en cas de panne, dans une configuration haute disponibilité
    J’ai même écrit un logiciel personnalisé pour gérer concrètement le failover et la réplication des données. Lors des tests, les écritures côté client ne s’interrompent que quelques secondes pendant le basculement. Je me demande si un article à ce sujet intéresserait du monde