Aller au contenu

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.

# ces étapes supposent une installation Docker valide et fonctionnelle

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.