Curso de Ubuntu 26.04 / Copias de seguridad de configuración, paquetes y datos

Las copias de seguridad de Ubuntu deben establecer qué configuraciones, datos de usuario y datos de aplicaciones se van a restaurar, y almacenarse en una ubicación separada de la fuente original en caso de fallo, además de verificar que realmente se puedan recuperar. Solo con la lista de paquetes y las instantáneas de la VM no se completa la recuperación de datos. Este artículo organiza el alcance de la copia de seguridad y proporciona una pequeña práctica de restauración sin sobrescribir el original.

Decidir primero qué se necesita restaurar

Objetivo Contenido a almacenar y elementos a verificar
Configuración Archivos /etc modificados, la razón de la modificación y la versión del servicio. Certificados y claves secretas con acceso restringido
Datos de usuario Ruta real de home/compartida, UID/GID, si se necesitan permisos/ACL/atributos extendidos
Datos de la aplicación Volcado de base de datos, volúmenes, archivos subidos, versión de la aplicación y procedimientos para asegurar consistencia
Información del paquete Lista de instalación manual de APT·Versión completa·Lista de Snap·Información del repositorio
Medios de recuperación Medios de instalación·Consola·Clave de descifrado·Clave de descifrado de respaldo y responsabilidad de almacenamiento

Si se copian los archivos de la base de datos en ejecución simplemente con tar, se pueden mezclar contenidos de diferentes momentos. Verifique si es necesario usar los procedimientos de volcado o parada/congelación que admite la aplicación y restaurar varios repositorios juntos. Para materiales que requieren ACL o atributos extendidos, pruebe por separado si la herramienta seleccionada los conserva y los restaura.

UID y GID son los identificadores numéricos de usuario y grupo. Las listas de control de acceso (ACL) amplían los permisos habituales, y los atributos extendidos guardan metadatos adicionales. Al restaurar, compruebe su correspondencia con las cuentas y las políticas del sistema de destino.

Registrar la ubicación de paquetes y configuraciones

El siguiente comando crea una nueva carpeta de listas en el directorio del usuario sin instalar ni eliminar paquetes. Las listas pueden contener información operativa como nombres de usuario y direcciones de repositorio, por lo que se debe limitar el acceso. Esta lista en sí no contiene el contenido de archivos de configuración ni archivos de usuario.

La salida de dpkg-query -W es un inventario de registros de la base de datos de paquetes, no una prueba de que todos estén instalados actualmente. Puede incluir registros residuales. Consérvelo junto con el estado de instalación si necesita reconstruir exactamente el sistema; apt-mark showmanual tampoco contiene por sí solo la configuración ni los datos.

(
set -eu
umask 077
inventory_dir=$(mktemp -d "$HOME/ubuntu-inventory.XXXXXX")
apt-mark showmanual > "$inventory_dir/apt-manual.txt"
dpkg-query -W -f='${binary:Package}\t${Version}\n' > "$inventory_dir/dpkg-versions.tsv"
if command -v snap >/dev/null 2>&1; then
    snap list > "$inventory_dir/snap-list.txt"
fi
cat /etc/os-release > "$inventory_dir/os-release.txt"
printf "%s\n" "$inventory_dir"
)

Al restaurar, no reinstale siempre la lista completa, revise si los paquetes y repositorios necesarios son compatibles con la versión actual. Si se crea un servidor nuevo, separe los valores que deben ser específicos de cada dispositivo, como machine-id, clave de host SSH y IP fija, de la copia de seguridad de la configuración. La recuperación del mismo servidor y la clonación de un servidor separado son tareas diferentes.

Probar la copia de seguridad y restauración con datos pequeños

Guarde todo el código a continuación en ~/backup-roundtrip-lab.sh y ejecútelo con bash ~/backup-roundtrip-lab.sh. Se requieren tar·sha256sum·cmp y no se usa sudo. Solo se manejan archivos de ejemplo en una nueva carpeta temporal. Dado que la práctica es en el mismo disco, no reemplaza almacenar copias de seguridad independientes.

set -eu
umask 077
lab_dir=$(mktemp -d)
mkdir "$lab_dir/source" "$lab_dir/restored"
printf "original data\n" > "$lab_dir/source/note with spaces.txt"
tar -C "$lab_dir/source" -cpf "$lab_dir/data.tar" .
(
    cd "$lab_dir"
    sha256sum data.tar > data.tar.sha256
    sha256sum -c data.tar.sha256
)
tar -tf "$lab_dir/data.tar"
tar -C "$lab_dir/restored" -xpf "$lab_dir/data.tar"
cmp "$lab_dir/source/note with spaces.txt" "$lab_dir/restored/note with spaces.txt"
printf "Round trip passed: %s\n" "$lab_dir"

