RAID 10 Chiffré LUKS + Btrfs sur Alpine Linux
Introduction
Ce guide détaille la mise en place d'un RAID 10 chiffré sur Alpine Linux 3.23, en combinant LUKS pour le chiffrement et Btrfs pour le système de fichiers et la gestion du RAID.
L'architecture repose sur 4 disques : chaque disque est d'abord chiffré individuellement avec LUKS, puis les conteneurs déchiffrés sont assemblés en RAID 10 par Btrfs. On obtient ainsi un stockage à la fois redondant (tolérance à la panne d'un disque par paire miroir) et chiffré au repos.
Architecture
- 4 disques physiques : /dev/vdb, /dev/vdc, /dev/vdd, /dev/vde
- 4 conteneurs LUKS : /dev/mapper/crypt1 à crypt4
- 1 volume Btrfs RAID 10 monté sur /mnt/data
(Les noms de disques sont à adapter selon votre configuration. Utiliser /proc/partitions pour les identifier.)
Sommaire
- 1. Prérequis et identification des disques
- 2. Création des conteneurs LUKS
- 3. Création du volume Btrfs RAID 10
- 4. Scripts de montage et démontage
- 5. Entretien périodique (scrub et balance)
- 6. Simulation de panne et remplacement d'un disque
1. Prérequis et Identification des Disques
Installer les paquets nécessaires et activer le service btrfs-scan pour les montages automatiques :
apk add cryptsetup btrfs-progs
rc-update add btrfs-scan boot
Identifier les disques destinés au RAID en excluant les disques système (RAM et NVMe dans cet exemple) :
grep -vE 'ram|nvme' /proc/partitions
# /dev/vdb, /dev/vdc, /dev/vdd et /dev/vde
2. Création des Conteneurs LUKS
Générer une passphrase aléatoire robuste et chiffrer les quatre disques :
PASS=$(tr -dc 'A-Za-z0-9!@#$%^&*()_+=' < /dev/urandom | head -c 80)
echo "La passphrase du conteneur LUKS est : $PASS"
echo
echo -n "$PASS" | cryptsetup luksFormat -q /dev/vdb --key-file -
echo -n "$PASS" | cryptsetup luksFormat -q /dev/vdc --key-file -
echo -n "$PASS" | cryptsetup luksFormat -q /dev/vdd --key-file -
echo -n "$PASS" | cryptsetup luksFormat -q /dev/vde --key-file -
(CRITIQUE : Noter cette passphrase dans un endroit sûr. Elle sera demandée à chaque montage du RAID. En cas de perte, les données sont irrécupérables.)
Vérifier la bonne création des conteneurs :
for d in vdb vdc vdd vde; do echo "# /dev/$d"; cryptsetup luksDump /dev/$d | head -5; echo; done
Ouvrir les 4 conteneurs LUKS :
echo -n "$PASS" | cryptsetup open /dev/vdb crypt1 --key-file -
echo -n "$PASS" | cryptsetup open /dev/vdc crypt2 --key-file -
echo -n "$PASS" | cryptsetup open /dev/vdd crypt3 --key-file -
echo -n "$PASS" | cryptsetup open /dev/vde crypt4 --key-file -
clear ; echo "# Vérification" ; echo ; ls /dev/mapper/ | grep crypt ; echo
Initialisation sécurisée (optionnel)
Pour écraser les données résiduelles sur les disques, remplir les conteneurs avec des zéros. Cette opération peut prendre plusieurs heures selon la taille des disques :
dd if=/dev/zero of=/dev/mapper/crypt1 bs=1M
dd if=/dev/zero of=/dev/mapper/crypt2 bs=1M
dd if=/dev/zero of=/dev/mapper/crypt3 bs=1M
dd if=/dev/zero of=/dev/mapper/crypt4 bs=1M
3. Création du Volume Btrfs RAID 10
Créer le système de fichiers Btrfs en RAID 10 sur les quatre conteneurs déchiffrés. Le flag -m raid10 concerne les métadonnées et -d raid10 les données :
mkfs.btrfs -m raid10 -d raid10 /dev/mapper/crypt1 /dev/mapper/crypt2 /dev/mapper/crypt3 /dev/mapper/crypt4
(Le warning concernant "failed to open /dev/btrfs-control" est normal lors de la première exécution. Il disparaîtra après un reboot grâce au service btrfs-scan activé précédemment.)
Monter le volume et vérifier :
modprobe btrfs
btrfs rescue create-control-device
btrfs device scan
mkdir -p /mnt/data
mount /dev/mapper/crypt1 /mnt/data
echo ; echo "# Vérification" ; btrfs filesystem show /mnt/data ; echo
(Seul crypt1 est monté explicitement. Btrfs gère le RAID lui-même et accède automatiquement aux quatre conteneurs.)
Nettoyer la variable contenant la passphrase :
unset PASS
4. Scripts de Montage et Démontage
Le RAID chiffré n'est pas monté automatiquement au démarrage : la passphrase doit être saisie manuellement à chaque fois. Ces deux scripts simplifient l'opération.
Script de montage : mount-raid
cat << 'EOF' > /usr/sbin/mount-raid
#!/bin/sh
printf "Passphrase LUKS : "
stty -echo
read PASS
stty echo
echo
echo -n "$PASS" | cryptsetup open /dev/vdb crypt1 --key-file -
echo -n "$PASS" | cryptsetup open /dev/vdc crypt2 --key-file -
echo -n "$PASS" | cryptsetup open /dev/vdd crypt3 --key-file -
echo -n "$PASS" | cryptsetup open /dev/vde crypt4 --key-file -
unset PASS
btrfs device scan
mount /dev/mapper/crypt1 /mnt/data
echo
echo "# Le RAID10 est monté sur /mnt/data"
echo
EOF
chmod 700 /usr/sbin/mount-raid
Le script utilise stty -echo pour masquer la saisie de la passphrase et unset PASS pour la supprimer de la mémoire immédiatement après utilisation. Les permissions 700 restreignent l'exécution à root.
Script de démontage : umount-raid
cat << 'EOF' > /usr/sbin/umount-raid
#!/bin/sh
umount /mnt/data
cryptsetup close crypt1
cryptsetup close crypt2
cryptsetup close crypt3
cryptsetup close crypt4
echo
echo "Le RAID10 est démonté et verrouillé"
echo
EOF
chmod 700 /usr/sbin/umount-raid
Le démontage ferme le volume Btrfs puis verrouille les quatre conteneurs LUKS. Les disques sont alors totalement chiffrés et inaccessibles sans la passphrase.
Usage
# Monter le RAID (saisie de la passphrase)
mount-raid
# Démonter et verrouiller le RAID
umount-raid
5. Entretien Périodique
Btrfs nécessite deux opérations de maintenance régulières pour garantir l'intégrité des données et l'efficacité du stockage.
Scrub mensuel
Le scrub lit toutes les données et vérifie les checksums. En cas d'erreur, Btrfs corrige automatiquement en utilisant la copie RAID :
cat << 'EOF' > /etc/periodic/monthly/btrfs-scrub
#!/bin/sh
/sbin/btrfs scrub start /mnt/data
EOF
chmod +x /etc/periodic/monthly/btrfs-scrub
Balance mensuel
Le balance rééquilibre les données entre les disques. Le paramètre -dusage=50 -musage=50 ne rééquilibre que les blocs remplis à moins de 50%, ce qui limite l'impact sur les performances :
cat << 'EOF' > /etc/periodic/monthly/btrfs-balance
#!/bin/sh
/sbin/btrfs balance start -dusage=50 -musage=50 /mnt/data
EOF
chmod +x /etc/periodic/monthly/btrfs-balance
Activation de cron
S'assurer que crond est actif pour l'exécution des tâches périodiques :
rc-update add crond default
rc-service crond start
(Alpine utilise le répertoire /etc/periodic/ avec les sous-dossiers daily, weekly et monthly, exécutés automatiquement par crond via /etc/crontabs/root.)
6. Simulation de Panne et Remplacement d'un Disque
Cette section décrit la procédure complète en cas de défaillance d'un disque : du constat de panne jusqu'à la reconstruction du RAID. L'exemple simule la perte de /dev/vdc (crypt2).
Étape 1 : Constater la panne
Vérifier l'état du RAID. Un disque manquant apparaîtra avec la mention MISSING :
btrfs filesystem show /mnt/data
# Tu verras "*** Some devices missing" ou " MISSING"
Étape 2 : Monter en mode dégradé
Si le volume n'est pas monté, le monter avec l'option degraded pour accéder aux données malgré le disque manquant :
mount -o degraded /dev/mapper/crypt1 /mnt/data
Vérifier que les données sont toujours accessibles :
ls /mnt/data/
Étape 3 : Remplacer physiquement le disque
- Éteindre le NAS si nécessaire
- Retirer l'ancien disque défaillant
- Installer le nouveau disque
- Redémarrer
- Remonter en mode dégradé : mount -o degraded /dev/mapper/crypt1 /mnt/data
Étape 4 : Identifier et chiffrer le nouveau disque
Identifier le nouveau disque, puis créer un conteneur LUKS avec la même passphrase que les autres disques :
cat /proc/partitions | grep -v ram
# Le nouveau disque devrait apparaître (ex: /dev/vdc)
cryptsetup luksFormat -q /dev/vdc
cryptsetup open /dev/vdc crypt2
ls /dev/mapper/crypt2
Étape 5 : Initialisation sécurisée (optionnel)
dd if=/dev/zero of=/dev/mapper/crypt2 bs=1M status=progress
Étape 6 : Reconstruire le RAID
(IMPORTANT : Ajouter le nouveau disque AVANT de retirer le disque manquant !)
# Ajouter le nouveau disque au RAID Btrfs
btrfs device add /dev/mapper/crypt2 /mnt/data
# Retirer le disque manquant
btrfs device remove missing /mnt/data
# Rééquilibrer les données (reconstruction du RAID 10)
btrfs balance start -dconvert=raid10 -mconvert=raid10 /mnt/data
# Suivre la progression (peut prendre du temps)
btrfs balance status /mnt/data
Étape 7 : Vérifier la reconstruction
# Vérifier que les 4 disques sont présents, sans MISSING
btrfs filesystem show /mnt/data
# Lancer un scrub pour vérifier l'intégrité des données
btrfs scrub start /mnt/data
btrfs scrub status /mnt/data
Mise à Jour des Scripts après Remplacement
Si le nouveau disque a un nom différent de l'ancien (par exemple /dev/vdf au lieu de /dev/vdc), mettre à jour les scripts et configurations qui référencent les noms de disques :
- Le script de montage :
/usr/sbin/mount-raid - Le script de démontage :
/usr/sbin/umount-raid - La configuration smartd (si utilisée) :
/etc/smartd.conf → redémarrer avec rc-service smartd restart
Récapitulatif des Commandes Utiles
# Monter le RAID
mount-raid
# Démonter et verrouiller le RAID
umount-raid
# État du volume Btrfs
btrfs filesystem show /mnt/data
# Statistiques d'erreurs par disque
btrfs device stats /mnt/data
# Lancer un scrub manuellement
btrfs scrub start /mnt/data
btrfs scrub status /mnt/data
# Rééquilibrer les données
btrfs balance start -dusage=50 -musage=50 /mnt/data
btrfs balance status /mnt/data
# Espace utilisé
btrfs filesystem usage /mnt/data
↑ Haut de page