一、摘要

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)

  1. 生成 SSH 密钥:
ssh-keygen
  1. 将公钥复制到远程机器:
ssh-copy-id user@remote_ip
  1. 在配置文件中添加远程备份路径:
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

📚 官方文档与教程

四、示例配置文件: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 的邮件通知功能(最简单)

✅ 步骤:

  1. 安装邮件发送工具(如 mailutils):
sudo apt install mailutils
  1. 设置 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

  1. 打开飞书,进入你想接收通知的群组。
  2. 点击右上角「设置」 → 「群机器人」。
  3. 添加一个「自定义机器人」。
  4. 启用后会生成一个 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
Copyright © https://yan-jian.com 2023 all right reserved更新时间: 2025-08-04 14:22:59

results matching ""

    No results matching ""