Copias de seguridad y recuperación programadas

LinuxBeginner
Practicar Ahora

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 item lee una línea completa en item sin tratar las barras inversas de forma especial;
  • do ... done encierra el comando que se repite para cada línea;
  • < backup-manifest.txt proporciona el manifiesto como entrada del bucle;
  • test -f comprueba que la ruta correspondiente sea un archivo normal, y && muestra ready solo 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 con data;
  • -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 059
2 hora 023
3 día del mes 131
4 mes 112
5 día de la semana 07, 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.