Files
Servidor-Manuales/btrfs/snapshot-locales/install.md
T
2026-02-14 15:08:59 -06:00

4.3 KiB
Raw Blame History

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 24h 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.

  1. 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'.

    1. Copiar script
    sudo mkdir -p /root/btrfs
    sudo touch /root/btrfs/init.sh 
    sudo nano /root/btrfs/init.sh
    

    Note

    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
    
    1. Permisos de ejecución
    sudo chmod +x /root/btrfs/init.sh
    
  2. Crear el demonio (SystemD)

    1. 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 
    
    1. 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
    
    1. Correr el demonio
    sudo systemctl daemon-reload
    sudo systemctl enable --now btrfs-backup.timer
    

Tips

  1. Ver tiempo faltante para el siguiente snapshot.
sudo systemctl status btrfs-backup.timer
  1. Ver los logs y verificar que se crearon correctamente los snapshot.
sudo systemctl status btrfs-backup.service
  1. Ver los snapshot que existen.
sudo btrfs subvolume show /ruta/deseada/

4