Aller au contenu
Perfect Homelab [E06] : Post-Installation [Données et stockage]
  1. Posts/

Perfect Homelab [E06] : Post-Installation [Données et stockage]

Fabien ALLAMANCHE
Auteur
Fabien ALLAMANCHE
Géomaticien @ Vienne Condrieu Agglomération
Sommaire
Perfect Homelab - Cet article fait partie d'une série.
Partie 6: Cet article

Perfect Homelab

Données et stockage
#

mergerFS
#

Mergerfs est l’outil magique de notre NAS ! Voici la procédure d’installation.

L’installation dans Ubuntu ou Debian peut être effectuée à l’aide d’apt mais la version dans les dépôts est généralement toujours un peu à la traîne.

Pour installer mergerFS, on va préférer utiliser le fichier *.deb que l’on peut télécharger sur le dépôt de Trapexit :

https://github.com/trapexit/mergerfs/releases

Installation sous debian Bookworm(12) / Trixie(13) / Proxmox 9
#

root@homelab:~# wget https://github.com/trapexit/mergerfs/releases/download/2.40.2/mergerfs_2.40.2.debian-bookworm_amd64.deb
root@homelab:~# dpkg -i mergerfs_2.40.2.debian-bookworm_amd64.deb

On vérifie que l’installation est effective :

root@homelab:~# mergerfs --version
mergerfs v2.40.2

https://github.com/trapexit/mergerfs
https://github.com/trapexit/support

ISC License (ISC)

Copyright 2023, Antonio SJ Musumeci <trapexit@spawn.link>

Permission to use, copy, modify, and/or distribute this software for
any purpose with or without fee is hereby granted, provided that the
above copyright notice and this permission notice appear in all
copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

Configuration des disques dur
#

La section suivante détaille les étapes pour identifier, monter et partitionner les disques durs de votre système.

Monter ses disques manuellement
#

Afin d’utiliser les disques durs présents sur notre NAS, notre système d’exploitation doit les monter. Le montage signifie que nous fournissons au système d’exploitation des instructions sur la façon de lire ou d’écrire des données sur un lecteur spécifique. Afin d’être le plus compatible avec mergerFS, il est conseillé de configurer les disques à utiliser avec notre NAS avec une unique partition et à la formater avec un seul système de fichiers qui s’étend sur l’intégralité du disque, souvent ext4 ou xfs, puis à les monter sur le sytème.

Il y a de multiples systèmes de fichiers disponibles sous Linux et il n’y a pas de bon ou de mauvais choix. Cependant, on recommande l’ext4 ou xfs pour rester dans des choses simples.

N’oubliez pas qu’avec mergerFS, on peut mélanger et faire correspondre en toute sécurité les systèmes de fichiers et les tailles de lecteur, ce qui fait partie de sa véritable magie.

Cela signifie que vous n’avez pas à trop vous soucier de choisir exactement le bon système de fichiers dès le départ, car vous n’êtes pas enfermé.

Identification des disques durs
#

Répertoriez tous les lecteurs d’un système avec :

root@homelab:~# ls -l /dev/disk/by-id

lrwxrwxrwx 1 root root  9 Mar 26 14:52 ata-VBOX_HARDDISK_VB2ff4aa6e-3b5752ba -> ../../sdd
lrwxrwxrwx 1 root root  9 Mar 26 14:52 ata-VBOX_HARDDISK_VB41f1fa4d-a2c11c14 -> ../../sdf
lrwxrwxrwx 1 root root  9 Mar 26 14:52 ata-VBOX_HARDDISK_VB4d776a0a-b24c3eb0 -> ../../sda
lrwxrwxrwx 1 root root 10 Mar 26 14:52 ata-VBOX_HARDDISK_VB4d776a0a-b24c3eb0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar 26 14:52 ata-VBOX_HARDDISK_VB4d776a0a-b24c3eb0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Mar 26 14:52 ata-VBOX_HARDDISK_VB4d776a0a-b24c3eb0-part3 -> ../../sda3
lrwxrwxrwx 1 root root  9 Mar 26 14:52 ata-VBOX_HARDDISK_VB4fd111ed-7ccb2978 -> ../../sdb
lrwxrwxrwx 1 root root 10 Mar 26 14:52 ata-VBOX_HARDDISK_VB4fd111ed-7ccb2978-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Mar 26 14:52 ata-VBOX_HARDDISK_VB4fd111ed-7ccb2978-part2 -> ../../sdb2
lrwxrwxrwx 1 root root 10 Mar 26 14:52 ata-VBOX_HARDDISK_VB4fd111ed-7ccb2978-part3 -> ../../sdb3
lrwxrwxrwx 1 root root  9 Mar 26 14:52 ata-VBOX_HARDDISK_VBb598f427-91b62771 -> ../../sdc
lrwxrwxrwx 1 root root  9 Mar 26 14:52 ata-VBOX_HARDDISK_VBbc16d229-98501233 -> ../../sde

