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:
/homeo 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.