创建备份脚本
#!/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
|