El checksum verifica si el archivo archivado sigue siendo igual que al momento de su creación, y la lista de tar comprueba los nombres incluidos. Solo puede considerarse que el contenido del archivo de ejemplo se ha restaurado si cmp final tiene éxito y aparece "Round trip passed". No se ha verificado cifrado, permisos ni ejecución de aplicaciones. No extraiga archivos desconocidos con privilegios de administrador y comience cualquier restauración real en un directorio vacío y aislado.

Hacer una copia de seguridad de la configuración real de Nginx y de la carpeta de usuario

Se apunta a /etc/nginx del servidor donde se realizó la práctica de Nginx y a una carpeta de documentos normales en el home. Seleccione la carpeta real y prepare un estado coherente deteniendo la edición, sincronización y escritura de aplicaciones. Las bases de datos en ejecución o los volúmenes de Docker no se reemplazan con esta copia de seguridad de archivos. Anote el punto de montaje de disco y UUID de la copia de seguridad separada del curso de montaje automático y asegúrese de que sea un dispositivo distinto del original.

Guarde todo lo siguiente en ~/backup-course-data.sh. Se requieren Bash, GNU tar, findmnt de util-linux y realpath/sha256sum de coreutils. El primer argumento es la carpeta de datos del usuario, el segundo es el punto de montaje del disco en sí, y el tercero es el UUID. Como ejemplo, use bash ~/backup-course-data.sh "$HOME/Documents/course-data" /srv/backup UUIDreal, reemplazando todo con valores reales.

set -eu
umask 077
if [ "$#" -ne 3 ]; then
    printf 'Usage: bash backup-course-data.sh SOURCE_DIR BACKUP_MOUNT EXPECTED_UUID\n' >&2; exit 2
