Introducción
Una copia de seguridad útil es mucho más que ejecutar un comando de archivado. Debe saber qué contiene, comprobar que se puede leer, restaurar el archivo que necesita y hacer visibles las ejecuciones desatendidas.
En este laboratorio, hará una copia de seguridad de un pequeño espacio de trabajo de una aplicación a partir de un manifiesto, restaurará un archivo seleccionado, convertirá el flujo de trabajo en un script con marca de tiempo e instalará una programación de Cron. Todas las rutas automatizadas son absolutas, por lo que la tarea no depende del directorio actual de un shell interactivo.
Defina el alcance de la copia de seguridad con un manifiesto
En este paso, creará un manifiesto: una lista de rutas en texto plano que permite consultar y revisar el alcance de la copia de seguridad.
Entre en el espacio de trabajo:
cd /home/labex/project/backup-lab
Cree un manifiesto que contenga rutas relativas al directorio data:
cat > backup-manifest.txt <<'EOF'
config/app.conf
documents/runbook.txt
EOF
Numere las entradas para revisarlas más fácilmente:
nl -ba backup-manifest.txt
Confirme que todas las fuentes indicadas existen mediante un bucle while. Lea su estructura antes de ejecutarlo:
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 ... doneencierra 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&&muestrareadysolo 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.
Cree un archivo a partir del manifiesto
En este paso, usará tar -T para leer los nombres de archivo del manifiesto. La opción -C data hace que el archivo use rutas relativas cortas.
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: usa el nombre de archivo indicado a continuación;-C data: opera en relación condata;-T backup-manifest.txt: lee del manifiesto los elementos que se incluirán en la copia de seguridad.
Inspeccione el archivo resultante:
ls -lh backups/manual-backup.tar.gz
Compare su marca de tiempo y tamaño con los archivos de origen:
stat -c '%n size=%s modified=%y' backups/manual-backup.tar.gz data/config/app.conf data/documents/runbook.txt
Verifique el archivo sin extraerlo
En este paso, probará el archivo antes de confiar en él. Primero, compruebe el flujo gzip:
gzip -t backups/manual-backup.tar.gz
Si no aparece ninguna salida, el flujo comprimido ha superado la comprobación de integridad. Ahora, enumere los elementos de tar sin extraerlos:
tar -tzf backups/manual-backup.tar.gz | tee archive-contents.txt
Compare la lista guardada con el manifiesto:
diff -u backup-manifest.txt archive-contents.txt
El comando no debería mostrar diferencias. Confirme 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
Restaure un archivo seleccionado
En este paso, restaurará solamente un archivo seleccionado para no sobrescribir datos que no estén relacionados. Simule la eliminación accidental del archivo de configuración:
rm data/config/app.conf
test -e data/config/app.conf || echo "app.conf is missing"
Extraiga solo 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
Inspeccione el archivo recuperado y, después, cópielo 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 extrajo el elemento solicitado del archivo.
Cree un script de copia de seguridad con marca de tiempo
En este paso, creará un script de copia de seguridad con marca de tiempo. Cron inicia las tareas con un entorno limitado, por lo que debe usar rutas absolutas dentro de los scripts desatendidos.
Cree 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
Haga que el script sea ejecutable y pruébelo ahora, en lugar de esperar a que Cron lo ejecute:
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 .contents asociado registra exactamente el contenido del archivo.
Instale e inspeccione una programación de Cron
En este paso, instalará e inspeccionará una programación 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 * significa 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 de trabajo fiable consiste en preparar e instalar primero una entrada válida y conocida, y después realizar una pequeña edición interactiva. Cree una entrada que use rutas absolutas y capture tanto la salida estándar como la salida de error 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ísela e instálela:
cat backup.crontab
crontab backup.crontab
Ahora abra el crontab instalado en Nano:
EDITOR=nano crontab -e
Añada este comentario en la línea situada encima de la programación:
## LabEx managed backup schedule
Presione Ctrl+O y, después, Enter para guardar. Presione Ctrl+X para salir de Nano y volver al shell. Use crontab -l para confirmar exactamente lo que leerá Cron y guarde esa salida:
crontab -l | tee installed-crontab.txt
La salida debe contener el comentario seguido de la entrada que se ejecuta cada cinco minutos. Inspeccionar el resultado instalado permite detectar errores de edición antes de depender de la programación.
Pruebe el registro y comprenda el escape del signo de porcentaje
En este paso, probará el registro de las copias de seguridad y aprenderá el tratamiento especial que Cron aplica a los signos de porcentaje. Primero, ejecute 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 son seguros. Sin embargo, Cron trata de forma especial un % sin escape en un comando de crontab. Si coloca date directamente en una línea de crontab, escape cada signo de porcentaje con una barra inversa.
Guarde 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. Usa rutas absolutas, asigna una marca de tiempo a cada archivo y deja un registro que puede inspeccionarse después de las ejecuciones desatendidas.
Resumen
Definió el alcance de una copia de seguridad en un manifiesto, creó un archivo con tar -T, lo verificó sin extraerlo y recuperó un archivo seleccionado. Después, escribió un script de copia de seguridad con marca de tiempo y rutas absolutas, instaló e inspeccionó una programación de Cron, redirigió la salida de las ejecuciones desatendidas a un registro y aprendió por qué es necesario escapar los signos de porcentaje cuando date aparece directamente en un comando de crontab.



