Saltar a contenido

5.3. Copias en Linux

1. Introducción

En servidores Linux, una estrategia de backup bien diseñada es crucial para proteger datos, configuraciones y servicios. Aquí se resumen métodos prácticos, herramientas habituales y formas de programar y restaurar copias.


2. Qué se debe respaldar en Linux

  • Configuración del sistema: /etc, /var/spool/cron, unidades systemd creadas por ti.
  • Datos de aplicaciones y servicios: /var/www, /srv, directorios de aplicaciones.
  • Datos de usuarios: /home o rutas personalizadas.
  • Bases de datos: MySQL/MariaDB, PostgreSQL, etc. (copias lógicas o físicas coordinadas).
  • Logs críticos si son necesarios para auditoría: /var/log (según retención y volumen).

Evita copiar pseudo-sistemas en vivo: /proc, /sys, /dev, /run, /tmp (salvo que sepas lo que haces).


3. Métodos y herramientas

Herramienta Tipo Uso típico Pros Contras
rsync Sin formato propio Sincronizar árboles de directorios local/remoto Rápido, incremental por ficheros, filtros No hay catálogos/versionado nativo
tar Archivo Empaquetar y comprimir conjuntos Estándar, fácil restauración Incrementales complejos, archivos grandes
BorgBackup Repositorio deduplicado Backups versionados cifrados Deduplicación, compresión, cifrado Requiere repo y herramienta
Restic Repositorio deduplicado Backups versionados cifrados Sencillo, múltiples backends Requiere repo y herramienta
LVM snapshots + rsync/tar Snapshot de volumen Copiar datos consistentes en caliente Consistencia a nivel bloque Requiere LVM y gestión de snapshots
Copias BD (mysqldump/pg_dump) Lógicas Exportar bases Sencillas, portables Tiempo/espacio según tamaño

Notas: - Para servicios en producción, combina snapshots (LVM/btrfs/ZFS) o pausas de I/O con backups para consistencia. - Para datos grandes/cambios frecuentes, valora Borg/Restic por deduplicación y retención eficiente.

Uso básico de rsync y tar

  • rsync (sincronizar directorios a un disco/NAS): bash rsync -aHAX --delete /etc /home /var/www /mnt/backup/host1/ Parámetros principales del ejemplo, de forma sencilla:
  • -a → copia recursiva y mantiene permisos, propietarios y fechas.
  • -HAX → conserva enlaces duros, ACLs y atributos extendidos (útil en servidores).
  • --delete → borra en la copia lo que ya no existe en el origen.
  • /etc /home /var/www → carpetas que se copian.
  • /mnt/backup/host1/ → destino del backup (disco, USB, NAS, NFS…).

Más opciones en la documentación de rsync: https://man7.org/linux/man-pages/man1/rsync.1.html

  • tar (backup empaquetado y comprimido): bash sudo tar -czpf /mnt/backup/host1/system-$(date +%F).tar.gz \ --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/tmp / Parámetros principales del ejemplo:
  • sudo → se usa para poder leer todo el sistema de ficheros.
  • -c → crea un nuevo archivo tar.
  • -z → comprime con gzip.
  • -p → mantiene los permisos originales.
  • -f /mnt/backup/host1/system-$(date +%F).tar.gz → ruta y nombre del archivo de copia.
  • --exclude=... → excluye pseudo‑sistemas que no interesa copiar.
  • / → indica que se empaqueta todo el sistema (menos lo excluido).

Más opciones en la documentación de tar: https://man7.org/linux/man-pages/man1/tar.1.html


