一、摘要
rsnapshot是一款基于rsync的文件系统备份工具,它通过巧妙使用硬链接技术,能够在占用最小存储空间的情况下,创建多个时间点的完整备份快照。
本教程将全面介绍rsnapshot的安装、配置和使用方法,帮助您建立高效的备份系统。
二、核心概念
1.1 rsnapshot工作原理
rsnapshot的核心机制在于结合了rsync的增量备份能力和UNIX硬链接的特性。它通过以下方式实现高效备份:
首次备份:执行完整的文件系统复制
后续备份:仅复制变化的文件,未变化的文件通过硬链接指向之前的备份
空间效率:多个备份版本共享相同的文件数据块,仅差异部分占用额外空间
1.2 技术优势
存储高效:100GB数据备份10个版本可能只需110GB空间
版本完整:每个快照都呈现为完整备份的形态
远程支持:通过SSH可备份远程文件系统
跨平台:支持Linux、Solaris、FreeBSD等多种UNIX-like系统
三、Ubuntu 系统 的 rsnapshot 完整使用文档和配置指南
🛠️ 安装 rsnapshot(Ubuntu)
打开终端,执行以下命令:
sudo apt update
sudo apt install rsnapshot
这会安装 rsnapshot 及其依赖项(如 rsync)。
📁 配置文件路径
主配置文件位于:
/etc/rsnapshot.conf
建议先备份原始配置:
sudo cp /etc/rsnapshot.conf /etc/rsnapshot.conf.bak
然后使用编辑器打开:
sudo nano /etc/rsnapshot.conf
⚙️ 关键配置项说明
配置项 | 示例 | 说明 |
---|---|---|
snapshot_root |
/var/cache/rsnapshot/ |
所有快照存储目录 |
retain |
daily 7 weekly 4 monthly 3 |
保留的快照数量 |
backup |
/home/ localhost/ |
本地备份路径 |
backup |
user@192.168.1.10:/etc/ remote/ |
远程备份路径 |
ssh_args |
-p 2222 |
自定义 SSH 端口(如非默认 22) |
你可以添加多个 backup
行来指定不同的目录。
🔐 设置远程备份(免密 SSH)
- 生成 SSH 密钥:
ssh-keygen
- 将公钥复制到远程机器:
ssh-copy-id user@remote_ip
- 在配置文件中添加远程备份路径:
backup user@remote_ip:/home/user/ remote/
🧪 测试配置
验证语法是否正确:
sudo rsnapshot configtest
模拟运行:
sudo rsnapshot -t daily
正式运行:
sudo rsnapshot daily
⏰ 设置自动备份(Cron)
编辑 cron 文件:
sudo nano /etc/cron.d/rsnapshot
取消注释并设置时间,例如每天凌晨 2 点运行:
0 2 * * * root /usr/bin/rsnapshot daily
📚 官方文档与教程
- Ubuntu 官方 rsnapshot 教程(https://documentation.ubuntu.com/server/how-to/backups/install-rsnapshot/)
四、示例配置文件:rsnapshot.conf
#########################################
# rsnapshot.conf 示例配置文件(Ubuntu)
#########################################
config_version 1.2
#####################
# 快照存储根目录
#####################
snapshot_root /var/cache/rsnapshot/
#####################
# 日志文件路径
#####################
logfile /var/log/rsnapshot.log
#####################
# 保留快照数量
#####################
retain hourly 6
retain daily 7
retain weekly 4
retain monthly 3
#####################
# 是否使用 rsync 的 verbose 模式
#####################
verbose 2
loglevel 3
#####################
# 是否使用 rsync 的 sync_first
#####################
sync_first 1
#####################
# 是否使用 rsync 的 no_create_root
#####################
no_create_root 1
#####################
# rsync 参数
#####################
rsync_long_args --delete --numeric-ids --relative --delete-excluded
#####################
# SSH 参数(如远程端口非 22)
#####################
ssh_args -p 22
#####################
# 本地备份路径
#####################
backup /home/ localhost/
backup /etc/ localhost/
backup /var/log/ localhost/
#####################
# 远程备份路径(需配置免密 SSH)
#####################
backup ubuntu@192.168.1.100:/home/ubuntu/ remote/
#####################
# 排除某些文件或目录(可选)
#####################
# exclude *.tmp
# exclude /home/user/.cache
#####################
# 备份前执行的命令(可选)
#####################
# cmd_preexec /usr/local/bin/pre-backup.sh
#####################
# 备份后执行的命令(可选)
#####################
# cmd_postexec /usr/local/bin/post-backup.sh
✅ 使用建议
- 修改
snapshot_root
为你希望存储快照的目录(建议挂载专用磁盘或分区)。 - 修改
backup
行以匹配你实际的备份路径。 - 如果你不需要远程备份,可以删除或注释掉
remote
那一行。 - 如果远程机器使用非默认 SSH 端口,请修改
ssh_args
。
五、🕒 示例:cron
自动备份计划
你可以通过运行 sudo crontab -e
来编辑 root 用户的 crontab,并添加以下内容:
# 每小时运行一次 hourly 快照(在每小时的第 0 分钟)
0 * * * * /usr/bin/rsnapshot hourly
# 每天凌晨 3 点运行 daily 快照
0 3 * * * /usr/bin/rsnapshot daily
# 每周日凌晨 4 点运行 weekly 快照
0 4 * * 0 /usr/bin/rsnapshot weekly
# 每月 1 日凌晨 5 点运行 monthly 快照
0 5 1 * * /usr/bin/rsnapshot monthly
✅ 注意事项
- 确保
rsnapshot
命令路径正确(通常是/usr/bin/rsnapshot
,你可以通过which rsnapshot
来确认)。 - 建议使用
root
用户运行这些任务,以避免权限问题。 - 如果你希望记录日志,可以将命令改为如下形式:
0 3 * * * /usr/bin/rsnapshot daily >> /var/log/rsnapshot_cron.log 2>&1
六、🚨设置邮件通知或失败告警机制
📬 方法一:使用 cron
的邮件通知功能(最简单)
✅ 步骤:
- 安装邮件发送工具(如
mailutils
):
sudo apt install mailutils
- 设置 root 用户的邮箱地址:
编辑 root 的 crontab:
sudo crontab -e
在文件顶部添加:
MAILTO="your_email@example.com"
然后添加备份任务,例如:
0 3 * * * /usr/bin/rsnapshot daily
📌 效果:
- 如果命令有输出(如错误信息),cron 会自动发送邮件到指定邮箱。
- 如果命令执行成功且无输出,则不会发送邮件。
🚨 方法二:使用 cmd_postexec
+ 邮件发送脚本(更灵活)
你可以在 rsnapshot.conf
中添加如下内容:
cmd_postexec /usr/local/bin/rsnapshot_notify.sh
然后创建脚本 /usr/local/bin/rsnapshot_notify.sh
:
#!/bin/bash
LOGFILE="/var/log/rsnapshot.log"
EMAIL="your_email@example.com"
# 检查日志中是否有错误
if grep -i "error" "$LOGFILE"; then
mail -s "rsnapshot 备份失败警告" "$EMAIL" < "$LOGFILE"
fi
别忘了赋予执行权限:
sudo chmod +x /usr/local/bin/rsnapshot_notify.sh
🧠 方法三:使用 systemd
+ OnFailure
(进阶)
如果你使用 systemd
定时器而不是 cron,可以在 .service
文件中添加:
[Unit]
Description=Run rsnapshot daily
OnFailure=rsnapshot-alert.service
[Service]
ExecStart=/usr/bin/rsnapshot daily
然后创建一个 rsnapshot-alert.service
来发送邮件或通知。
📦方法四:发送到飞书的webhook
🛠️ 第一步:创建飞书 Webhook
- 打开飞书,进入你想接收通知的群组。
- 点击右上角「设置」 → 「群机器人」。
- 添加一个「自定义机器人」。
- 启用后会生成一个 Webhook 地址,类似:
https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
📄 第二步:创建通知脚本
创建一个脚本 /usr/local/bin/rsnapshot_feishu_notify.sh
:
#!/bin/bash
WEBHOOK_URL="https://open.feishu.cn/open-apis/bot/v2/hook/你的Webhook地址"
LOGFILE="/var/log/rsnapshot.log"
# 记录开始时间
START_TIME=$(date +%s)
# 等待备份完成(此脚本应在 rsnapshot.conf 的 cmd_postexec 中调用)
# 所以此处只是记录结束时间
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
# 获取当前时间戳和主机名
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
HOSTNAME=$(hostname)
# 获取磁盘使用情况(只显示根分区)
DISK_USAGE=$(df -h / | tail -1 | awk '{print $5 " used of " $2}')
# 检查日志中是否有错误
if grep -i "error" "$LOGFILE"; then
STATUS="❌ rsnapshot 备份失败"
else
STATUS="✅ rsnapshot 备份成功"
fi
# 构建 JSON 消息
PAYLOAD=$(cat <<EOF
{
"msg_type": "text",
"content": {
"text": "$STATUS\n🕒 时间: $TIMESTAMP\n🖥️ 主机: $HOSTNAME\n💽 磁盘: $DISK_USAGE\n⏱️ 耗时: ${DURATION}s\n📄 日志: $LOGFILE"
}
}
EOF
)
# 发送到飞书
curl -X POST -H "Content-Type: application/json" -d "$PAYLOAD" "$WEBHOOK_URL"
赋予执行权限:
sudo chmod +x /usr/local/bin/rsnapshot_feishu_notify.sh
🔗 第三步:集成到 rsnapshot
在 /etc/rsnapshot.conf
中添加:
cmd_postexec /usr/local/bin/rsnapshot_feishu_notify.sh
这样每次备份完成后,飞书群组就会收到通知。
🧪 效果示例(飞书消息)
✅ rsnapshot 备份成功
🕒 时间: 2025-08-04 14:23:01
🖥️ 主机: ubuntu-server
💽 磁盘: 42% used of 100G
⏱️ 耗时: 12s
📄 日志: /var/log/rsnapshot.log