Files
2026-02-14 15:08:59 -06:00

153 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```
2. 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
```
2. 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
```
3. 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
```
2. Ver los logs y verificar que se crearon correctamente los snapshot.
```
sudo systemctl status btrfs-backup.service
```
3. Ver los snapshot que existen.
```
sudo btrfs subvolume show /ruta/deseada/
```
4