跳转至

18 - 备份与恢复(rsync、tar、borgbackup、restic)

前提条件

  • 已完成 LVM 逻辑卷、NFS/Samba 共享配置(/mnt/lvmdata/data 目录可用)
  • 以 root 身份登录,或 ops 用户执行 sudo -i 切换至 root 环境
  • 系统运行在 Debian 12 Bookworm
  • 虚拟机环境:VMware Workstation Pro(建议额外磁盘或 NFS 共享作为备份目标)
  • 备份目录约定:/backup(可挂载在独立磁盘或 NFS 共享上)

全局参数

主机名 linuxdc,IP 192.168.1.100/24,SSH 端口 2222,运维用户 ops
备份目录 /backup,源数据目录 /data

备份工具对比

工具 类型 去重 加密 云存储 推荐场景
rsync 增量同步 否(依赖 SSH) 简单目录同步、本地/远程镜像
tar 归档打包 否(可配合 gpg) 单次全量归档、离线存储
borgbackup 去重增量 是(AES-CTR) 否(需 SFTP) 生产服务器本地 + 远程增量备份
restic 去重增量 是(AES-256) 是(S3/B2 等) 需要云存储或多后端的备份场景

详细步骤

1. 准备备份目录

mkdir -p /backup
# 若使用独立磁盘,先挂载再创建目录
# mount /dev/sdc1 /backup

2. rsync — 增量同步(简单可靠)

本地备份 /data/backup

mkdir -p /backup/data-$(date +%Y%m%d)
rsync -avz --delete /data/ /backup/data-$(date +%Y%m%d)/

rsync 常用选项:

选项 说明
-a 归档模式:递归 + 保留权限、时间戳、符号链接、属主
-v 详细输出(生产脚本可改为 -q 静默)
-z 压缩传输(远程传输时节省带宽)
--delete 删除目标中源已不存在的文件(镜像同步)
--exclude='*.tmp' 排除指定模式的文件
--link-dest 硬链接增量备份(节省磁盘空间)
-e "ssh -p 2222" 指定 SSH 端口用于远程传输

远程备份(推送到另一台服务器):

rsync -avz --delete -e "ssh -p 2222" /data/ ops@192.168.1.101:/backup/

--delete 使用风险

--delete 会删除目标目录中在源目录已不存在的文件。若源目录路径填写错误(如 /data/ 写成 /),会导致目标备份被清空。安全做法:先加 --dry-run 预览变更,确认无误再执行实际操作。

添加 systemd timer 定时任务(推荐,替代 cron):

vim /etc/systemd/system/rsync-backup.service
[Unit]
Description=Daily rsync backup

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'rsync -aq --delete /data/ /backup/daily-$(date +%%Y%%m%%d)/'
vim /etc/systemd/system/rsync-backup.timer
[Unit]
Description=Daily rsync backup timer

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

[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now rsync-backup.timer

3. tar — 传统打包归档

全量打包 /data

tar -czvf /backup/data-full-$(date +%Y%m%d).tar.gz /data

增量备份(使用 --listed-incremental 快照文件):

# 首次全量(生成快照文件)
tar -czvf /backup/full.tar.gz \
    --listed-incremental=/backup/snapshot.snar /data

# 后续增量(只打包自上次以来变更的文件)
tar -czvf /backup/inc-$(date +%Y%m%d).tar.gz \
    --listed-incremental=/backup/snapshot.snar /data

恢复全量备份:

tar -xzvf /backup/data-full-20260601.tar.gz -C /

4. borgbackup — 去重加密增量备份(生产推荐)

安装:

apt install -y borgbackup

初始化仓库(选择加密模式):

export BORG_PASSPHRASE='your-strong-passphrase-change-me'
borg init --encryption=repokey-blake2 /backup/borg-repo

密钥安全

repokey 模式将加密密钥存储在仓库内,需要同时备份密钥:borg key export /backup/borg-repo /root/borg-key.bak。将 /root/borg-key.bak 和密码短语保存到离仓库的独立安全位置,否则仓库损坏时无法恢复数据。

borg 加密模式对比:

模式 密钥存储位置 适用场景
repokey-blake2 仓库内(需密码解密) 本地 / 受信任远程,推荐
keyfile-blake2 客户端本地文件 不信任服务端的远程存储
none 无加密 纯内网 / 测试,不推荐生产

创建备份归档:

borg create \
    --stats --progress \
    --exclude '/data/tmp' \
    --exclude-caches \
    /backup/borg-repo::daily-$(date +%Y%m%d) \
    /data

常用管理操作:

borg list /backup/borg-repo                          # 列出所有归档
borg info /backup/borg-repo::daily-20260601          # 查看归档详情
borg extract /backup/borg-repo::daily-20260601 --dry-run  # 预览恢复内容
borg extract /backup/borg-repo::daily-20260601       # 恢复到当前目录

自动清理旧备份(保留策略):

borg prune \
    --keep-daily=7 \
    --keep-weekly=4 \
    --keep-monthly=6 \
    --list \
    /backup/borg-repo

检查点

borg list /backup/borg-repo 显示刚创建的归档条目,borg info 输出压缩率和去重节省空间统计。

5. restic — 多后端云存储备份

安装:

apt install -y restic

初始化本地仓库:

export RESTIC_PASSWORD='your-strong-password'
restic -r /backup/restic-repo init

restic 支持的后端:

后端类型 仓库 URL 格式 说明
本地目录 /backup/restic-repo 最简单,用于测试
SFTP sftp:user@host:/path 通过 SSH 传输
S3 兼容 s3:s3.amazonaws.com/bucket AWS S3 / MinIO
Backblaze B2 b2:bucket-name 成本低,推荐异地备份
REST Server rest:http://host:8000/ 自建 restic REST 服务

执行备份:

restic -r /backup/restic-repo backup /data \
    --exclude '/data/tmp' \
    --tag daily \
    --verbose

常用管理操作:

restic -r /backup/restic-repo snapshots             # 列出快照
restic -r /backup/restic-repo check                 # 验证仓库完整性
restic -r /backup/restic-repo restore latest \
    --target /restore-point                         # 恢复最新快照
restic -r /backup/restic-repo forget \
    --keep-daily 7 --keep-weekly 4 --keep-monthly 6 \
    --prune                                         # 清理旧快照并释放空间

6. 3-2-1 备份策略

生产环境备份的黄金法则:

规则 含义 实现示例
3 份数据副本 生产数据 + 本地备份 + 异地备份 原机 + 本地 NAS + 云存储
2 种存储介质 不同类型的物理存储 磁盘 + Backblaze B2 / S3
1 份离线存储 与网络物理隔离的副本 外部硬盘、磁带、离线 S3 Glacier

备份有效性验证

备份存在不等于可以恢复。生产环境应定期(建议每月一次)执行恢复演练:从备份仓库恢复数据到测试目录,验证文件完整性。未经验证的备份等同于没有备份。

生产级备份脚本框架(/opt/backup/backup.sh):

#!/bin/bash
set -euo pipefail

LOGFILE="/var/log/backup.log"
export BORG_PASSPHRASE='your-strong-passphrase'

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "${LOGFILE}"; }

