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 "=== 备份完成 ==="
实践任务
- 用 rsync 将
/data备份到/backup/daily-$(date +%Y%m%d),加入 systemd timer 每日凌晨 2 点自动执行 - 初始化 borgbackup 仓库,对
/data进行一次完整备份,查看borg list和borg info输出 - 模拟删除
/data中部分文件,用borg extract从指定归档恢复,验证文件已还原 - 安装 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 策略保证副本多样性、定期恢复演练验证有效性,形成完整的灾难恢复能力。