Introducción
Una copia de seguridad útil es mucho más que ejecutar un comando de archivado. Debes saber qué contiene, comprobar que se puede leer, restaurar el archivo que necesitas y poder supervisar las ejecuciones automáticas.
En este laboratorio, crearás una copia de seguridad de un pequeño espacio de trabajo de una aplicación a partir de un manifiesto, restaurarás un archivo seleccionado, convertirás el proceso en un script con marcas de tiempo e instalarás una tarea programada con Cron. Todas las rutas utilizadas en la automatización son absolutas, de modo que la tarea no depende del directorio actual de un shell interactivo.
Definir el alcance de la copia de seguridad con un manifiesto
En este paso, crearás un manifiesto: una lista de rutas en texto plano que permite consultar y revisar claramente el alcance de la copia de seguridad.
Accede al espacio de trabajo:
cd /home/labex/project/backup-lab
Crea un manifiesto con rutas relativas al directorio data:
cat > backup-manifest.txt <<'EOF'
config/app.conf
documents/runbook.txt
EOF
Numera las entradas para revisarlas con facilidad:
nl -ba backup-manifest.txt
Confirma que todas las fuentes indicadas existen mediante un bucle while. Antes de ejecutarlo, revisa su estructura:
IFS=evita que el shell elimine los espacios en blanco al principio o al final de una línea;read -r itemlee una línea completa enitemsin tratar las barras inversas de forma especial;do ... donedelimita el comando que se repite para cada línea;< backup-manifest.txtproporciona el manifiesto como entrada del bucle;test -fcomprueba que la ruta correspondiente sea un archivo normal, y&&muestrareadyúnicamente cuando la comprobación tiene éxito.
while IFS= read -r item; do
test -f "data/$item" && echo "ready: $item"
done < backup-manifest.txt
El archivo no incluido documents/scratch.txt queda intencionadamente fuera de esta copia de seguridad gestionada.
Crear un archivo a partir del manifiesto
En este paso, utilizarás tar -T para leer los nombres de archivo del manifiesto. La opción -C data hace que el archivo utilice rutas relativas breves.
tar -czf backups/manual-backup.tar.gz -C data -T backup-manifest.txt
Las opciones significan lo siguiente:
-c: crea un archivo;-z: lo comprime con gzip;-f: utiliza el nombre de archivo indicado a continuación;-C data: trabaja de forma relativa adata;-T backup-manifest.txt: lee del manifiesto los elementos que se incluirán en la copia.
Inspecciona el archivo resultante:
ls -lh backups/manual-backup.tar.gz
Compara su marca de tiempo y tamaño con los de los archivos de origen:
stat -c '%n size=%s modified=%y' backups/manual-backup.tar.gz data/config/app.conf data/documents/runbook.txt
Verificar el archivo sin extraerlo
En este paso, comprobarás el archivo antes de confiar en él. Primero, verifica el flujo gzip:
gzip -t backups/manual-backup.tar.gz
Si no se muestra ninguna salida, el flujo comprimido ha superado la comprobación de integridad. Ahora enumera los elementos de tar sin extraerlos:
tar -tzf backups/manual-backup.tar.gz | tee archive-contents.txt
Compara la lista guardada con el manifiesto:
diff -u backup-manifest.txt archive-contents.txt
El comando no debería mostrar diferencias. Confirma que el archivo temporal no gestionado está ausente:
if tar -tzf backups/manual-backup.tar.gz | grep -qx 'documents/scratch.txt'; then
echo "Unexpected scratch file found"
else
echo "Archive scope is correct"
fi
Restaurar un archivo seleccionado
En este paso, restaurarás únicamente un archivo seleccionado para evitar sobrescribir datos no relacionados. Simula la eliminación accidental de la configuración:
rm data/config/app.conf
test -e data/config/app.conf || echo "app.conf is missing"
Extrae únicamente config/app.conf en el directorio de restauración independiente:
rm -rf restore/*
tar -xzf backups/manual-backup.tar.gz -C restore config/app.conf
Inspecciona el archivo recuperado y cópialo de nuevo a su ubicación de trabajo:
cat restore/config/app.conf
cp restore/config/app.conf data/config/app.conf
cmp -s restore/config/app.conf data/config/app.conf && echo "Configuration restored"
Solo se ha extraído el elemento solicitado del archivo.
Crear un script de copia con marca de tiempo
En este paso, crearás un script de copia con marca de tiempo. Cron inicia las tareas con un entorno limitado, por lo que debes utilizar rutas absolutas dentro de los scripts que se ejecuten sin supervisión.
Crea backup.sh:
cat > backup.sh <<'EOF'
#!/bin/bash
source_dir=/home/labex/project/backup-lab/data
manifest=/home/labex/project/backup-lab/backup-manifest.txt
backup_dir=/home/labex/project/backup-lab/backups
timestamp=$(date +%Y%m%d-%H%M%S)
archive="$backup_dir/backup-$timestamp.tar.gz"
mkdir -p "$backup_dir"
if [ ! -d "$source_dir" ] || [ ! -f "$manifest" ]; then
echo "Backup source or manifest is missing" >&2
exit 1
fi
/bin/tar -czf "$archive" -C "$source_dir" -T "$manifest" || exit 1
/bin/tar -tzf "$archive" > "$archive.contents" || exit 1
echo "Created $archive"
exit 0
EOF
Haz que el script sea ejecutable y pruébalo ahora, sin esperar a Cron:
chmod u+x backup.sh
./backup.sh | tee last-backup.txt
ls -1 backups
La marca de tiempo proporciona un nombre de archivo único para cada ejecución. El archivo complementario .contents registra exactamente el contenido del archivo.
Instalar e inspeccionar una tarea programada de Cron
En este paso, instalarás e inspeccionarás una tarea personal de Cron. Una línea de crontab comienza con cinco campos de programación, seguidos del comando:
| Posición | Campo | Rango habitual |
|---|---|---|
| 1 | minuto | 0–59 |
| 2 | hora | 0–23 |
| 3 | día del mes | 1–31 |
| 4 | mes | 1–12 |
| 5 | día de la semana | 0–7, donde el domingo es 0 o 7 |
Un asterisco * representa cualquier valor permitido. Un intervalo como */5 significa cada cinco unidades de ese campo.
minute hour day-of-month month day-of-week command
Por ejemplo, */5 * * * * significa cada cinco minutos. 0 2 * * * significa a las 02:00 todos los días.
crontab -e abre el crontab personal en un editor. Un flujo fiable consiste en preparar e instalar primero una entrada válida y después realizar una pequeña edición interactiva. Crea una entrada que utilice rutas absolutas y capture tanto la salida estándar como los errores estándar:
cat > backup.crontab <<'EOF'
*/5 * * * * /home/labex/project/backup-lab/backup.sh >> /home/labex/project/backup-lab/logs/backup.log 2>&1
EOF
Revísala e instálala:
cat backup.crontab
crontab backup.crontab
Ahora abre el crontab instalado con Nano:
EDITOR=nano crontab -e
Añade este comentario en la línea anterior a la programación:
## LabEx managed backup schedule
Pulsa Ctrl+O y después Enter para guardar. Pulsa Ctrl+X para salir de Nano y volver al shell. Usa crontab -l para confirmar exactamente lo que leerá Cron y guarda esa salida:
crontab -l | tee installed-crontab.txt
La salida debe contener el comentario seguido de la entrada que se ejecuta cada cinco minutos. Revisar el resultado instalado permite detectar errores del editor antes de depender de la programación.
Probar el registro y comprender el escape de porcentajes
En este paso, probarás el registro de las copias de seguridad y aprenderás cómo Cron trata especialmente los signos de porcentaje. Primero, ejecuta manualmente el comando programado:
/home/labex/project/backup-lab/backup.sh >> /home/labex/project/backup-lab/logs/backup.log 2>&1
tail -n 5 logs/backup.log
find backups -maxdepth 1 -type f -name 'backup-*.tar.gz' -printf '%f\n' | sort
La marca de tiempo se crea dentro de backup.sh, donde los caracteres % normales no suponen ningún problema. Sin embargo, Cron trata de forma especial cualquier % sin escapar que aparezca en un comando de crontab. Si incluyes date directamente en una línea de crontab, debes escapar cada signo de porcentaje con una barra inversa.
Guarda un ejemplo correctamente escapado como referencia:
cat > cron-date-example.txt <<'EOF'
0 2 * * * /bin/echo "backup-$(/bin/date +\%Y\%m\%d-\%H\%M\%S)" >> /home/labex/project/backup-lab/logs/date-example.log 2>&1
EOF
cat cron-date-example.txt
La tarea instalada sigue siendo la entrada más sencilla basada en un script. Utiliza rutas absolutas, asigna una marca de tiempo a cada archivo y deja un registro que puedes inspeccionar después de las ejecuciones automáticas.
Resumen
Definiste el alcance de una copia de seguridad en un manifiesto, creaste un archivo con tar -T, lo verificaste sin extraerlo y recuperaste un archivo seleccionado. Después escribiste un script de copia con marca de tiempo y rutas absolutas, instalaste e inspeccionaste una tarea programada de Cron, redirigiste la salida de las ejecuciones automáticas a un registro y aprendiste por qué es necesario escapar los signos de porcentaje cuando date aparece directamente en un comando de crontab.