log "=== 开始备份 ==="

# 1. LVM 快照(保证备份一致性)
lvcreate -L 5G -s -n data_backup_snap /dev/datavg/datalv
mount -o ro /dev/datavg/data_backup_snap /mnt/snap_tmp

# 2. borg 增量备份
borg create --stats \
    /backup/borg-repo::$(hostname)-$(date +%Y%m%d-%H%M) \
    /mnt/snap_tmp

# 3. 清理快照
umount /mnt/snap_tmp
lvremove -f /dev/datavg/data_backup_snap

# 4. 清理旧归档
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 \
    /backup/borg-repo

# 5. 同步到异地(NFS 挂载的远程存储)
rsync -aq /backup/borg-repo/ /mnt/remote-backup/borg-repo/

log "=== 备份完成 ==="

实践任务

  1. 用 rsync 将 /data 备份到 /backup/daily-$(date +%Y%m%d),加入 systemd timer 每日凌晨 2 点自动执行
  2. 初始化 borgbackup 仓库,对 /data 进行一次完整备份,查看 borg listborg info 输出
  3. 模拟删除 /data 中部分文件,用 borg extract 从指定归档恢复,验证文件已还原
  4. 安装 restic,创建本地仓库并备份 /data,执行 restic restore latest --target /tmp/restore-test 测试恢复

自测问题

1. rsync 的 --delete 选项有什么风险?如何安全使用?

--delete 使目标目录与源目录完全镜像,会删除目标中源目录不存在的文件。风险在于:若源目录填写错误(如误填上层目录)或源目录数据被意外清空后运行备份,目标备份也会被清空,造成备份与源数据同时丢失。

安全使用方式:

# 先预演,不实际执行
rsync -avz --delete --dry-run /data/ /backup/daily/

# 确认输出无误后执行
rsync -avz --delete /data/ /backup/daily/

另外,使用 --backup --backup-dir=/backup/deleted-$(date +%Y%m%d) 可在删除前将文件移至备份目录,保留一层缓冲。

2. borgbackup 和 restic 相比传统 tar/rsync 的核心优势是什么?

维度 tar/rsync borgbackup/restic
去重 否,每次全量或增量占用完整空间 块级去重,相同数据块只存一份,节省 50–90% 空间
加密 需额外配合 gpg 等工具 内置 AES 加密,备份数据天然保密
版本管理 手动管理日期目录 自动归档管理,一条命令列出所有版本
完整性校验 无内置校验 每个数据块有哈希校验,check 命令验证全库完整性
保留策略 手动删除旧目录 prune 命令按规则自动清理,支持日/周/月/年多级保留

3. 3-2-1 备份规则中的"1 份离线"指的是什么?为什么重要?

"离线"指物理上与生产网络断开连接的存储介质,如外部硬盘(断开 USB)、磁带(存放在保险箱)、或启用了 Object Lock 的云存储(防止程序化删除)。

重要性:勒索软件是当前最主要的数据破坏威胁,现代勒索软件会在加密文件前扫描并破坏所有网络可达的备份目标(包括 NFS 挂载、SMB 共享、甚至云存储凭据)。只有物理断开的离线存储才能抵御此类攻击。离线副本是灾难恢复的最后一道保障。

4. 如何在 borgbackup 中设置自动清理旧备份,只保留最近 7 天每日 + 4 周每周 + 6 个月每月?

borg prune \
    --keep-daily=7 \
    --keep-weekly=4 \
    --keep-monthly=6 \
    --list \
    /backup/borg-repo

--list 参数会打印每个归档的保留/删除决策,便于确认策略是否符合预期。加 --dry-run 可预演不实际删除。生产脚本中去掉 --dry-run--list,在每次 borg create 后自动执行 borg prune,实现备份与清理的闭环管理。

总结

可靠备份是运维的最后防线。rsync 适合简单目录同步;borgbackup/restic 提供去重、加密、版本管理,是生产级增量备份首选。结合 LVM 快照保证备份一致性、加密存储保护数据隐私、3-2-1 策略保证副本多样性、定期恢复演练验证有效性,形成完整的灾难恢复能力。