Cet article fait partie d’une série :
- #1 − Introduction
- #2 − Configuration du système de fichier avec ZFS
- #3 − Partage de fichier avec Samba
- #4 − Relais mail
- #5 − Surveillance des disques
- #6 − Services avec Docker & Compose
Introduction
Dans la construction de ce NAS, nous utiliserons ZFS comme système de fichiers pour les disques de stockage.
ZFS apporte de nombreux avantages comme sa facilité d’utilisation (ajout de disques, gestion des disques miroirs, etc.), sa gestion de la corruption des données, la compression des données, le chiffrement, les snapshots, etc.
Installation
L’installation se fait en suite les recommandations d’installation du projet OpenZFS pour Debian 12/Bookworm.
-
Éditer les sources pour ajouter les dépôts
backports:$ sudo vim /etc/apt/sources.list.d/bookworm-backports.listdeb http://deb.debian.org/debian bookworm-backports main contrib deb-src http://deb.debian.org/debian bookworm-backports main contrib -
Forcer l’utilisation de ce dépôt pour le paquet
zfs-linux:$ sudo vim /etc/apt/preferences.d/90_zfsPackage: src:zfs-linux Pin: release n=bookworm-backports Pin-Priority: 990 -
Mettre à jour les dépôts :
$ sudo apt update -
Installer les paquets :
$ sudo apt install dpkg-dev linux-headers-generic linux-image-generic $ sudo apt install zfs-dkms zfsutils-linux -
Activer le module :
$ sudo modprobe zfs
Création du pool
-
Récupérer la liste des ID des disques :
$ ls -l /dev/disk/by-id/ | grep sd[a-z]$ lrwxrwxrwx 1 root root 9 24 oct. 18:42 ata-HGST_HDN724030ALE640_PK1234P9GL82JX -> ../../sdb lrwxrwxrwx 1 root root 9 24 oct. 18:13 ata-Samsung_SSD_850_EVO_250GB_S2R6NX0J940869W -> ../../sde lrwxrwxrwx 1 root root 9 24 oct. 18:13 ata-ST2000DM001-1ER164_S4Z0H04Z -> ../../sdf lrwxrwxrwx 1 root root 9 24 oct. 18:42 ata-ST3000VN000-1HJ166_W7301MSS -> ../../sdd lrwxrwxrwx 1 root root 9 24 oct. 18:42 ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0D6JWLZ -> ../../sdc lrwxrwxrwx 1 root root 9 24 oct. 18:42 ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0DC9LVT -> ../../sda lrwxrwxrwx 1 root root 9 24 oct. 18:42 wwn-0x5000c5007bf64c48 -> ../../sdd lrwxrwxrwx 1 root root 9 24 oct. 18:13 wwn-0x5000c5007fca2cdf -> ../../sdf lrwxrwxrwx 1 root root 9 24 oct. 18:42 wwn-0x5000cca248c84d04 -> ../../sdb lrwxrwxrwx 1 root root 9 24 oct. 18:42 wwn-0x50014ee05931b438 -> ../../sdc lrwxrwxrwx 1 root root 9 24 oct. 18:42 wwn-0x50014ee0ae8765f8 -> ../../sda lrwxrwxrwx 1 root root 9 24 oct. 18:13 wwn-0x5002538d42389ed3 -> ../../sde -
Créer le pool avec les disques disponibles :
$ sudo zpool create -o ashift=12 tank \ mirror \ ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0DC9LVT \ ata-HGST_HDN724030ALE640_PK1234P9GL82JX \ mirror \ ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0D6JWLZ \ ata-ST3000VN000-1HJ166_W7301MSS -
Vérifier la bonne création du pool :
Afficher la liste des pools :
$ sudo zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT tank 5.44T 396K 5.44T - - 0% 0% 1.00x ONLINE -Afficher le statut des pools :
$ sudo zpool status pool: tank state: ONLINE config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0DC9LVT ONLINE 0 0 0 ata-HGST_HDN724030ALE640_PK1234P9GL82JX ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0D6JWLZ ONLINE 0 0 0 ata-ST3000VN000-1HJ166_W7301MSS ONLINE 0 0 0 errors: No known data errors -
Configurer les paramètres généraux du pool :
$ sudo zpool set autoexpand=on tank $ sudo zfs set atime=off tank $ sudo zfs set compression=lz4 tankautoexpand: pour permettre au pool de s’étendre si on ajoute des disques,atime: désactivation de la mise à jour duatimeà chaque accès de fichier (gourmand en ressource),compression: configuration de l’algorithme de compression.
Création des datasets
Une fois le pool créé, nous allons créer un dataset par répertoire qui sera partagé (voir l’article sur Samba, à suivre), à savoir :
- videos : pour tous les médias vidéos (films, séries, documentaires, etc.),
- music : pour toute la musique,
- books : pour les livres, les magazines ou les bandes dessinées,
- photos : pour les photos,
- misc : pour les éléments divers,
- backups : pour les sauvegardes,
- users : pour les répertoires personnels des utilisateurs.
$ sudo zfs create tank/videos
$ sudo zfs set recordsize=1M tank/videos
$ sudo zfs set compression=off tank/videos
$ sudo zfs set exec=off tank/videos
$ sudo zfs create tank/music
$ sudo zfs set recordsize=1M tank/music
$ sudo zfs set compression=off tank/music
$ sudo zfs set exec=off tank/music
$ sudo zfs create tank/books
$ sudo zfs set recordsize=1M tank/books
$ sudo zfs set compression=off tank/books
$ sudo zfs set exec=off tank/books
$ sudo zfs create tank/photos
$ sudo zfs set recordsize=1M tank/photos
$ sudo zfs set compression=off tank/photos
$ sudo zfs set exec=off tank/photos
$ sudo zfs create tank/misc
$ sudo zfs set exec=off tank/misc
$ sudo zfs create tank/backups
$ sudo zfs set exec=off tank/backups
$ sudo zfs create tank/users
$ sudo zfs set exec=off tank/users
recordsize: Par défaut lerecordsizeest de 128K. Il est plus optimal d’augmenter sa valeur pour les datasets qui contiendront majoritairement des fichiers de grande taille.compression: La compression n’est pas nécessaire pour les datasets qui contiendront quasi exclusivement des fichiers déjà compressés (comme les films ou la musique). Même si ZFS devrait savoir le gérer en autonomieexec: Pour les datasets à partir desquels les fichiers ne devraient pas être exécutés.
Les 2 premiers sont moins nécessaires pour les derniers datasets (misc, backups & users).
Vérifier la bonne création des datasets en les affichant :
$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1.48M 5.27T 120K /tank
tank/backups 96K 5.27T 96K /tank/backups
tank/books 96K 5.27T 96K /tank/books
tank/misc 96K 5.27T 96K /tank/misc
tank/music 96K 5.27T 96K /tank/music
tank/photos 96K 5.27T 96K /tank/photos
tank/users 96K 5.27T 96K /tank/users
tank/videos 96K 5.27T 96K /tank/videos
Notifications
Le service ZFS Event Daemon peut envoyer des notifications lors de changement d’état (p.e. dégradation d’un disque) ou de la fin d’une tâche (p.e. scrubing ou reconstruction d’un disque).
-
Modifier les lignes suivantes dans le fichier de configuration
/etc/zfs/zed.d/zed.rc:ZED_EMAIL_ADDR="<adresse mail>" [...] ZED_NOTIFY_VERBOSE=1 -
Redémarrer ensuite le service :
$ systemctl restart zfs-zed.service
(voir également l’article sur le relai mail)
Remplacement d’un disque
Vous serez amené à remplacer des disques dans le cadre de maintenance préventive (erreurs S.M.A.R.T. récurrentes, augmentation du volume de stockage) ou corrective (arrêt total du fonctionnement d’un disque). Dans tous les cas la méthode de remplacement est sensiblement la même.
-
Récupérer le statut actuel du pool :
$ sudo zpool status pool: tank state: ONLINE status: Some supported and requested features are not enabled on the pool. The pool can still be used, but some features are unavailable. action: Enable all features using 'zpool upgrade'. Once this is done, the pool may no longer be accessible by software that does not support the features. See zpool-features(7) for details. scan: scrub repaired 0B in 06:20:38 with 0 errors on Sun Dec 8 06:44:40 2024 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0DC9LVT ONLINE 0 0 0 ata-HGST_HDN724030ALE640_PK1234P9GL82JX ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 ata-WDC_WD40EFAX-68JH4N1_WD-WX92DA1NAERU ONLINE 0 0 0 ata-ST3000VN000-1HJ166_W7301MSS ONLINE 0 0 0 errors: No known data errors -
Lister les disques en identifiant les noms/numéros de série que vous retrouverez imprimés physiquement sur le disque. Ce sera ainsi plus simple de l’identifier dans le boitier.
$ lsblk -I 8 -d -o NAME,SIZE,SERIAL NAME SIZE SERIAL sda 2,7T WD-WMC4N0DC9LVT sdb 2,7T PK1234P9GL82JX sdc 3,6T WD-WX92DA1NAERU sdd 2,7T W7301MSS sde 232,9G S2R6NX0J940869W -
Remplacer physiquement le disque :
- Éteindre le serveur, et débrancher le câble d’alimentation.
- Identifier le disque à enlever, et le remplacer par le nouveau.
- Vérifier que tous les branchements sont OK (idéalement le nouveau disque est branché sur le même port que l’ancien).
- Rallumer le serveur et attendre quelques instants avant de vous reconnecter.
-
Afficher le statut du pool, qui doit vous indiquer qu’il est en mode dégradé avec un disque non disponible (mais toujours identifié) :
$ sudo zpool status pool: tank state: DEGRADED status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J scan: scrub repaired 0B in 06:20:38 with 0 errors on Sun Dec 8 06:44:40 2024 config: NAME STATE READ WRITE CKSUM tank DEGRADED 0 0 0 mirror-0 ONLINE 0 0 0 ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0DC9LVT ONLINE 0 0 0 ata-HGST_HDN724030ALE640_PK1234P9GL82JX ONLINE 0 0 0 mirror-1 DEGRADED 0 0 0 ata-WDC_WD40EFAX-68JH4N1_WD-WX92DA1NAERU ONLINE 0 0 0 4119651953376611963 UNAVAIL 0 0 0 was /dev/disk/by-id/ata-ST3000VN000-1HJ166_W7301MSS-part1 errors: No known data errors -
Identifier l’id du nouveau disque (adapter le filtre
grepà votre contexte) :$ ls -lisah /dev/disk/by-id/ | grep sdd 694 0 lrwxrwxrwx 1 root root 9 29 déc. 18:51 ata-ST4000VN008-2DR166_ZDHALVFA -> ../../sdd 691 0 lrwxrwxrwx 1 root root 9 29 déc. 18:51 wwn-0x5000c500e3248808 -> ../../sdd -
Indiquer à ZFS que vous avez changé le disque et ajouter le nouveau au pool :
$ sudo zpool replace tank ata-ST3000VN000-1HJ166_W7301MSS ata-ST4000VN008-2DR166_ZDHALVFA -
Cela initie la migration des données vers le nouveau disque (appelé resilvering en anglais). Vous pouvez afficher l’avancement de cette reconstruction en affichant le statut du pool. Cela peut prendre quelques heures en fonction de la taille du pool et de son contenu (~5 heures dans mon cas).
$ sudo zpool status tank pool: tank state: DEGRADED status: One or more devices is currently being resilvered. The pool will continue to function, possibly in a degraded state. action: Wait for the resilver to complete. scan: resilver in progress since Sun Dec 29 18:56:52 2024 132G scanned at 5.73G/s, 66.2G issued at 2.88G/s, 4.54T total 0B resilvered, 1.42% done, 00:26:33 to go config: NAME STATE READ WRITE CKSUM tank DEGRADED 0 0 0 mirror-0 ONLINE 0 0 0 ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0DC9LVT ONLINE 0 0 0 ata-HGST_HDN724030ALE640_PK1234P9GL82JX ONLINE 0 0 0 mirror-1 DEGRADED 0 0 0 ata-WDC_WD40EFAX-68JH4N1_WD-WX92DA1NAERU ONLINE 0 0 0 replacing-1 DEGRADED 0 0 0 4119651953376611963 UNAVAIL 0 0 0 was /dev/disk/by-id/ata-ST3000VN000-1HJ166_W7301MSS-part1 ata-ST4000VN008-2DR166_ZDHALVFA ONLINE 0 0 0 errors: No known data errors -
À la fin de l’opération, le disque est maintenant intégré au pool :
$ sudo zpool status -v pool: tank state: ONLINE scan: resilvered 2.28T in 05:27:40 with 0 errors on Mon Dec 30 00:24:32 2024 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0DC9LVT ONLINE 0 0 0 ata-HGST_HDN724030ALE640_PK1234P9GL82JX ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 ata-WDC_WD40EFAX-68JH4N1_WD-WX92DA1NAERU ONLINE 0 0 0 ata-ST4000VN008-2DR166_ZDHALVFA ONLINE 0 0 0 errors: No known data errors
Si le nouveau disque est de taille supérieure et que vous avez activé l’extension automatique du pool (voir plus haut dans la section de la création du pool), celui-ci devrait bien s’étendre automatiquement.
Commandes utiles
Lister les pools et leur état simplifié :
$ sudo zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 6.34T 4.53T 1.81T - - 8% 71% 1.00x ONLINE -
Afficher l’état détaillé d’un pool :
$ sudo zpool status
pool: tank
state: ONLINE
scan: resilvered 2.28T in 05:27:40 with 0 errors on Mon Dec 30 00:24:32 2024
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0DC9LVT ONLINE 0 0 0
ata-HGST_HDN724030ALE640_PK1234P9GL82JX ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
ata-WDC_WD40EFAX-68JH4N1_WD-WX92DA1NAERU ONLINE 0 0 0
ata-ST4000VN008-2DR166_ZDHALVFA ONLINE 0 0 0
errors: No known data errors
Renommer - Pour cela, il faut exporter et le réimporter avec un nouveau nom :
$ sudo zpool export tank
$ sudo zpool import tank data
Supprimer - ⚠️ Attention, cela supprime toutes les données du pool :
sudo zpool destroy DUMPSTER
Importer le pool sur une nouvelle machine :
$ sudo zpool import tank
Sources :
- https://openzfs.github.io/openzfs-docs/Getting%20Started/Debian/index.html
- https://davidstephens.uk/ansible-nas/zfs/zfs_configuration/
- https://www.cyberciti.biz/faq/how-to-create-raid-10-striped-mirror-vdev-zpool-on-ubuntu-linux/
- https://jrs-s.net/2019/04/03/on-zfs-recordsize/
- https://madaboutbrighton.net/articles/replace-disk-in-zfs-pool
- https://madaboutbrighton.net/articles/increase-zfs-pool-by-adding-larger-disks
- https://blog.cavelab.dev/2021/01/zfs-replace-disk-expand-pool/
Vous pouvez aller à l’article suivant pour poursuivre la construction du NAS : #3 − Partage de fichier avec Samba.