Linux中文件增量备份有很多方式,如:rsync+硬链接、rdiff-backup、BorgBackup、Restic、Duplicity、tar增量等等。简单对比一下:
| 工具 | 增量方式 | 去重 | 加密 | 可远程 | 易用性 | 适用场景 |
|---|---|---|---|---|---|---|
| rsync+硬链接 | 文件级 | 硬链接 | 否 | 是 | 简单 | 简单同步,版本不多 |
| rdiff-backup | 字节级 | 是 | 否 | 是 | 中等 | 文件服务器,版本管理 |
| BorgBackup | 块级 | 是 | 可选 | 是 | 中等 | 服务器备份,需加密 |
| Restic | 块级 | 是 | 强制 | 是 | 中等 | 云备份,安全要求高 |
| Duplicity | 文件级 | 否 | 强制 | 是 | 中等 | 需加密备份到云存储 |
| tar增量 | 文件级 | 否 | 否 | 否 | 简单 | 简单本地备份 |
选择建议
- 个人电脑/简单需求:rsync+硬链接或tar
- 服务器备份:BorgBackup或Restic
- 需要加密:Restic或Duplicity
- 文件服务器:rdiff-backup
- 云端备份:Restic(支持多种后端)
- 大文件/虚拟机:文件系统快照+BorgBackup
我这里备份Nas中自己拍的照片和视频,所以选择用BorgBackup。
BorgBackup部署方案
官网:https://borgbackup.readthedocs.io
🔧 1. 安装 Borg
# Ubuntu/Debian
sudo apt update && sudo apt install borgbackup -y
# CentOS/RHEL/Fedora
sudo dnf install borgbackup -y
# 验证
borg --version
📁 2. 目录结构
备份最好用一块独立的硬盘,即使系统坏了或原数据硬盘噶了也不影响。这里我们将新的硬盘挂载到 **/mnt/backups/**目录, 然后borg仓库也建这个目录中
/mnt/backups/
├── borg_repo/ # Borg 仓库(加密存储)
├── borg_backup.sh # 备份脚本
└── borg_restore.sh # 还原脚本
🔐 3. 初始化仓库(首次运行)
# 创建仓库目录
sudo mkdir -p /mnt/backups/borg_repo
# 设置强密码(建议存入文件)
echo "YourSuperStrongBorgPass123!" | sudo tee /etc/borg-pass.txt
sudo chmod 600 /etc/borg-pass.txt
# 初始化仓库(AES-256 加密)
export BORG_PASSPHRASE=$(cat /etc/borg-pass.txt)
borg init --encryption=repokey-blake2 /backups/borg_repo
unset BORG_PASSPHRASE
💡
repokey-blake2:密钥与仓库一起存储(方便恢复),使用 BLAKE2b 哈希,直接将整个仓库备份到云盘(云端),只要使用强密码不泄漏,可以在任意地点下载恢复切安全可靠。
🔄 4. 备份脚本:borg_backup.sh
#!/bin/bash
# borg_backup.sh - Borg 增量备份脚本
set -euo pipefail
REPO="/mnt/backups/borg_repo"
SOURCE_DIRS=(
"/vol1/1000/Photos"
"/vol1/1000/Video"
# 添加更多目录...(以换行分割)
)
PASS_FILE="/etc/borg-pass.txt"
export BORG_PASSPHRASE=$(cat "$PASS_FILE")
export BORG_RSH="ssh -o StrictHostKeyChecking=no" # 如需远程仓库
# 创建快照名(含日期和主机名)
SNAPSHOT="backup-$(hostname)-$(date +%Y-%m-%d-%H%M)"
echo "[$(date)] 开始备份到 $REPO :: $SNAPSHOT"
# === 进入源目录,然后备份 .(当前目录)===
cd "$SOURCE_DIR"
# 执行备份(自动去重+压缩)
borg create \
--verbose \
--filter AME \
--list \
--stats \
--compression zstd,6 \
--exclude-caches \
--exclude '*/.cache/*' \ # 排除目录
--exclude '*.tmp' \ # 排除文件
"$REPO::$SNAPSHOT" \
"${SOURCE_DIRS[@]}"
# 清理旧快照(保留:7天内每日、4周内每周、6月内每月)
borg prune \
--list \
--prefix "backup-$(hostname)-" \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6 \
"$REPO"
unset BORG_PASSPHRASE
echo "[$(date)] 备份完成"
SOURCE_DIRS这里配置的是绝对路径,还原时也带绝对路径/vol1/1000/Photos,也可以配置相对路径,还原时也就是相对路径了。
🔓 5. 还原脚本:borg_restore.sh
#!/bin/bash
# borg_restore.sh - 修复版:正确还原指定快照
set -euo pipefail
REPO="/mnt/backups/borg_repo"
PASS_FILE="/etc/borg-pass.txt"
if [[ $# -lt 1 ]]; then
echo "用法: $0 <快照名> [还原路径]"
echo "可用快照列表:"
export BORG_PASSPHRASE=$(cat "$PASS_FILE")
borg list "$REPO"
unset BORG_PASSPHRASE
exit 1
fi
SNAPSHOT="$1"
TARGET="${2:-/restore}" # 不传第二个路径参数时还原到 /restore
# 确保目标目录存在
mkdir -p "$TARGET"
# 设置密码
export BORG_PASSPHRASE=$(cat "$PASS_FILE")
echo "正在还原 $REPO::$SNAPSHOT 到 $TARGET ..."
# 关键修复:进入目标目录后执行 extract
cd "$TARGET"
borg extract --verbose "$REPO::$SNAPSHOT"
unset BORG_PASSPHRASE
echo "还原完成: 文件已解压到 $TARGET"
⏰ 6. 自动化(cron)
# 每天凌晨 3点 备份
echo "0 3 * * * root /mnt/backups/borg_backup.sh >> /var/log/borg-backup.log 2>&1" | sudo tee /etc/cron.d/borg-backup
🛡️7. 备份到云盘
用Openlist挂在云盘,然后将/mnt/backups/borg_repo目录实时同步到云盘就可以了,能实现云端备份,备份文件还是AES-256加密。
🔍8. 其他一些命令使用
删除备份
- 删除整个repo:
borg delete /mnt/backups/borg_repo
这实际上和你直接打开/mnt/backups/,删除整个borg_repo目录是一样的
- 删除某次备份:
borg delete /mnt/backups/borg_repo::backup-zngw-2025-12-08-0638
这个感觉比较鸡肋,因为有去重机制,删除某次备份并不能很好的腾出空间占用,如果觉得累积的备份比较占空间了,直接删除整个repo,再重新创建同名的repo,然后再备份一次即可。
挂载快照用法
- 安装 FUSE(必要依赖)
# Ubuntu/Debian
sudo apt install fuse3 -y
sudo apt install python3-pyfuse3 -y
# CentOS/RHEL/Fedora
sudo dnf install fuse3
sudo dnf install python3-pyfuse3 -y
# 老版本的系统,如果没有系统包,可以用pip来安装
pip3 install --user pyfuse3
- 挂载整个仓库
# 创建挂载点
mkdir /home/borg-all
# 挂载
borg mount /mnt/backups/borg_repo /home/borg-all
然后在/home/borg-all目录可以看到每个快照目录,如:
backup-1panel-2025-12-08-0638/
backup-1panel-2025-12-08-0726/
- 挂载单个快照
# 创建挂载点
mkdir /home/borg-point
# 挂载
borg mount /backups/borg_repo::snapshot-name /home/borg-point
评论区