Ou avec :

root@homelab:~# ls -l /dev/disk/by-uuid

total 0
lrwxrwxrwx 1 root root  9 Mar 26 14:52 01418e86-d606-4d40-acf4-79af5045172c -> ../../sdc
lrwxrwxrwx 1 root root 10 Mar 26 14:52 4F35-0F4B -> ../../sda2
lrwxrwxrwx 1 root root 10 Mar 26 14:52 4F3A-0665 -> ../../sdb2
lrwxrwxrwx 1 root root 10 Mar 26 14:52 9126907211302610478 -> ../../sda3

Ou encore :

root@homelab:~# fdisk -l
Disk /dev/sda: 1 TiB, 1099511627776 bytes, 2147483648 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 30CEC8C0-5E64-4538-BCB6-14419B0A845D

Device       Start        End    Sectors  Size Type
/dev/sda1       34       2047       2014 1007K BIOS boot
/dev/sda2     2048    2099199    2097152    1G EFI System
/dev/sda3  2099200 2147483614 2145384415 1023G Solaris /usr & Apple ZFS

root@homelab:~# fdisk -l
Disk /dev/sda: 1 TiB, 1099511627776 bytes, 2147483648 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 30CEC8C0-5E64-4538-BCB6-14419B0A845D

Device       Start        End    Sectors  Size Type
/dev/sda1       34       2047       2014 1007K BIOS boot
/dev/sda2     2048    2099199    2097152    1G EFI System
/dev/sda3  2099200 2147483614 2145384415 1023G Solaris /usr & Apple ZFS


Disk /dev/sdb: 1 TiB, 1099511627776 bytes, 2147483648 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 1938A24D-F234-4DAE-958D-964B26179408

Device       Start        End    Sectors  Size Type
/dev/sdb1       34       2047       2014 1007K BIOS boot
/dev/sdb2     2048    2099199    2097152    1G EFI System
/dev/sdb3  2099200 2147483614 2145384415 1023G Solaris /usr & Apple ZFS


Disk /dev/sdc: 128 GiB, 137438953472 bytes, 268435456 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdd: 2 TiB, 2199022206976 bytes, 4294965248 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sde: 2 TiB, 2199022206976 bytes, 4294965248 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdf: 2 TiB, 2199022206976 bytes, 4294965248 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Cette liste va nous permettre d’identifier les disques et de mapper les lecteurs éphémères tels que /dev/sda et ata-HGST_HDN728080ALE604_R6GPPDTY qui est l’ID. du disque dur.

Inversement, pour l’identification du lecteur éphémère, on peut le faire en utilisant cette commande :

root@homelab:~# ls -l /dev/disk/by-id/ata-HGST_HDN728080ALE604_R6GPPDTY
lrwxrwxrwx 1 root root 9 Sep  9 23:08 /dev/disk/by-id/ata-HGST_HDN728080ALE604_R6GPPDTY -> ../../sda

Par conséquent, nous pouvons vérifier que /dev/sda est mappé sur ce lecteur physique.

!!! warning N’utilisez jamais /dev/sdX comme solution à long terme pour l’identification du lecteur, car ces identifiants peuvent changer et changent sans avertissement en raison d’autres modifications matérielles, mises à niveau du noyau, etc…

L'identifiant `/dev/disk/by-id` est lié à cet élément spécifique du matériel, par modèle de lecteur et numéro de série et **ne changera donc jamais**.

Partitionnement
#

Avant de créer une partition sur un disque dur fraichement sorti de son emballage, assurez-vous de l’avoir « gravé » comme explicité ici : Rituel de gravure de disque dur neuf.

ATTENTION - Nous sommes sur le point d’effectuer des étapes destructrices sur la table de partition du lecteur. S’il y a des données existantes sur ce disque, elles seront effacées. Assurez-vous d’être prudent et réfléchi auquel cas vous allez perdre vos données !

Les étapes suivantes nécessiteront un accès root. En utilisant notre exemple de lecteur de la section précédente, nous utiliserons l’utilitaire cfdisk et ou sgdisk pour créer une nouvelle partition et un nouveau système de fichiers.

