4.3 KiB
Script de snapshot locales (SystemD)
Los snpashot o instantáneas se pueden considerar un backup local. Btrfs es una FS (File System, por sus siglas en ingles), que incorpora CoW (Copy on Write, por sus siglas en ingles) que optimiza la gestión de datos al no sobrescribir información. En lugar de modificar datos existentes, CoW escribe los cambios en nuevas ubicaciones, garantizando mayor seguridad ante fallos, snapshots (instantáneas) rápidas, compresión y tolerancia a fallos.
Warning
No se recomienda usar en sistemas RAID 5/6, existen mejores alternativas. Esta opción aún se encuentra en fase experimental.
El presente repositorio es un ejemplo de uso para generar snapshot automáticas cada 24 h mediante bash script y un demonio de SystemD. Es altamente recomendado usar esta técnica para servidores y/u HomeLabs para hacer roll-back en un punto cero.
Note
En este ejemplo se mantienen solo 3 snaphots y se usa para dos unidades de almacenamiento. Se puede modificar el número de unidades y snapshot que se puede usar.
-
Script
Tip
NO es necesario alojarlo en la misma ruta que este ejemplo, si deseas cambiar, tambien debes cambiar la ruta de 'btrfs-backup.service'.
- Copiar script
sudo mkdir -p /root/btrfs sudo touch /root/btrfs/init.sh sudo nano /root/btrfs/init.shNote
Se puede usar cualquier metodo para copiar el script. Se recomienda que el script este en un directorio donde un usuario de bajo no privilegiado pueda acceder. Ya que se puede modificar el script y generar un medio de ataque.
#!/bin/bash set -e # Declarar varables dir_disk=("/dev/nvme0n1p3" "/dev/bcache0") dir_temp=("/tmp/root" "/tmp/srv") dir_create="/tmp/{root,srv}" name_snapshot=$(date +"%m%d%Y") # Crear ruta mkdir -p "$dir_create" #Montar rutas for i in "${!dir_disk[@]}"; do disk_origen="${dir_disk[$i]}" dir_backup="${dir_temp[$i]}" dir_snapshot="$dir_backup/snapshot/daily" #Montar rutas mount "$disk_origen" "$dir_backup" # Verificar que existan rutas, caso contrario crearlas [ -d "$dir_snapshot" ] || mkdir -p "$dir_snapshot" # Hacer snapshot if [ $i -eq 0 ]; then btrfs subvolume snapshot / "$dir_snapshot/$name_snapshot" else btrfs subvolume snapshot /srv "$dir_snapshot/$name_snapshot" fi # Desmontar rutas readarray -t snapshots < <(ls -1 "$dir_snapshot" | sort) total=${#snapshots[@]} if (( total <= 3 )); then echo "Hay $total snapshots, no se elimina nada" continue fi # cuantos borrar borrar=$(( total - 3 )) for (( contador=0; contador<borrar; contador++ )); do echo "Eliminando snapshot: ${snapshots[$contador]}" btrfs subvolume delete "$dir_snapshot/${snapshots[$contador]}" done #Desmontar la ruta umount "$dir_backup" mount | grep btrfs | grep "$dir_backup" || echo "Se desmonto $dir_backup" done- Permisos de ejecución
sudo chmod +x /root/btrfs/init.sh -
Crear el demonio (SystemD)
- Timer
sudo nano /etc/systemd/system/btrfs-backup.timer[Unit] Description=Ejecutar Backup BTRFS a medianoche [Timer] # Se ejecuta a las 00:00 todos los días OnCalendar=*-*-* 00:00:00 # Asegura que si el PC estaba apagado a medianoche, se ejecute al encender Persistent=true [Install] WantedBy=timers.target- Timer
sudo nano /etc/systemd/system/btrfs-backup.service[Unit] Description=Script de Snapshots BTRFS Diarios After=network.target [Service] Type=oneshot ExecStart=/usr/bin/bash /root/btrfs/init.sh User=root Group=root [Install] WantedBy=multi-user.target- Correr el demonio
sudo systemctl daemon-reload sudo systemctl enable --now btrfs-backup.timer
Tips
- Ver tiempo faltante para el siguiente snapshot.
sudo systemctl status btrfs-backup.timer
- Ver los logs y verificar que se crearon correctamente los snapshot.
sudo systemctl status btrfs-backup.service
- Ver los snapshot que existen.
sudo btrfs subvolume show /ruta/deseada/