
🌐 También en: English · Deutsch · Français
A lo largo de las últimas décadas he acumulado unos cuantos terabytes de datos personales.
Sobre todo cosas como:
- Fotos
- Música
- Documentos
- Vídeos
- Copias de seguridad de proyectos variados
Durante mucho tiempo todo vivía en una única ubicación de almacenamiento central en mi NAS.
Funcionó bien durante años… hasta que dos problemas empezaron a ser cada vez más molestos:
- La duración de las copias de seguridad
- Las necesidades de almacenamiento
Sobre todo cuando tenía que reinstalar o sustituir el sistema operativo de mi NAS,
restaurar todos los datos podía llevar muchas horas.
En algún momento me di cuenta: mi estrategia de datos necesitaba un replanteamiento 🤓
Separar los datos activos de los de archivo
Mi configuración actual divide los datos en dos categorías.
Datos activos
Son los archivos que uso a diario o cada semana.
Se quedan en mi NAS:
- Gestor de contraseñas (KeePass)
- Documentos actuales
- Fotos recientes
- Facturas para las próximas declaraciones de la renta
- Proyectos en curso
Como el volumen total de datos se redujo mucho, pude cambiar el hardware de almacenamiento:
Gracias a la menor cantidad de datos, pude sustituir el HDD de gran capacidad que usaba hasta entonces por un SSD mucho más rápido y de menor capacidad.
Así los archivos del día a día responden mucho mejor.
Datos de archivo
Todo lo que rara vez necesito se ha trasladado a un disco de archivo externo.
Ejemplos:
- Fotos antiguas
- Vídeos antiguos
- Proyectos terminados
- Documentos históricos
Este enfoque tiene varias ventajas:
- Las copias de seguridad son mucho más rápidas
- El NAS contiene muchos menos archivos
- Los requisitos de hardware son menores
- El almacenamiento sin conexión reduce el riesgo de ransomware
Aunque personalmente considero que el riesgo es bastante bajo, tener un conjunto de datos sin conexión
nunca está de más 🙂.
Por qué muchos archivos pequeños son lentos en ext4
Mientras optimizaba mis copias de seguridad noté algo interesante:
Copiar muchos archivos pequeños es muchísimo más lento que copiar unos pocos grandes.
Este comportamiento es fácil de explicar en cuanto ves cómo funciona ext4.
Cada archivo necesita un inodo
ext4 es un sistema de archivos basado en inodos.
Para cada archivo, el sistema de archivos tiene que:
- encontrar un inodo libre
- escribir el inodo
- crear una entrada de directorio
- asignar bloques de datos
- actualizar los metadatos
Ejemplo:
1 file of 1 GB → 1 inode
100,000 files of 10 KB → 100,000 inodes
Eso genera una cantidad enorme de E/S de metadatos.
El resultado:
- más movimientos del cabezal del disco
- más escrituras en el journal
- más operaciones de metadatos
Dicho de otro modo: montones de archivos diminutos lo ralentizan todo.
La solución: agrupar archivos pequeños en archivos grandes
Para atajar el problema, decidí agrupar muchos archivos de imagen pequeños en grandes archivos contenedores.
Le pedí a una IA que me ayudara a escribir un pequeño script de Bash que:
- recorre de forma recursiva mis directorios de fotos
- reúne las imágenes de cada carpeta
- crea un archivo contenedor grande
Detalle importante:
Sin compresión.
Las imágenes JPEG ya están comprimidas, así que comprimirlas de nuevo no suele servir de nada y solo desperdicia ciclos de CPU.
Por qué elegí RAR
Más de uno preguntará: ¿por qué RAR?
Respuesta sencilla: muchos años de experiencia.
RAR ofrece algunas funciones extremadamente útiles para archivar:
Archivos divididos
Si un archivo supera un límite de tamaño configurado, RAR crea volúmenes automáticamente:
jpg_archive.part1.rar
jpg_archive.part2.rar
jpg_archive.part3.rar
Estos volúmenes van juntos y se pueden extraer sin problemas.
Registros de recuperación
RAR puede guardar información de recuperación dentro del propio archivo.
Esto puede ayudar a recuperar datos si:
- un sector del disco se estropea
- aparece bitrot
- un archivo RAR se corrompe parcialmente
Para archivos a largo plazo, esta función vale su peso en oro.
La contrapartida
Por supuesto, este enfoque tiene un inconveniente.
Si quiero acceder a una sola foto, primero tengo que:
- extraer el archivo
- abrir la imagen
Pero seamos realistas:
¿Cada cuánto me pongo a mirar por gusto una foto de 2007?
Pues eso 🙂.
Estrategia de copias de seguridad
Naturalmente, el disco de archivo externo no es la única copia.
Mantengo varias copias:
- un disco de copia de seguridad local
- otra copia adicional
- una copia de seguridad externa (off-site)
Eso me protege frente a:
- fallos de hardware
- borrados accidentales
- incendios o robos
- bitrot
El script de Bash
Este es el script que usé para agrupar de forma recursiva archivos de imagen en archivos 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"
Advertencia importante
⚠️ No asumo ninguna responsabilidad por el uso que nadie haga de este script.
El archivado automatizado puede provocar pérdida de datos si se usa mal.
Siempre:
- prueba primero con copias
- mantén varias copias de seguridad
- verifica tus archivos
Solo entonces deberías plantearte ejecutar algo así sobre datos reales.
Próximo artículo
Después de archivar la mayor parte de mis datos, también creé otro script que
analiza automáticamente todos los archivos RAR y verifica su integridad.
Lo explicaré en el próximo artículo 🙂.