fi
source_dir=$(realpath -- "$1")
backup_mount=$(realpath -- "$2")
expected_uuid=$3
case "$source_dir" in
    "$HOME"/*) ;;
    *) printf 'Choose a specific ordinary-data folder inside your home.\n' >&2; exit 1 ;;
esac
test -d "$source_dir"
if [ -z "$expected_uuid" ] || [ "$expected_uuid" = REPLACE_WITH_VERIFIED_UUID ]; then
    printf 'Record the actual backup filesystem UUID first.\n' >&2; exit 1
fi
actual_uuid=$(findmnt -rn --mountpoint "$backup_mount" -o UUID || true)
if [ "$actual_uuid" != "$expected_uuid" ]; then
    printf 'Expected backup filesystem is not mounted; stop.\n' >&2; exit 1
fi
for original in "$source_dir" /etc/nginx; do
    original_uuid=$(findmnt -rn --target "$original" -o UUID)
    if [ -z "$original_uuid" ] || [ "$original_uuid" = "$actual_uuid" ]; then
        printf 'Use a separate verified backup filesystem.\n' >&2; exit 1
    fi
done
case "$backup_mount/" in
    "$source_dir/"*) printf 'Backup must be outside the source tree.\n' >&2; exit 1 ;;
esac
sudo test -d /etc/nginx
df -h "$source_dir" "$backup_mount"
set_dir=$(sudo mktemp -d "$backup_mount/ubuntu-course-backup.XXXXXX")
sudo chmod 0700 "$set_dir"
sudo tar --acls --xattrs --numeric-owner -C / -cpf "$set_dir/nginx.tar" etc/nginx
sudo tar --acls --xattrs --numeric-owner -C "$source_dir" -cpf "$set_dir/user-data.tar" .
sudo sh -c 'cd "$1" && sha256sum nginx.tar user-data.tar > SHA256SUMS && sha256sum -c SHA256SUMS' sh "$set_dir"
printf 'Backup set: %s\n' "$set_dir"

Si no hay montaje o el UUID es diferente, se detiene antes de crear el archivo. Si tiene éxito, mostrará la ruta del nuevo conjunto y OK para ambas sumas de verificación. Como la configuración puede contener información confidencial, el conjunto se limita a root con permisos 0700, pero estos permisos no cifran el contenido ni lo protegen frente a la pérdida del dispositivo. También se deben establecer políticas de almacenamiento y cifrado de respaldos y se debe verificar la preservación de ACL y atributos extendidos restaurando en un sistema de archivos real.

La comparación de UUID evita usar el mismo sistema de archivos, pero no demuestra que el respaldo esté en un disco físico distinto: dos particiones del mismo disco tienen UUID diferentes. Compruebe los dispositivos y su almacenamiento subyacente antes de confiar en la separación frente a fallos. GNU tar archiva normalmente el enlace simbólico, no el contenido externo al que apunta; incluya explícitamente los datos necesarios. La restauración de atributos extendidos también depende del espacio de nombres y de los permisos, por lo que debe verificar los metadatos concretos que su aplicación necesita.

Restaurar en una ubicación separada vacía y comparar con el original

Use solo el conjunto confiable que acaba de crear. Guárdelo como ~/restore-course-data.sh y ejecute bash ~/restore-course-data.sh ruta-del-conjunto-de-respaldo. Extraer únicamente en el nuevo directorio /var/tmp, sin sobrescribir /etc/nginx del sistema o los originales del usuario. Verifique primero el espacio disponible y la correspondencia de UID/GID.

set -eu
if [ "$#" -ne 1 ]; then
    printf 'Usage: bash restore-course-data.sh BACKUP_SET_DIRECTORY\n' >&2; exit 2
fi
set_dir=$(realpath -- "$1")
sudo test -f "$set_dir/SHA256SUMS"
sudo sh -c 'cd "$1" && sha256sum -c SHA256SUMS' sh "$set_dir"
restore_dir=$(sudo mktemp -d /var/tmp/ubuntu-course-restore.XXXXXX)
sudo chmod 0700 "$restore_dir"
sudo mkdir "$restore_dir/config" "$restore_dir/data"
sudo tar --acls --xattrs --same-owner -C "$restore_dir/config" -xpf "$set_dir/nginx.tar"
sudo tar --acls --xattrs --same-owner -C "$restore_dir/data" -xpf "$set_dir/user-data.tar"
sudo ls -ldn "$restore_dir/config/etc/nginx" "$restore_dir/data"
printf 'Isolated restore: %s\n' "$restore_dir"

Coloque la ruta de restauración real en la variable siguiente y compárela con el original que no cambió después del respaldo. La falta de salida de diff y código de salida 0 significa contenido idéntico, 1 significa diferencias. Si el original se modificó después del respaldo, no se asume automáticamente corrupción de respaldo solo por diferencias. Para otros errores, primero investigue permisos y existencia de archivos.

restore_dir=/var/tmp/REPLACE_WITH_PRINTED_RESTORE_DIRECTORY
source_dir="$HOME/Documents/course-data"
sudo diff --no-dereference -r /etc/nginx "$restore_dir/config/etc/nginx"
sudo diff --no-dereference -r "$source_dir" "$restore_dir/data"

Compare el contenido de archivos importantes y los números de propietario/modo de ls -ln, y si es necesario, los ACL y atributos extendidos de getfacl/getfattr. Si no dispone de las herramientas, prepare los paquetes acl y attr. No se considera que la restauración del servicio esté completa solo con la extracción de archivos; la recuperación real de fallos se aplica tras la verificación de la configuración y las pruebas de funcionalidad de la aplicación en un servidor separado. La carpeta de comparación actual se organiza solo con los elementos que haya creado, después de verificar la ruta y el contenido.

Preparar ubicación de almacenamiento independiente y detección de fallos

Al usar un disco externo o un host separado, no se considera que esté conectado solo porque existe un directorio de almacenamiento. Compare los valores SOURCE y UUID del montaje objetivo de findmnt y, si son diferentes, detenga la escritura. Escribir en una carpeta vacía no montada puede llenar el disco del sistema. Diseñe la capacidad de almacenamiento, la posibilidad de descifrado y las generaciones de respaldo en otros lugares o sin conexión según el propósito de recuperación.

La guía de respaldo con scripts de shell de Ubuntu incluye ejemplos de restauración con tar en diferentes directorios.

La automatización se realiza después de exitosas restauraciones manuales. Registre códigos de salida, la última hora de éxito, generaciones de respaldo, espacio insuficiente y compruebe si las alertas de falla se reciben. Poner solo el hash en una ubicación escribible no previene la manipulación, por lo que, si es necesario, también revise registros de verificación independientes o almacenamiento inalterable.

Determinar la finalización de la recuperación mediante los datos y el funcionamiento del servicio

Verifique la cantidad de archivos, el contenido de los archivos importantes, el propietario y los permisos en la ubicación de restauración, y pruebe la lectura y escritura de la aplicación y el inicio de sesión del usuario. Según el objetivo, también se verifican DNS, certificados, comparticiones y reanudación de copias de seguridad. Registre el tiempo de recuperación y el alcance de los cambios perdidos, y si exceden el tiempo permitido o el rango de pérdida, mejore la periodicidad o el procedimiento. No inicialice el disco de origen de la falla antes de asegurar los datos necesarios.