Mise en place de ZFS sur un NAS perso
Contexte
Mon NAS actuel commence à se faire vieux, plus de 10 ans maintenant, c’est un QNAP TS-412 possédant 4 disques WD Red 2To.
J’ai donc décidé de le remplacer par un nouveau serveur de type desktop avec du raid logiciel, sous Linux.
Pourquoi ne pas tout mettre sur du cloud public ? C’est une idée que j’avais envisagé mais avec un débit de 4mbit/s en descendant et de 0,8mbit/s en montant j’en ai pour un moment à uploader quelques To de données :-). Je réfléchirai de nouveau à cette migration dans plusieurs années quand la fibre optique sera installée chez moi.
J’ai donc acquis une petite configuration bureautique : Ryzen 3, 8Go de RAM, SSD NVMe de 60 Go pour le système et 3 disques WD Red de 3 To. Je n’ai que 4 ports SATA sur la carte mère, ça me laisse 1 port de spare au cas où (il est possible de dédier un SSD à du cache sur ZFS afin d’accélérer les perfs, je mettrai cela en place si j’ai des problèmes de perfs avec la rapidité d’ouverture de mes photos).
à la base, je pensais partir sur un mix LVM + mdadm et puis j’ai découvert ZFS, technologie qui me semblait intéressante. Je me suis dit que c’était l’occasion de tester.
ZFS a l’avantage de pouvoir faire des snapshots assez rapidement (grâce au copy-on-write ), c’est une des fonctionnalités que je souhaite tester et ça permettrait de me prémunir à minima d’un potentiel ransmware.
J’ai aussi lu que le partage de datasets ZFS via Samba et NFS était natif, si j’arrive à mettre ça en place, ça m’évitera de configurer 2 logiciels en plus.
En ce moment, on entend pas mal parler de problèmes entre ZFS et les disques WD Red qui utilisent la technologie SMR. Les disques que je viens d’acheter ne disposent pas de cette technologie, je suis donc pas concerné.
Installation des drivers
ZFS est sous license CDDL. Cette license étant incompatible avec celle du kernel, les modules noyau ne sont pas directement intégrés, il faut donc les installer à part.
La distribution GNU/Linux installée chez moi est la dernière Debian stable et comme les paquets de Debian stable ont tendance à ne pas être up-to-date, j’ai décidé d’installer les paquets qui viennent des backports :
|
|
Si tout s’est bien passé, les modules zfs sont chargés :
|
|
Le système de layering sur ZFS
Vous trouverez une définition plus complète directement sur la doc d’Oracle, mais pour résumer on peut dire que sur ZFS, un pool est composé de vdevs et met à disposition des datasets.
un vdev peut être un disque physique (SSD ou mécanique), un mirror (un équivalent du RAID-1), un RAID-Z (équivalent d’un RAID-5 ou plus suivant la configuration) ou encore des fichiers (ça peut servir dans le cadre de prototypage). Un vdev peut aussi être de type Spare, Log ou Cache.
Un dataset est un terme générique qui définit un élément d’un pool. Il peut être de type filesystem, volume, snapshot ou clone.
Dans mon cas, je vais créer un seul vdev, de type RAIDZ-1, composé des 3 disques dur de 3 To, sur lequel je baserai mon pool data qui sera composé de plusieurs datasets, 1 filesystem par type de données (Vidéos, Photos, Documents, Jeux Vidéos …).
Création du pool
Rien de plus simple pour créer à la fois les vdevs et le pool, le tout est fait par une seule commande :
|
|
|
|
Le tour est joué ! Il ne reste plus qu’à créer les datasets. On remarquera que le pool est monté directement :
|
|
Je créé mon dataset de type filesystem Documents en activant la compression de type lz4 :
|
|
Mad’eo, le tour est joué. 2 commandes pour faire ça, c’est assez rapide 🙂
Les snapshots
Un snapshot ZFS est la copie d’un dataset à l’instant T. Comme ZFS est basé sur du copy-on-write, les snapshots ne prennent pas beaucoup de place si il y a peu de modification dans le contenu du dataset. C’est notamment le cas de mon dataset Documents : il ne fait généralement que grossir. Et comme le contenu est important, il est tout aussi important de prendre soin des données qu’il y a dessus ! Bien évidemment, il ne faut pas non plus oublier l’adage RAID is not backup.
Depuis le paragraphe précédent, j’ai copié l’intégralité des Documents de mon ancien NAS. Je me retrouve avec quelques Go d’utilisés :
|
|
Note : j’ai gagné 3.6 Go grâce à la compression, le dossier d’origine faisait 37 Go, c’est toujours ça de pris.
On créé un snapshot sur le dataset Documents :
|
|
On remarque que le snapshot ne prend aucune place supplémentaire.
Maintenant simulons l’effet d’une malheureuse suppression sur une partie du dataset :
|
|
Comme le snapshot est toujours là, l’espace utilisé n’est pas libéré, si on voulait récuperer l’espace disque disponible, il faudrait aussi supprimer le snapshot.
Pour revert le snapshot, c’est simple :
|
|
Le partage Samba
l’implémentation sous Linux de ZFS ne permet qu’à un partage samba d’être créé avec les ACL « Everyone:FullPermissions » sans accès guest. Si on souhaite modifier ce comportement, il faut directement configurer samba. Dans mon cas, je vais juste créer un user local samba que j’utiliserai pour accéder au partage Samba.
|
|
Depuis Windows :
|
|
Le partage NFS
Rien de plus, simple, il faut installer le paquet nfs-kernel-server et mettre la propriété sharenfs à on pour le dataset selectionné.
Note: dans ce cas c’est open-bar au regard des ACLs, mais il est tout à fait possible d’en mettre.
|
|
Depuis un autre poste, on monte le partage NFS :
|
|
Et les perfs alors ?
Les performances sont intéressantes, j’ai réussi à saturer mon lien gigabyte en backupant un laptop sous SSD.
Conclusion
ZFS est un système de fichier bien sympa, facile à prendre en main et qui vaut le détour lorsqu’on met en place des solutions pérennes. Reste maintenant à combiner cela des systèmes de fichiers distribués comme Ceph par exemple … 🙂