Faisons l’exercice pour le disque qui nous servira de disque de parité pour Snapraid. Le processus sera le même pôur les disques de données.

Si le disque n’est pas vide et que vous souhaitez repartir sur un disque nu.

Suppression des tables de partition (le volume apparaît comme sans table de partition) :

root@homelab:~# sgdisk /dev/sdd -Z

Création d’une table de partition gpt et vérification du disque :

proxmox-hdd-partition-cfdisk
Partionnement d’un disque<

Création du système de fichiers
#

Créez un système de fichiers ext4 (remplacez X par votre lettre de lecteur) avec une étiquette :

root@homelab:~# mkfs.ext4 -L PARITY /dev/sdd1
Disk /dev/sdd: 2 TiB, 2199022206976 bytes, 4294965248 sectors
Disk model: VBOX HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 80560CA3-03D0-134F-9107-6B1DE289A724

Device     Start        End    Sectors Size Type
/dev/sdd1   2048 4294963199 4294961152   2T Linux filesystem
root@homelab:~# mkfs.ext4 /dev/sdd1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 536870144 4k blocks and 134217728 inodes
Filesystem UUID: 810c4257-aa5c-447f-b839-545e37ad7bcf
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000, 214990848, 512000000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

Votre nouveau disque est maintenant formaté et prêt à stocker des données.

Points de montage
#

Les points de montage sont l’endroit où le système d’exploitation monte une partition de disque spécifique. Par exemple, vous pouvez avoir plusieurs partitions sur le même disque montées à différents endroits pour des raisons de redondance ou de performances. Pour nos besoins ici, nous garderons les choses simples en montant chaque partition de disque de données une par une.

En supposant que le test précédent s’est bien passé, il est temps de proposer un schéma de dénomination des points de montage. Je vous recommande /mnt/diskN car il simplifie l’entrée fstab pour les fusions grâce à la prise en charge des caractères génériques Linux.

!!! abstract “Note” N’oubliez pas de répéter le partitionnement des disques de données au préablable via cfdisk comme vu précédemment sur le disque de parité /dev/sdd.

!!! warning ATTENTION - Nous sommes sur le point d’effectuer des étapes destructrices sur la table de partition du lecteur. S’il y a des données existantes sur ce disque, elles seront effacées. Assurez-vous d’être prudent et réfléchi auquel cas vous allez perdre vos données !

Par exemple:

root@homelab:~# mkdir /mnt/parity
root@homelab:~# mount /dev/sdd1 /mnt/parity
# ON PEUT AUSSI MONTER LA PARTITION VIA SON ID
# ls -l /dev/disk/by-id/
root@homelab:~# mount /dev/disk/by-id/ata-VBOX_HARDDISK_VB2ff4aa6e-3b5752ba-part1 /mnt/parity
# ON PEUT ENCORE MONTER LA PARTITION VIA SON UUID
# ls -l /dev/disk/by-uuid/
root@homelab:~# mount /dev/disk/by-uuid/255626b6-4990-4a78-85f2-00a84393719c /mnt/parity

root@homelab:~# mkfs.ext4 -L DATA01 /dev/sde1
root@homelab:~# mkfs.ext4 -L DATA02 /dev/sdf1
root@homelab:~# mkdir /mnt/data0{1,2}
root@homelab:~# mount /dev/sde1 /mnt/data01
root@homelab:~# mount /dev/sdf1 /mnt/data02

root@homelab:~# mkdir /mnt/storage
Entrées FSTAB
#

Ensuite, nous devons créer une entrée dans /etc/fstab. Ce fichier indique à votre système d’exploitation comment, où et quels disques monter. Cela semble un peu complexe mais une entrée fstab est en fait assez simple et se décompose en :

  • device > mountpoint > filesystem > options > dump >fsck - documentation fstab.
Via l’ID des disques durs
#
root@homelab:~# vi /etc/fstab

# MERGERFS
/dev/disk/by-id/ata-VBOX_HARDDISK_VB2ff4aa6e-3b5752ba-part1 /mnt/parity ext4 defaults 0 0
/dev/disk/by-id/ata-VBOX_HARDDISK_VB41f1fa4d-a2c11c14-part1 /mnt/data01 ext4 defaults 0 0
/dev/disk/by-id/ata-VBOX_HARDDISK_VBbc16d229-98501233-part1 /mnt/data02 ext4 defaults 0 0

