创建备份脚本

#!/bin/bash
# ZFS 自动快照和备份脚本
# 适用于 systemd timer 计划任务

SOURCE_POOL="volumes"
BACKUP_POOL="volumes-backup"
SNAPSHOT_PREFIX="autosnap"
LOG_FILE="/var/log/zfs_backup.log"

# 记录日志
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# 生成快照
create_snapshot() {
SNAPSHOT_NAME="${SOURCE_POOL}@${SNAPSHOT_PREFIX}-$(date '+%Y-%m-%d')"
log "创建快照: $SNAPSHOT_NAME"
zfs snapshot -r "$SNAPSHOT_NAME"
}

# 删除旧快照(超过 7 天)
delete_old_snapshots() {
log "清理超过 7 天的快照..."
for SNAPSHOT in $(zfs list -H -t snapshot -o name | grep "^${SOURCE_POOL}@${SNAPSHOT_PREFIX}-" | sort); do
SNAP_DATE=$(echo "$SNAPSHOT" | awk -F'-' '{print $NF}')
if [[ $(date -d "$SNAP_DATE" +%s) -lt $(date -d "7 days ago" +%s) ]]; then
log "删除快照: $SNAPSHOT"
zfs destroy -r "$SNAPSHOT"
fi
done
}

# 执行同步
sync_data() {
log "开始同步数据..."

# 找到最新的快照
LATEST_SNAPSHOT=$(zfs list -t snapshot -o name -s creation | grep "^${SOURCE_POOL}@" | tail -n 1)

if [[ -z "$LATEST_SNAPSHOT" ]]; then
log "未找到快照,无法同步。"
exit 1
fi

DEST_SNAPSHOT="${LATEST_SNAPSHOT/$SOURCE_POOL/$BACKUP_POOL}"

# 确保目标数据集存在
if ! zfs list "$BACKUP_POOL" >/dev/null 2>&1; then
log "目标 zpool 不存在,创建 $BACKUP_POOL..."
zfs create "$BACKUP_POOL"
fi

# 增量同步
PREV_SNAPSHOT=$(zfs list -t snapshot -o name -s creation | grep "^${BACKUP_POOL}@" | tail -n 1)

if [[ -n "$PREV_SNAPSHOT" ]]; then
log "使用增量同步: $PREV_SNAPSHOT -> $LATEST_SNAPSHOT"
zfs send -R -I "$PREV_SNAPSHOT" "$LATEST_SNAPSHOT" | zfs receive -F "$BACKUP_POOL"
else
log "执行完整同步: $LATEST_SNAPSHOT"
zfs send -R "$LATEST_SNAPSHOT" | zfs receive -F "$BACKUP_POOL"
fi

log "同步完成。"
}

# 主逻辑
log "========= ZFS 备份开始 ========="
create_snapshot
delete_old_snapshots
sync_data
log "========= ZFS 备份完成 ========="

exit 0

Systemd Service 文件

创建 /etc/systemd/system/zfs-backup.service

[Unit]
Description=ZFS Snapshot and Backup Service
After=network.target

[Service]
Type=oneshot
ExecStart=/path/to/zfs-backup.sh

Systemd Timer 文件

创建 /etc/systemd/system/zfs-backup.timer

[Unit]
Description=Run ZFS Snapshot and Backup Daily

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

启用定时任务

sudo systemctl daemon-reload
sudo systemctl enable --now zfs-backup.timer