4. Estrategias de backup

  • Completo: copia total periódica (semanal, por ejemplo).
  • rsync a carpeta fechada: bash rsync -aHAX --delete /etc /home /var/www /mnt/backup/host1/$(date +%F)/
  • tar completo comprimido: bash sudo tar -czpf /mnt/backup/host1/full-$(date +%F).tar.gz \ --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/tmp /
  • Borg/Restic (siempre crean puntos completos deduplicados): bash borg create $BORG_REPO::"{hostname}-{now:%F_%H-%M}" /etc /home /var/www # o restic backup /etc /home /var/www
  • Incremental: cambios desde el último backup.
  • rsync usando referencia de la última copia (duro-enlaces con --link-dest para versionado eficiente): bash BASE=/mnt/backup/host1 PREV=$BASE/latest CURR=$BASE/$(date +%F) mkdir -p "$CURR" rsync -aHAX --delete --link-dest="$PREV" /etc /home /var/www "$CURR/" ln -sfn "$(basename "$CURR")" "$BASE/latest"
  • tar incremental con listado: bash LIST=/mnt/backup/tar.snar sudo tar --listed-incremental="$LIST" -czpf /mnt/backup/incr-$(date +%F).tar.gz \ --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/tmp /
  • Borg/Restic: incrementales automáticos por deduplicación: bash borg create --stats $BORG_REPO::"{hostname}-{now:%F_%H-%M}" /etc /home /var/www restic backup /etc /home /var/www
  • Diferencial: cambios desde el último completo.
  • tar diferencial (reinicia el listado solo tras un completo): bash # Completo (resetea estado) LIST=/mnt/backup/tar.snar : > "$LIST" && sudo tar --listed-incremental="$LIST" -czpf /mnt/backup/full-$(date +%F).tar.gz / # Diferencial posterior (no vaciar LIST) sudo tar --listed-incremental="$LIST" -czpf /mnt/backup/diff-$(date +%F).tar.gz /
  • Con Borg/Restic, se logra efecto diferencial mediante políticas de retención y restaurando desde el último punto requerido; internamente ambos usan deduplicación (no diferencial clásico): bash restic forget --keep-daily 7 --keep-weekly 4 --prune borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 "$BORG_REPO"

Ejemplo típico: completo semanal + incrementales diarios + retención de 4-6 semanas.


5. Destinos habituales

  • Disco local dedicado a copias (no el mismo volumen de datos críticos).
  • NAS/NFS/SMB en otra máquina/host.
  • Servidor remoto vía SSH.
  • Almacenamiento en nube compatible (Restic/Borg con backends remotos, rclone, etc.).

Regla 3-2-1: 3 copias, 2 soportes distintos, 1 fuera del sitio.


6. Programación de backups

6.1. cron (clásico)

Editar el crontab del root o de un usuario de servicio:

sudo crontab -e

Ejemplo: rsync diario a las 21:00 con log:

0 21 * * * /usr/local/sbin/backup_rsync.sh >> /var/log/backup_rsync.log 2>&1

Otros ejemplos de cron:

# Borg: diario 21:15 (requiere variables BORG_* en el script)
15 21 * * * /usr/local/sbin/backup_borg.sh >> /var/log/backup_borg.log 2>&1

# Restic: diario 21:30 usando fichero de entorno
30 21 * * * RESTIC_PASSWORD=**** RESTIC_REPOSITORY=/mnt/backup/restic/host1 \
  /usr/local/sbin/backup_restic.sh >> /var/log/backup_restic.log 2>&1

# MySQL dump: diario 02:30
30 2 * * * mysqldump --single-transaction --routines --events --all-databases \
  | gzip > /mnt/backup/db/mysql-$(date +\%F).sql.gz

6.2. systemd timers

Unidad de servicio: /etc/systemd/system/backup-rsync.service

[Unit]
Description=Backup rsync diario

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/backup_rsync.sh

Temporizador: /etc/systemd/system/backup-rsync.timer

[Unit]
Description=Programación backup rsync diario

[Timer]
OnCalendar=*-*-* 21:00:00
Persistent=true

[Install]
WantedBy=timers.target

Activar:

sudo systemctl daemon-reload
sudo systemctl enable --now backup-rsync.timer

Ejemplos alternativos con Borg y Restic vía systemd:

Servicio Borg /etc/systemd/system/backup-borg.service:

[Unit]
Description=Backup Borg diario
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
EnvironmentFile=/etc/borg/backup.env
ExecStart=/usr/local/sbin/backup_borg.sh

Temporizador Borg /etc/systemd/system/backup-borg.timer:

[Unit]
Description=Programación backup Borg diario

[Timer]
OnCalendar=*-*-* 21:15:00
RandomizedDelaySec=15m
Persistent=true

[Install]
WantedBy=timers.target

Servicio Restic /etc/systemd/system/backup-restic.service:

[Unit]
Description=Backup Restic diario
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
EnvironmentFile=/etc/restic/backup.env
ExecStart=/usr/local/sbin/backup_restic.sh

Temporizador Restic /etc/systemd/system/backup-restic.timer:

[Unit]
Description=Programación backup Restic diario

[Timer]
OnCalendar=*-*-* 21:30:00
RandomizedDelaySec=15m
Persistent=true