# Notez que mergerfs ne monte pas le lecteur de parité, il monte uniquement /mnt/data0*.
# Mergerfs n'a rien à voir avec la parité, pour cela, nous utilisons SnapRAID.
/mnt/data0* /mnt/storage fuse.mergerfs defaults,nonempty,cache.files=off,category.create=epmfs,moveonenospc=true,dropcacheonclose=true,minfreespace=5G,fsname=mergerfs 0 0
Via l’UUID des disques durs
#
root@homelab:~# vi /etc/fstab

# MERGERFS
UUID="255626b6-4990-4a78-85f2-00a84393719c" /mnt/parity ext4 defaults 0 0
UUID="0ff04694-f4ca-4442-8d58-7ec2b23ad3a8" /mnt/data01 ext4 defaults 0 0
UUID="32b0ee6b-6cc4-44ce-8ed1-866138365a50" /mnt/data02 ext4 defaults 0 0

# Notez que mergerfs ne monte pas le lecteur de parité, il monte uniquement /mnt/data0*.
# Mergerfs n'a rien à voir avec la parité, pour cela, nous utilisons SnapRAID.
/mnt/data0* /mnt/storage fuse.mergerfs defaults,nonempty,cache.files=off,category.create=epmfs,moveonenospc=true,dropcacheonclose=true,minfreespace=5G,fsname=mergerfs 0 0

Visualisation des points de montage :

root@homelab:~# df -h
Filesystem        Size  Used Avail Use% Mounted on
udev              3.9G     0  3.9G   0% /dev
tmpfs             794M  836K  793M   1% /run
rpool/ROOT/pve-1  985G  1.8G  983G   1% /
tmpfs             3.9G   43M  3.9G   2% /dev/shm
tmpfs             5.0M     0  5.0M   0% /run/lock
mergerfs          4.0T   56K  3.8T   1% /mnt/storage
/dev/sdc          125G   40K  119G   1% /mnt/iso
/dev/sdf1         2.0T   28K  1.9T   1% /mnt/data01
/dev/sdd1         2.0T   28K  1.9T   1% /mnt/parity
/dev/sde1         2.0T   28K  1.9T   1% /mnt/data02
rpool/pgdata      983G  128K  983G   1% /var/lib/postgresql
rpool/var-lib-vz  983G  128K  983G   1% /var/lib/vz
rpool             983G  128K  983G   1% /rpool
rpool/ROOT        983G  128K  983G   1% /rpool/ROOT
rpool/data        983G  128K  983G   1% /rpool/data
/dev/fuse         128M   16K  128M   1% /etc/pve
tmpfs             794M     0  794M   0% /run/user/0
Options de montage de mergerfs
#

La documentation : https://github.com/trapexit/mergerfs?tab=readme-ov-file#options et le rappel de la politique de stockage utilisée

  • minfreespace = SIZE :
    • valeur d’espace minimale utilisée pour les stratégies de création. Peut être remplacé par une option spécifique à la branche. Comprend « K », « M » et « G » comme représentant respectivement le kilo-octet, le mégaoctet et le gigaoctet. (par défaut : 4G)
  • moveonenospc = BOOL|POLICY :
    • Lorsqu’elle est activée si une écriture échoue avec ENOSPC (aucun espace disponible sur l’appareil) ou EDQUOT (quota de disque dépassé), la stratégie sélectionnée s’exécutera pour trouver un nouvel emplacement pour le fichier. Une tentative de déplacement du fichier vers cette branche se produira (en gardant toutes les métadonnées possibles) et en cas de succès, l’original sera dissocié et l’écriture sera réessayée. (par défaut : faux, vrai = mfs)
  • dropcacheonclose = BOOL :
    • Lorsqu’il est demandé de fermer un fichier, appelez d’abord posix_fadvise pour indiquer au noyau que nous n’avons plus besoin des données et qu’il peut supprimer son cache. Recommandé lorsque cache.files=partial|full|auto-full|per-process pour limiter la double mise en cache. (par défaut : faux)
  • category.action = POLICY :
    • Définit la politique de toutes les fonctions FUSE dans la catégorie d’action. (par défaut : epall)
  • category.create = POLICY :
    • Définit la politique de toutes les fonctions FUSE dans la catégorie de création. (par défaut : epmfs)
  • category.search = POLICY :
    • Définit la politique de toutes les fonctions FUSE dans la catégorie de recherche. (par défaut : ff)
  • cache.files = libfuse|off|partial|full|auto-full|per-process :
    • Mode de mise en cache des pages de fichiers (par défaut : libfuse)
  • fsname = STR :
    • Définit le nom du système de fichiers tel qu’il apparaît dans mount, df, etc. La valeur par défaut est une liste des chemins sources concaténés avec le préfixe commun le plus long supprimé.

