temporarily disable zfs backups

Signed-off-by: Menno van Leeuwen <menno@vleeuwen.me>
This commit is contained in:
2024-11-15 20:44:35 +01:00
parent 0c92e38370
commit cc7686668c

View File

@ -163,145 +163,145 @@
}; };
}; };
environment.etc."local/bin/zfs-backup.sh" = { # environment.etc."local/bin/zfs-backup.sh" = {
mode = "0755"; # mode = "0755";
text = '' # text = ''
#!/bin/bash # #!/bin/bash
set -euo pipefail # set -euo pipefail
DATE=$(date +%Y%m%d-%H%M) # DATE=$(date +%Y%m%d-%H%M)
DATASETS="music astro photos stash isos ai audiobooks vms old_backups services" # DATASETS="music astro photos stash isos ai audiobooks vms old_backups services"
RETAIN_SNAPSHOTS=24 # RETAIN_SNAPSHOTS=24
BACKUP_POOL="backup" # BACKUP_POOL="backup"
SOURCE_POOL="datapool" # SOURCE_POOL="datapool"
log() { # log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" # echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
} # }
ensure_backup_pool() { # ensure_backup_pool() {
if ! zpool list "$BACKUP_POOL" >/dev/null 2>&1; then # if ! zpool list "$BACKUP_POOL" >/dev/null 2>&1; then
log "ERROR: Backup pool '$BACKUP_POOL' does not exist!" # log "ERROR: Backup pool '$BACKUP_POOL' does not exist!"
return 1 # return 1
fi # fi
} # }
check_dataset_exists() { # check_dataset_exists() {
local pool=$1 # local pool=$1
local dataset=$2 # local dataset=$2
zfs list "$pool/$dataset" >/dev/null 2>&1 # zfs list "$pool/$dataset" >/dev/null 2>&1
return $? # return $?
} # }
create_backup_dataset() { # create_backup_dataset() {
local dataset=$1 # local dataset=$1
local source_pool="$SOURCE_POOL" # local source_pool="$SOURCE_POOL"
local backup_pool="$BACKUP_POOL" # local backup_pool="$BACKUP_POOL"
# Get properties from source dataset
local props=$(zfs get -H -o property,value all "$source_pool/$dataset" | \
grep -E '^(compression|recordsize|atime|relatime|xattr|acltype)' | \
awk '{printf "-o %s=%s ", $1, $2}')
log "Creating backup dataset $backup_pool/$dataset with matching properties"
# shellcheck disable=SC2086
zfs create -p ${props} "$backup_pool/$dataset"
# Set some backup-specific properties
zfs set readonly=on "$backup_pool/$dataset"
zfs set snapdir=visible "$backup_pool/$dataset"
log "Successfully created backup dataset $backup_pool/$dataset"
}
get_latest_snapshot() { # # Get properties from source dataset
local pool=$1 # local props=$(zfs get -H -o property,value all "$source_pool/$dataset" | \
local dataset=$2 # grep -E '^(compression|recordsize|atime|relatime|xattr|acltype)' | \
local snapshot # awk '{printf "-o %s=%s ", $1, $2}')
snapshot=$(zfs list -t snapshot -H -o name "$pool/$dataset" 2>/dev/null | grep backup- | tail -n1) || true
echo "$snapshot"
}
# Ensure backup pool exists # log "Creating backup dataset $backup_pool/$dataset with matching properties"
ensure_backup_pool # # shellcheck disable=SC2086
# zfs create -p ${props} "$backup_pool/$dataset"
for ds in $DATASETS; do # # Set some backup-specific properties
log "Processing dataset $ds" # zfs set readonly=on "$backup_pool/$dataset"
# zfs set snapdir=visible "$backup_pool/$dataset"
# Check if source dataset exists # log "Successfully created backup dataset $backup_pool/$dataset"
if ! check_dataset_exists "$SOURCE_POOL" "$ds"; then # }
log "Skipping $ds - source dataset $SOURCE_POOL/$ds does not exist"
continue
fi
# Create backup dataset if it doesn't exist
if ! check_dataset_exists "$BACKUP_POOL" "$ds"; then
log "Backup dataset $BACKUP_POOL/$ds does not exist"
create_backup_dataset "$ds"
fi
# Create new snapshot
local snapshot_name="$SOURCE_POOL/$ds@backup-$DATE"
log "Creating new snapshot $snapshot_name"
zfs snapshot "$snapshot_name"
LATEST_BACKUP=$(get_latest_snapshot "$BACKUP_POOL" "$ds")
if [ -z "$LATEST_BACKUP" ]; then
log "No existing backup found - performing full backup of $ds"
zfs send "$snapshot_name" | zfs receive -F "$BACKUP_POOL/$ds"
else
LATEST_SOURCE=$(get_latest_snapshot "$SOURCE_POOL" "$ds" | grep -v "backup-$DATE" | tail -n1)
if [ -n "$LATEST_SOURCE" ]; then
log "Performing incremental backup of $ds from $LATEST_SOURCE to backup-$DATE"
zfs send -i "$LATEST_SOURCE" "$snapshot_name" | zfs receive -F "$BACKUP_POOL/$ds"
else
log "No suitable source snapshot found for incremental backup - performing full backup of $ds"
zfs send "$snapshot_name" | zfs receive -F "$BACKUP_POOL/$ds"
fi
fi
log "Cleaning up old snapshots for $ds"
# Cleanup source snapshots
if snapshots=$(zfs list -t snapshot -H -o name "$SOURCE_POOL/$ds" | grep backup-); then
echo "$snapshots" | head -n -$RETAIN_SNAPSHOTS | while read -r snap; do
log "Removing source snapshot: $snap"
zfs destroy "$snap"
done
fi
# Cleanup backup snapshots
if snapshots=$(zfs list -t snapshot -H -o name "$BACKUP_POOL/$ds" | grep backup-); then
echo "$snapshots" | head -n -$RETAIN_SNAPSHOTS | while read -r snap; do
log "Removing backup snapshot: $snap"
zfs destroy "$snap"
done
fi
done
log "Backup completed successfully" # get_latest_snapshot() {
''; # local pool=$1
}; # local dataset=$2
# local snapshot
# snapshot=$(zfs list -t snapshot -H -o name "$pool/$dataset" 2>/dev/null | grep backup- | tail -n1) || true
# echo "$snapshot"
# }
systemd.services.zfs-backup = { # # Ensure backup pool exists
description = "ZFS Backup Service"; # ensure_backup_pool
requires = [ "zfs.target" ];
after = [ "zfs.target" ];
path = [ pkgs.zfs ];
serviceConfig = {
Type = "oneshot";
ExecStart = "/etc/local/bin/zfs-backup.sh";
User = "root";
};
};
systemd.timers.zfs-backup = { # for ds in $DATASETS; do
description = "Run ZFS backup every 4 hours"; # log "Processing dataset $ds"
wantedBy = [ "timers.target" ];
timerConfig = { # # Check if source dataset exists
OnBootSec = "15min"; # if ! check_dataset_exists "$SOURCE_POOL" "$ds"; then
OnUnitActiveSec = "4h"; # log "Skipping $ds - source dataset $SOURCE_POOL/$ds does not exist"
RandomizedDelaySec = "5min"; # continue
}; # fi
};
# # Create backup dataset if it doesn't exist
# if ! check_dataset_exists "$BACKUP_POOL" "$ds"; then
# log "Backup dataset $BACKUP_POOL/$ds does not exist"
# create_backup_dataset "$ds"
# fi
# # Create new snapshot
# local snapshot_name="$SOURCE_POOL/$ds@backup-$DATE"
# log "Creating new snapshot $snapshot_name"
# zfs snapshot "$snapshot_name"
# LATEST_BACKUP=$(get_latest_snapshot "$BACKUP_POOL" "$ds")
# if [ -z "$LATEST_BACKUP" ]; then
# log "No existing backup found - performing full backup of $ds"
# zfs send "$snapshot_name" | zfs receive -F "$BACKUP_POOL/$ds"
# else
# LATEST_SOURCE=$(get_latest_snapshot "$SOURCE_POOL" "$ds" | grep -v "backup-$DATE" | tail -n1)
# if [ -n "$LATEST_SOURCE" ]; then
# log "Performing incremental backup of $ds from $LATEST_SOURCE to backup-$DATE"
# zfs send -i "$LATEST_SOURCE" "$snapshot_name" | zfs receive -F "$BACKUP_POOL/$ds"
# else
# log "No suitable source snapshot found for incremental backup - performing full backup of $ds"
# zfs send "$snapshot_name" | zfs receive -F "$BACKUP_POOL/$ds"
# fi
# fi
# log "Cleaning up old snapshots for $ds"
# # Cleanup source snapshots
# if snapshots=$(zfs list -t snapshot -H -o name "$SOURCE_POOL/$ds" | grep backup-); then
# echo "$snapshots" | head -n -$RETAIN_SNAPSHOTS | while read -r snap; do
# log "Removing source snapshot: $snap"
# zfs destroy "$snap"
# done
# fi
# # Cleanup backup snapshots
# if snapshots=$(zfs list -t snapshot -H -o name "$BACKUP_POOL/$ds" | grep backup-); then
# echo "$snapshots" | head -n -$RETAIN_SNAPSHOTS | while read -r snap; do
# log "Removing backup snapshot: $snap"
# zfs destroy "$snap"
# done
# fi
# done
# log "Backup completed successfully"
# '';
# };
# systemd.services.zfs-backup = {
# description = "ZFS Backup Service";
# requires = [ "zfs.target" ];
# after = [ "zfs.target" ];
# path = [ pkgs.zfs ];
# serviceConfig = {
# Type = "oneshot";
# ExecStart = "/etc/local/bin/zfs-backup.sh";
# User = "root";
# };
# };
# systemd.timers.zfs-backup = {
# description = "Run ZFS backup every 4 hours";
# wantedBy = [ "timers.target" ];
# timerConfig = {
# OnBootSec = "15min";
# OnUnitActiveSec = "4h";
# RandomizedDelaySec = "5min";
# };
# };
} }