[Install]
WantedBy=timers.target

7. Ejemplos prácticos

7.1. rsync a disco/NAS

Script ejemplo /usr/local/sbin/backup_rsync.sh:

#!/usr/bin/env bash
set -euo pipefail

SRCs=(/etc /home /var/www)
DEST=/mnt/backup/host1
DATE=$(date +%F)

mkdir -p "$DEST/$DATE"
rsync -aHAX --delete --numeric-ids \
  --exclude={'/home/*/.cache','/var/www/cache','/var/log/*','/proc','/sys','/dev','/run','/tmp'} \
  "${SRCs[@]}" "$DEST/$DATE/"

# Mantener enlace al último backup
ln -sfn "$DATE" "$DEST/latest"

Montaje NFS/Samba antes del rsync si aplica.

7.2. tar comprimido con exclusiones

sudo tar --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/tmp \
  -czpf /mnt/backup/host1/system-$(date +%F).tar.gz /

7.3. BorgBackup

Inicializar repositorio:

export BORG_REPO=/mnt/backup/borg/host1
export BORG_PASSPHRASE='cambia-esto'
borg init --encryption=repokey "$BORG_REPO"

Crear backup:

borg create --stats --progress \
  "$BORG_REPO"::"{hostname}-{now:%Y-%m-%d_%H-%M}" \
  /etc /home /var/www \
  --exclude /home/*/.cache --exclude /var/log --exclude /proc --exclude /sys --exclude /dev --exclude /run --exclude /tmp

Política de retención y limpieza:

borg prune -v --list "$BORG_REPO" \
  --keep-daily=7 --keep-weekly=4 --keep-monthly=6

7.4. Restic

export RESTIC_REPOSITORY=/mnt/backup/restic/host1
export RESTIC_PASSWORD='cambia-esto'
restic init
restic backup /etc /home /var/www --exclude='**/.cache' --exclude=/var/log
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune

Backends: RESTIC_REPOSITORY puede ser sftp:user@host:/ruta, rclone:remote:path, S3, etc.

7.5. Copias de bases de datos

  • MySQL/MariaDB (lógica):

bash mysqldump --single-transaction --routines --events --all-databases | \ gzip > /mnt/backup/db/mysql-$(date +%F).sql.gz

  • PostgreSQL (lógica):

bash sudo -u postgres pg_dumpall | gzip > /mnt/backup/db/pg-$(date +%F).sql.gz

Para copias físicas consistentes, usar pg_basebackup (PostgreSQL) o parar/replicar para MySQL, o snapshots LVM.

7.6. Snapshot LVM + rsync

VG=vgdata LV=data SNAP=snap_$(date +%F) SIZE=10G
lvcreate -L $SIZE -s -n $SNAP /dev/$VG/$LV
mkdir -p /mnt/$SNAP
mount /dev/$VG/$SNAP /mnt/$SNAP
rsync -aHAX /mnt/$SNAP/ /mnt/backup/lvm/$LV-$(date +%F)/
umount /mnt/$SNAP
lvremove -y /dev/$VG/$SNAP

8. Restauración

  • rsync: sincronizar desde la copia hacia el destino. bash rsync -aHAX /mnt/backup/host1/2025-01-10/ /restore/

  • tar: extraer respetando permisos. bash sudo tar -xzpf system-2025-01-10.tar.gz -C /

  • Borg: bash borg list "$BORG_REPO" borg extract "$BORG_REPO"::host-2025-01-10_21-00 /etc /home

  • Restic: bash restic snapshots restic restore latest --target /restore

  • Bases de datos: bash # MySQL zcat mysql-2025-01-10.sql.gz | mysql -u root -p # PostgreSQL zcat pg-2025-01-10.sql.gz | sudo -u postgres psql


9. Buenas prácticas

  • Definir RPO/RTO y alinear frecuencia y retención.
  • Usar cifrado en tránsito y en reposo (Borg/Restic, ssh, volume encryption).
  • Verificar copias: logs, borg check, restic check, sumas de verificación.
  • Probar restauraciones periódicamente (no solo hacer copias).
  • Separar permisos: usuario/clave específicos de backup, llaves seguras.
  • Monitorizar estados/alertas (cron/systemd+mail, Prometheus, etc.).
  • Mantener al menos una copia fuera del sitio (offsite/cloud) y pruebas de DR.