Afin de recharger les nouvelles entrées fstab que nous avons créées et de les vérifier avant de redémarrer, montons-les

root@homelab:~# mount -a

Vérifiez ensuite les points de montage avec df -h ou enocre duf :

root@homelab:~# 

Exemple d’arborescence des fichiers
#

root@homelab:/# tree /mnt/data01

/mnt/data01/
├── lost+found
└── media
    ├── musics
    ├── photos
    └── videos

root@homelab:/# tree /mnt/data02
/mnt/data02
├── backups
│   └── proxmox
├── docker
│   └── appdata
└── lost+found

root@homelab:/# tree /mnt/storage
/mnt/storage/
├── backups
│   └── proxmox
├── docker
│   └── appdata
├── lost+found
└── media
    ├── musics
    ├── photos
    └── videos

SnapRAID
#

SnapRAID est un programme de sauvegarde conçu pour les baies de disques, stockant les informations de parité pour la récupération des données en cas de panne de disque maximum.

Principalement destiné aux centres multimédia domestiques avec des fichiers volumineux et rarement modifiés, SnapRAID offre plusieurs fonctionnalités :

  • Vous pouvez utiliser des disques déjà remplis de fichiers sans avoir besoin de les reformater, en y accédant comme d’habitude,
  • Toutes vos données sont hachées pour garantir leur intégrité et éviter toute corruption silencieuse,
  • Lorsque le nombre de disques défaillants dépasse le nombre de parité, la perte de données se limite aux disques concernés ; les données sur d’autres disques restent accessibles,
  • Si vous supprimez accidentellement des fichiers sur un disque, la récupération est possible,
  • Les disques peuvent avoir différentes tailles,
  • Vous pouvez ajouter des disques à tout moment,
  • SnapRAID ne verrouille pas vos données ; vous pouvez arrêter de l’utiliser à tout moment sans reformater ni déplacer de données,
  • Pour accéder à un fichier, un seul disque doit tourner, ce qui permet d’économiser de l’énergie et de réduire le bruit.

Installation
#

SnapRAID ne fournit pas de packages, nous devons donc le compiler nous-mêmes à partir des sources :

root@homelab:/# wget https://github.com/amadvance/snapraid/releases/download/v12.3/snapraid-12.3.tar.gz
root@homelab:/# tar xvf snapraid-12.3.tar.gz
root@homelab:/# cd snapraid-12.3
root@homelab:/# apt install build-essential
root@homelab:/# ./configure
root@homelab:/# make
root@homelab:/# make check
root@homelab:/# make install

Vérifiez l’installation réussie avec :

root@homelab:/# snapraid --version
root@homelab:~# snapraid smart

SnapRAID SMART report:

   Temp  Power   Error   FP Size
      C OnDays   Count        TB  Serial               Device    Disk
 -----------------------------------------------------------------------
      -      -       -    -  2.2  VB2ff4aa6e-3b5752ba  /dev/sdd  -
      -      -       -    -  2.2  VBbc16d229-98501233  /dev/sde  -
      -      -       -  SSD  1.1  VB4fd111ed-7ccb2978  /dev/sdb  -
      -      -       -    -  2.2  VB41f1fa4d-a2c11c14  /dev/sdf  -
      -      -       -    -  0.1  VBb598f427-91b62771  /dev/sdc  -
      -      -       -  SSD  1.1  VB4d776a0a-b24c3eb0  /dev/sda  -

The FP column is the estimated probability (in percentage) that the disk
is going to fail in the next year.

Probability that at least one disk is going to fail in the next year is 0%.

Configuration
#

Création du fichier de configuration /etc/snapraid.conf :

# PRÉREQUIS
root@homelab:/# mkdir /var/snapraid

# CONFIGURATION
root@homelab:/# vi /etc/snapraid.conf

# SnapRAID configuration file
# Parity location(s)
parity /mnt/parity/snapraid.parity

# Content file location(s)
content /var/snapraid.content
content /mnt/data01/snapraid.content
content /mnt/data02/snapraid.content

# Data disks
data data01 /mnt/data01
data data02 /mnt/data02

# Excludes hidden files and directories
exclude *.unrecoverable
exclude /tmp/
exclude /lost+found/
exclude downloads/
exclude appdata/
exclude *.!sync
exclude .AppleDouble
exclude ._AppleDouble
exclude .DS_Store
exclude ._.DS_Store
exclude .Thumbs.db
exclude .fseventsd
exclude .Spotlight-V100
exclude .TemporaryItems
exclude .Trashes
exclude .AppleDB
exclude .nfo

