temporarily disable zfs backups
Signed-off-by: Menno van Leeuwen <menno@vleeuwen.me>
This commit is contained in:
parent
0c92e38370
commit
cc7686668c
@ -163,145 +163,145 @@
|
||||
};
|
||||
};
|
||||
|
||||
environment.etc."local/bin/zfs-backup.sh" = {
|
||||
mode = "0755";
|
||||
text = ''
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
# environment.etc."local/bin/zfs-backup.sh" = {
|
||||
# mode = "0755";
|
||||
# text = ''
|
||||
# #!/bin/bash
|
||||
# set -euo pipefail
|
||||
|
||||
DATE=$(date +%Y%m%d-%H%M)
|
||||
DATASETS="music astro photos stash isos ai audiobooks vms old_backups services"
|
||||
RETAIN_SNAPSHOTS=24
|
||||
BACKUP_POOL="backup"
|
||||
SOURCE_POOL="datapool"
|
||||
# DATE=$(date +%Y%m%d-%H%M)
|
||||
# DATASETS="music astro photos stash isos ai audiobooks vms old_backups services"
|
||||
# RETAIN_SNAPSHOTS=24
|
||||
# BACKUP_POOL="backup"
|
||||
# SOURCE_POOL="datapool"
|
||||
|
||||
log() {
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
|
||||
}
|
||||
# log() {
|
||||
# echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
|
||||
# }
|
||||
|
||||
ensure_backup_pool() {
|
||||
if ! zpool list "$BACKUP_POOL" >/dev/null 2>&1; then
|
||||
log "ERROR: Backup pool '$BACKUP_POOL' does not exist!"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
# ensure_backup_pool() {
|
||||
# if ! zpool list "$BACKUP_POOL" >/dev/null 2>&1; then
|
||||
# log "ERROR: Backup pool '$BACKUP_POOL' does not exist!"
|
||||
# return 1
|
||||
# fi
|
||||
# }
|
||||
|
||||
check_dataset_exists() {
|
||||
local pool=$1
|
||||
local dataset=$2
|
||||
zfs list "$pool/$dataset" >/dev/null 2>&1
|
||||
return $?
|
||||
}
|
||||
# check_dataset_exists() {
|
||||
# local pool=$1
|
||||
# local dataset=$2
|
||||
# zfs list "$pool/$dataset" >/dev/null 2>&1
|
||||
# return $?
|
||||
# }
|
||||
|
||||
create_backup_dataset() {
|
||||
local dataset=$1
|
||||
local source_pool="$SOURCE_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"
|
||||
}
|
||||
# create_backup_dataset() {
|
||||
# local dataset=$1
|
||||
# local source_pool="$SOURCE_POOL"
|
||||
# local backup_pool="$BACKUP_POOL"
|
||||
|
||||
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"
|
||||
}
|
||||
# # 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}')
|
||||
|
||||
# Ensure backup pool exists
|
||||
ensure_backup_pool
|
||||
# log "Creating backup dataset $backup_pool/$dataset with matching properties"
|
||||
# # shellcheck disable=SC2086
|
||||
# zfs create -p ${props} "$backup_pool/$dataset"
|
||||
|
||||
for ds in $DATASETS; do
|
||||
log "Processing dataset $ds"
|
||||
|
||||
# Check if source dataset exists
|
||||
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
|
||||
# # 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"
|
||||
# }
|
||||
|
||||
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 = {
|
||||
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";
|
||||
};
|
||||
};
|
||||
# # Ensure backup pool exists
|
||||
# ensure_backup_pool
|
||||
|
||||
systemd.timers.zfs-backup = {
|
||||
description = "Run ZFS backup every 4 hours";
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
OnBootSec = "15min";
|
||||
OnUnitActiveSec = "4h";
|
||||
RandomizedDelaySec = "5min";
|
||||
};
|
||||
};
|
||||
# for ds in $DATASETS; do
|
||||
# log "Processing dataset $ds"
|
||||
|
||||
# # Check if source dataset exists
|
||||
# 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"
|
||||
# '';
|
||||
# };
|
||||
|
||||
# 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";
|
||||
# };
|
||||
# };
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user