Cet article fait partie d’une série :

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.

  1. Éditer les sources pour ajouter les dépôts backports :

    $ sudo vim /etc/apt/sources.list.d/bookworm-backports.list
    
    deb http://deb.debian.org/debian bookworm-backports main contrib
    deb-src http://deb.debian.org/debian bookworm-backports main contrib
    
  2. Forcer l’utilisation de ce dépôt pour le paquet zfs-linux :

    $ sudo vim /etc/apt/preferences.d/90_zfs
    
    Package: src:zfs-linux
    Pin: release n=bookworm-backports
    Pin-Priority: 990
    
  3. Mettre à jour les dépôts :

    $ sudo apt update
    
  4. Installer les paquets :

    $ sudo apt install dpkg-dev linux-headers-generic linux-image-generic
    $ sudo apt install zfs-dkms zfsutils-linux
    
  5. Activer le module :

    $ sudo modprobe zfs
    

Création du pool

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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 tank
    
    • autoexpand : pour permettre au pool de s’étendre si on ajoute des disques,
    • atime : désactivation de la mise à jour du atime à 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 :

$ 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

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).

  1. Modifier les lignes suivantes dans le fichier de configuration /etc/zfs/zed.d/zed.rc :

    ZED_EMAIL_ADDR="<adresse mail>"
    [...]
    ZED_NOTIFY_VERBOSE=1
    
  2. 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.

  1. 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
    
  2. 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
    
  3. 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.
  4. 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
    
  5. 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
    
  6. 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
    
  7. 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
    
  8. À 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 :


Vous pouvez aller à l’article suivant pour poursuivre la construction du NAS : #3 − Partage de fichier avec Samba.

nas  debian  tech  zfs  openzfs