On peut vérifier le status de Snapraid après la création du fichier de configuration :

root@homelab:~# snapraid status

Self test...
Loading state from /var/snapraid.content...
WARNING! Content file '/var/snapraid.content' not found, attempting with another copy...
Loading state from /mnt/data01/snapraid.content...
WARNING! Content file '/mnt/data01/snapraid.content' not found, attempting with another copy...
Loading state from /mnt/data02/snapraid.content...
No content file found. Assuming empty.
Using 0 MiB of memory for the file-system.
SnapRAID status report:

   Files Fragmented Excess  Wasted  Used    Free  Use Name
            Files  Fragments  GB      GB      GB
       0       0       0     0.0       0       -   -  data01
       0       0       0     0.0       0       -   -  data02
 --------------------------------------------------------------------------
       0       0       0     0.0       0       0   0%

WARNING! Free space info will be valid after the first sync.
The array is empty.

À ce stade, on est prêt à lancer la commande snapraid sync pour créer les informations de parité :

root@homelab:~# snapraid sync

Self test...
Loading state from /var/snapraid.content...
WARNING! Content file '/var/snapraid.content' not found, attempting with another copy...
Loading state from /mnt/data01/snapraid.content...
WARNING! Content file '/mnt/data01/snapraid.content' not found, attempting with another copy...
Loading state from /mnt/data02/snapraid.content...
No content file found. Assuming empty.
Scanning...
Scanned d1 in 0 seconds
Scanned d2 in 0 seconds
Using 0 MiB of memory for the file-system.
Initializing...
Resizing...
Saving state to /var/snapraid.content...
Saving state to /mnt/data01/snapraid.content...
Saving state to /mnt/data02/snapraid.content...
Verifying...
Verified /var/snapraid.content in 0 seconds
Verified /mnt/data01/snapraid.content in 0 seconds
Verified /mnt/data02/snapraid.content in 0 seconds
Nothing to do

Automatisation du calcul de la parité
#

Comme SnapRAID est conçu pour fonctionner en prenant des instantanés, nous devons les configurer pour qu’ils soient calculés à intervalles réguliers. Nous pourrions simplement créer une tâche cron très simple et exécuter la synchronisation Snapraid dans le cadre de ce processus, mais il y a quelques situations dans lesquelles nous voulons un peu plus d’intelligence qu’un simple cron.

Pour ce faire, nous allons utiliser snapraid-runner qui est un utilitaire fiable pour ajouter des portes logiques à l’exécution de SnapRAID.

Ssnapraid-runner exécute Snapraid et envoie sa sortie à la console, à un fichier journal et par e-mail. Tout cela est configurable. Il peut être exécuté manuellement, mais son objectif principal est d’être exécuté via le planificateur cronjob de Linux ou encore Windows.

Pour installer, on commence par cloner le dépôt git :

root@homelab:/# git clone https://github.com/Chronial/snapraid-runner.git /opt/snapraid-runner

Ensuite, on s’assure qu’on a bien configuré le fichier de configuration de Snapraid :

root@homelab:/# cd /opt/snapraid-runner/
root@homelab:/opt/snapraid-runner# mv /opt/snapraid-runner/snapraid-runner.conf.example /opt/snapraid-runner/snapraid-runner.conf
root@homelab:/opt/snapraid-runner# vi snapraid-runner.conf

[snapraid]
; path to the snapraid executable (e.g. /bin/snapraid)
executable = /usr/local/bin/snapraid
; path to the snapraid config to be used
config = /etc/snapraid.conf
; abort operation if there are more deletes than this, set to -1 to disable
deletethreshold = 40
; if you want touch to be ran each time
touch = true

[logging]
; logfile to write to, leave empty to disable
file = snapraid.log
; maximum logfile size in KiB, leave empty for infinite
maxsize = 5000

[email]
; when to send an email, comma-separated list of [success, error]
sendon = success,error
; set to false to get full programm output via email
short = true
subject = [SnapRAID] Status Report:
from =
to =
; maximum email size in KiB
maxsize = 500

[smtp]
host = smtp.gmail.com
port = 587
ssl = false
tls = true
user = me@gmail.com
# generate an app specific password : https://support.google.com/accounts/answer/185833?hl=en 
password = password

