
🌐 Aussi en: English · Deutsch · Español
Au fil des décennies, j’ai accumulé quelques téraoctets de données personnelles.
Surtout des choses comme :
- Photos
- Musique
- Documents
- Vidéos
- Sauvegardes de projets en vrac
Pendant longtemps, tout vivait dans un seul emplacement de stockage central sur mon NAS.
Cela a très bien fonctionné pendant des années… jusqu’à ce que deux problèmes deviennent de plus en plus agaçants :
- La durée des sauvegardes
- Les besoins en stockage
Surtout lorsque je devais réinstaller ou remplacer le système d’exploitation de mon NAS,
la restauration de l’ensemble des données pouvait prendre de nombreuses heures.
À un moment donné, je me suis rendu compte que ma stratégie de données méritait d’être repensée 🤓
Séparer les données actives des archives
Ma configuration actuelle répartit les données en deux catégories.
Données actives
Ce sont les fichiers que j’utilise chaque jour ou chaque semaine.
Ils restent sur mon NAS :
- Coffre-fort de mots de passe (KeePass)
- Documents en cours
- Photos récentes
- Factures pour les prochaines déclarations d’impôts
- Projets en cours
Comme le volume total de données a fortement diminué, j’ai pu changer le matériel de stockage :
Grâce à la quantité de données réduite, j’ai pu remplacer le disque dur HDD de grande capacité utilisé jusque-là par un SSD bien plus rapide, mais de capacité moindre.
Les fichiers du quotidien sont ainsi bien plus réactifs.
Données d’archive
Tout ce dont j’ai rarement besoin a été déplacé vers un disque d’archive externe.
Exemples :
- Anciennes photos
- Anciennes vidéos
- Projets terminés
- Documents historiques
Cette approche présente plusieurs avantages :
- Les sauvegardes sont beaucoup plus rapides
- Le NAS contient beaucoup moins de fichiers
- Les exigences matérielles sont plus faibles
- Le stockage hors ligne réduit le risque de ransomware
Même si j’estime personnellement ce risque plutôt faible, disposer d’un jeu de données hors ligne
ne fait jamais de mal 🙂.
Pourquoi de nombreux petits fichiers sont lents sur ext4
En optimisant mes sauvegardes, j’ai remarqué quelque chose d’intéressant :
Copier de nombreux petits fichiers est considérablement plus lent que copier quelques gros fichiers.
Ce comportement s’explique facilement dès qu’on regarde comment fonctionne ext4.
Chaque fichier nécessite un inode
ext4 est un système de fichiers basé sur les inodes.
Pour chaque fichier, le système de fichiers doit :
- trouver un inode libre
- écrire l’inode
- créer une entrée de répertoire
- allouer des blocs de données
- mettre à jour les métadonnées
Exemple :
1 file of 1 GB → 1 inode
100,000 files of 10 KB → 100,000 inodes
Cela génère une quantité énorme d’E/S de métadonnées.
Résultat :
- plus de déplacements de la tête de lecture
- plus d’écritures dans le journal
- plus d’opérations sur les métadonnées
Autrement dit : une multitude de minuscules fichiers ralentit tout.
La solution : regrouper les petits fichiers dans de grosses archives
Pour régler ce problème, j’ai décidé de regrouper de nombreux petits fichiers image dans de grosses archives.
J’ai demandé à une IA de m’aider à écrire un petit script Bash qui :
- parcourt récursivement mes répertoires de photos
- rassemble les images de chaque dossier
- crée une grosse archive
Détail important :
Aucune compression.
Les images JPEG sont déjà compressées, une compression supplémentaire est donc généralement inutile et ne fait que gaspiller des cycles CPU.
Pourquoi j’ai choisi RAR
Certains demanderont : pourquoi RAR ?
Réponse simple : une longue expérience.
RAR offre quelques fonctionnalités extrêmement utiles pour l’archivage :
Archives fractionnées
Si une archive dépasse une taille limite définie, RAR crée automatiquement des volumes :
jpg_archive.part1.rar
jpg_archive.part2.rar
jpg_archive.part3.rar
Ces volumes vont ensemble et s’extraient sans accroc.
Enregistrements de récupération
RAR peut stocker des informations de récupération à l’intérieur de l’archive.
Cela peut aider à récupérer des données si :
- un secteur du disque devient défectueux
- du bitrot survient
- un fichier d’archive est partiellement corrompu
Pour des archives à long terme, cette fonctionnalité est extrêmement précieuse.
La contrepartie
Bien sûr, cette approche a un inconvénient.
Si je veux accéder à une seule photo, je dois d’abord :
- extraire l’archive
- ouvrir l’image
Mais soyons réalistes :
Combien de fois est-ce que je regarde au hasard une photo de 2007 ?
Voilà 🙂.
Stratégie de sauvegarde
Naturellement, le disque d’archive externe n’est pas la seule copie.
Je conserve plusieurs copies :
- un disque de sauvegarde local
- une autre copie supplémentaire
- une sauvegarde hors site
Cela protège contre :
- les pannes matérielles
- les suppressions accidentelles
- l’incendie ou le vol
- le bitrot
Le script Bash
Voici le script que j’ai utilisé pour regrouper récursivement des fichiers image dans des archives RAR.
#!/bin/bash
# Abort immediately on any error
set -e
# Base directory
BASE_DIR="/media/user3/MASTER/daten/bilder/"
LOG_FILE="$BASE_DIR/jpg_rar_log.txt"
if [[ -z "$BASE_DIR" ]]; then
echo "Please provide the base directory as a parameter."
exit 1
fi
# Check if RAR is installed
if ! command -v rar &> /dev/null; then
echo "RAR is not installed. Please install it and try again."
exit 1
fi
# Initialize logfile
echo "=== JPG RAR Archiving Log $(date) ===" > "$LOG_FILE"
# Recursive directory traversal
find "$BASE_DIR" -type d -print0 | while IFS= read -r -d '' DIR; do
# Skip directory if RAR files already exist
if find "$DIR" -maxdepth 1 -type f -iname "*.rar" -print -quit | grep -q .; then
echo "[SKIP] '$DIR' already contains RAR files."
echo "$(date) | $DIR | SKIPPED | Reason: RAR files present" >> "$LOG_FILE"
continue
fi
# Count JPG files
JPG_COUNT=$(find "$DIR" -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) | wc -l)
if [[ "$JPG_COUNT" -le 5 ]]; then
echo "[SKIP] '$DIR' has only $JPG_COUNT JPGs."
echo "$(date) | $DIR | SKIPPED | Reason: too few JPGs ($JPG_COUNT)" >> "$LOG_FILE"
continue
fi
ARCHIVE_NAME="$DIR/jpg_archive.rar"
echo "[PROCESS] '$DIR' → '$ARCHIVE_NAME' ($JPG_COUNT JPGs)"
# Create archive (null-terminated to support special characters)
if find "$DIR" -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) -print0 | \
xargs -0 rar a -m0 -rr10p -v5000m -ep1 "$ARCHIVE_NAME"; then
# Determine archive size in MB
ARCHIVE_SIZE=$(du -m "$ARCHIVE_NAME" | cut -f1)
# Delete original files
find "$DIR" -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) -exec rm -f {} +
echo "[DONE] Archive successfully created and originals removed."
echo "$(date) | $DIR | SUCCESS | Archive: $ARCHIVE_NAME | Size: ${ARCHIVE_SIZE}MB | JPGs: $JPG_COUNT" >> "$LOG_FILE"
else
echo "[ERROR] Archiving failed, original files remain."
echo "$(date) | $DIR | ERROR | Archive: $ARCHIVE_NAME | JPGs: $JPG_COUNT" >> "$LOG_FILE"
exit 1
fi
done
echo "Finished! Logfile: $LOG_FILE"
Avertissement important
⚠️ Je décline toute responsabilité quant à l’utilisation de ce script.
Un archivage automatisé peut entraîner une perte de données s’il est mal utilisé.
Pensez toujours à :
- tester d’abord sur des copies
- conserver plusieurs sauvegardes
- vérifier vos archives
Ce n’est qu’ensuite que vous devriez envisager de lancer ce genre de chose sur de vraies données.
Prochain article
Après avoir archivé la plupart de mes données, j’ai aussi créé un autre script qui
analyse automatiquement tous les fichiers RAR et vérifie leur intégrité.
Je le présenterai dans le prochain article 🙂.






