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

(Les noms de disques sont à adapter selon votre configuration. Utiliser /proc/partitions pour les identifier.)

Sommaire


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

É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 :


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