[scrub]
; set to true to run scrub after sync
enabled = true
; scrub plan - either a percentage or one of [bad, new, full]
plan = 12
; minimum block age (in days) for scrubbing. Only used with percentage plans
older-than = 10

Modifiez le fichier de configuration pour snapraid-runner, un fichier par défaut est fourni dans /opt/snapraid-runner/snapraid-runner.conf.example.

Les paramètres suivants sont les plus intéressants lors de la configuration de ce fichier :

  • config = /etc/snapraid.conf - Assurez-vous que cela indique l’endroit où votre fichier snapraid.conf est stocké,
  • deletethreshold = 40 - abandonner l’opération s’il y a plus de suppressions que cela, définir sur -1 pour désactiver,
  • touch = True - Cela améliore la capacité de SnapRAID à reconnaître les fichiers déplacés et copiés, car cela rend l’horodatage presque unique, supprimant ainsi les doublons possibles,
  • [email] - Si vous utilisez Gmail, vous devrez générer un mot de passe spécifique à l’application
  • [scrub] - Configurer les fonctionnalités de vérification périodique des données :
    • enabled = True
    • plan = 12 - Le % du tableau à nettoyer,
    • older-than = 10 - Nettoyer les données uniquement si elles datent de plus de ce nombre de jours.

Enfin, on crée une tâche cron pour exécuter automatiquement snapraid-runner. On doit s’assurer que les fichiers pour lesquels SnapRAID vérifie la parité ne changent pas pendant cette période. Idéalement, vers 4 ou 5 heures du matin, ce serait également une bonne idée de désactiver temporairement tous les services qui écrivent sur votre stockage pendant cette période - cela est cependant facultatif.

root@homelab:/# crontab -e

00 01 * * * python3 /opt/snapraid-runner/snapraid-runner.py -c /opt/snapraid-runner/snapraid-runner.conf && curl -fsS --retry 3 https://healthchecks.allfabox.fr/ > /dev/null

Lors d’une synchronisation, SnapRAID écrira un fichier .content dans /var/snapraid et nécessitera donc un accès en écriture à ce répertoire. L’exécution via sudo ou en tant que root est ici une solution simple et fiable.

Avec cron, c’est une bonne idée d’être aussi explicite que possible en ce qui concerne les chemins de fichiers. Ne vous fiez jamais aux chemins relatifs ou à la variable PATH. Peut-être avez-vous également remarqué qu’un contrôle de santé est configuré sur hc-ping.com.

Cas d’utilisation
#

Suppression de dossiers/fichiers
#

Cela vous donnera le chemin absolu du point de vue du système de fichiers :

snapraid diff --test-fmt path

Cela vous permettra de connaître le disque de données du point de vue du tableau Snapraid :

snapraid diff --test-fmt disk

Snapraid ne s’attend pas à ce que vous fournissiez le chemin absolu du système de fichiers lors de la réparation des fichiers.

Cela recréera tout fichier supprimé dans l’ensemble du tableau :

snapraid fix -m -v

Cela recréera tout fichier supprimé sur le disque de données d1 :

snapraid fix -m -d d1

Cela recréera le contenu de n’importe quel dossier nommé sample n’importe où dans le tableau :

snapraid fix -m -f sample/

Si vous n’êtes pas sûr de ce qui va se passer, vous pouvez remplacer fix par check ci-dessus et ajouter -v comme ceci :

snapraid check -m -f Example/ -v

Snapraid vous dira alors qu’il y a un problème avec chacun des fichiers correspondant au filtre ou qu’ils sont ok.


NFS/Samba
#

Configurer un partage Samba
#

Installation de Samba
#

sudo apt install samba smbclient cifs-utils

Définir les paramètres globaux de Samba
#

Editer le fichier /etc/samba/smb.conf :

[public]
	comment = Public Folder 
	path = /public 
	writable = yes 
	guest ok = yes 
	guest only = yes 
	force create mode = 775 
	orce directory mode = 775 

[private]
	comment = Private Folder
	path = /private
	writable = yes
	guest ok = no
	valid users = @smbshare
	force create mode = 770
	force directory mode = 770
	inherit permissions = yes

[NUC-Home]
   comment = NUC - Home
   path = /home/docker
   guest ok = no
   read only = no
   browseable = yes
   writeable = yes
   valid users = docker

Créer un utilisateur et un groupe Samba
#

Nous avons besoin du groupe d’utilisateurs de partage Samba pour accéder au partage privé comme spécifié dans la configuration ci-dessus. Nous allons donc créer le groupe comme ci-dessous.

sudo groupadd smbshare

Ajoutez les autorisations nécessaires pour le partage privé.

sudo chgrp -R smbshare /private/
sudo chgrp -R smbshare /public

Définissez les bonnes autorisations de répertoire.

sudo chmod 2770 /private/
sudo chmod 2775 /public

Dans la commande ci-dessus, la valeur 2 au début correspond au stickybit. Cela permet aux fichiers nouvellement créés d’hériter du groupe parent.

Ensuite, créez un utilisateur local sans connexion pour accéder au partage privé :

sudo useradd -M -s /sbin/nologin sambauser

Ajoutez l’utilisateur au groupe de partage Samba créé ci-dessus :

sudo usermod -aG smbshare sambauser

Créez maintenant un mot de passe SMB pour l’utilisateur :

sudo smbpasswd -a sambauser```

Activez le compte créé :
``` bash
sudo smbpasswd -e sambauser

Vérifiez la configuration de Samba
#

Une fois les modifications apportées au fichier de configuration, il est recommandé de le tester à l’aide de la commande ci-dessous :

sudo testparm

Si vous n’avez pas de message d’erreur, on redémarre le service :

sudo systemctl restart nmbd

Accéder aux partages depuis un client
#

Ce guide montre comment accéder aux fichiers partagés à l’aide des systèmes Windows et Linux. Tout d’abord, essayez d’accéder au partage depuis votre ordinateur local.

smbclient '\\localhost\private' -U sambauser

Configurer le partage de fichier sur Freebox OS
#

  • Prérequis :
    • Sur la console d’administration du routeur Freebox : http://mafreebox.freebox.fr/
      • Dans la rubrique Paramètres de la Freebox, puis Partage de fichiers cliquez sur Partages Windows :
        freebox-settings-windows-file-sharing
        Paramétrage du partage Samba sous Freebox OS

Il faudra renseigner le nom d’utilisateur et mot de passe pour accéder au partage et son activation

  • Sur le client Debian :
sudo apt-get install cifs-utils

sudo mkdir /media/freebox/

sudo touch /home/$USER/.smbcredentials

Edition du fichier .smbcredentials* :

sudo nano /home/$USER/.smbcredentials

Dans le fichier, ajoutez les lignes suivantes (remplacez les XXXX par votre login et mot de passe) :

username=freebox
password=mypassword
domain=WORKGROUP

Donnez les droits adéquats au fichier .smbcredentials :

sudo chown -R $USER:root /home/$USER/.smbcredentials
sudo chmod -R 775 /home/$USER/.smbcredentials

Montage à la volée :

sudo mount -t cifs //mafreebox.freebox.fr/Disque\ dur/Vidéos /home/docker/media/videos/freebox -o rw,uid=1000,gid=1000,credentials=/home/docker/.smbcredentials,iocharset=utf8,file_mode=0777,dir_mode=0777

Afin d’avoir un comportement semblable à Windows, c’est-à-dire, retrouver le partage dans l’explorateur de fichier et cela, même après un redémarrage, il faut monter le partage dans le fichier fstab afin que celui-ci soit bien remonter après redémarrage de la machine.

Avant toute modifications, nous allons faire une sauvegarde de l’ancienne configuration :

sudo cp /etc/fstab /etc/fstab.old

À présent, on va ajouter l’accès au partage Freebox dans fstab :

# MONTAGE DU PARTAGE FREEBOX
//192.168.0.254/Disque\ dur    /media/partage    cifs    guest,iocharset=utf8,gid=100,uid=1000,_netdev,file_mode=0777,dir_mode=0777,vers=2.0    0    0

//192.168.0.254\Disque\ dur /media/freebox cifs _netdev,rw,users,credentials=/home/$USER/.smbcredentials,iocharset=utf8,uid=1000,sec=ntlmv2,file_mode=0777,dir_mode=0777,vers=2.00    0    0
  • uid=1000 indique l’id du user local (éviter les conflits de droits),
  • _netdev fait attendre le montage que la partie réseau soit démarrée,
  • rw n’est plus nécessaire (option par défaut),
  • iocharset=utf8 est l’encodage de fichiers.

Avant de redémarrer, il faut tester qu’il n’y a pas d’erreurs (sinon blocage boot) :

mount -a

Tout démonter :

sudo umount -a -t cifs -l

Afin de tester le bon fonctionnement, je vous conseille de redémarrer votre machine et vérifier que vous avez bien accès votre partage Freebox.

Perfect Homelab - Cet article fait partie d'une série.
Partie 6: Cet article

Articles connexes