rsnapshot 1.4.3 配置参数详解
逐项深挖 rsnapshot 1.4.3 唯一配置文件 rsnapshot.conf:TAB 分隔铁律与报错排障实录、snapshot_root 与 no_create_root 防误删、retain 轮转链与 sync_first 解耦、三类 backup 备份点、include/exclude 白名单三大失效条件实测、link_dest 硬链接去重磁盘对照、生产模板与 7 组 FAQ,全部命令输出实测照抄。
rsnapshot 1.4.3 配置参数详解
目标:逐项讲透 rsnapshot 1.4.3 唯一的配置文件 rsnapshot.conf——从结构约定(TAB 分隔铁律)到 snapshot_root、retain 保留策略、backup 备份点、exclude/include 过滤规则、link_dest 硬链接去重、钩子脚本等全部核心参数,每项均给出可独立执行的验证命令与实测回显。本文全部命令与回显均在 Ubuntu 22.04.5 LTS(x86_64)+ rsnapshot 1.4.3-2 实机逐条实测照抄。
一、环境信息
本文所有命令与回显的实测环境如下,读者在自己服务器上复现时请先核对版本与路径。
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- rsnapshot:1.4.3-2(Ubuntu apt 仓库版,Perl 实现,无需编译)
- rsync:3.2.7(protocol version 31)
- 备份服务器主机名:backup-server(承担 rsnapshot 调度与快照存储)
- 远端被备份机主机名:file-server(内网服务器,通过 /etc/hosts 解析,ssh 22 端口免密已打通,专用备份账号 backup)
- 快照根目录:/srv/rsnapshot/(主配置)、/srv/rsnapshot-ex/ 等为参数验证用的独立实验根目录
- 配置文件:/etc/rsnapshot.conf(主配置);参数验证使用 -c 参数指向独立配置文件,不污染主配置
- 日志:/var/log/rsnapshot.log(主配置),实验配置各自独立日志文件
rsnapshot version; dpkg -l rsnapshot | tail -1; rsync --version | head -1; hostname
实测回显:
rsnapshot
ii rsnapshot 1.4.3-2 all local and remote filesystem snapshot utility
rsync version 3.2.7 protocol version 31
backup-server
💡 说明:
rsnapshot version在 Ubuntu 22.04 的 1.4.3-2 打包版本中只输出rsnapshot、不带版本号——这是 Debian 打包时$VERSION变量留空的已知小缺陷(/usr/bin/rsnapshot第 66 行my $VERSION = '';)。查版本以dpkg -l rsnapshot为准,详见常见问题 7.1。
二、前置条件
本章参数详解假设读者已完成 rsnapshot 安装。若尚未安装,请先阅读 《Ubuntu 22.04 安装 rsnapshot 1.4.3 指南》,完成以下前置:
- 已安装 rsnapshot 1.4.3 及其依赖(rsync、perl、logger);
- 已创建快照根目录(或接受 rsnapshot 自动创建,见 5.2 节 no_create_root);
- 远程备份场景下,备份服务器对被备份机的 ssh 免密登录已打通(本文使用 backup@file-server,验证命令见 5.7 节);
- 有 root 权限编辑 /etc/rsnapshot.conf。
验证安装与免密是否就绪:
rsnapshot configtest && ssh -o BatchMode=yes backup@file-server "hostname"
实测回显:
Syntax OK
file-server
两条命令都成功返回即环境就绪:configtest 输出 Syntax OK 表示主配置合法,ssh 输出对端主机名表示免密可用。
三、参数查看与修改方式
rsnapshot 的全部行为由一个配置文件控制,没有数据库、没有环境变量、没有命令行参数覆盖(除 -c 指定配置文件路径本身)。掌握三个操作即可驾驭它。
3.1 查看当前生效配置
rsnapshot 不提供「打印解析后配置」的子命令,直接查看文件即可。配置文件以 TAB 分隔的「参数名 + 值」逐行书写:
cat /etc/rsnapshot.conf
实测回显(本文实测环境主配置全文):
config_version 1.2
snapshot_root /srv/rsnapshot/
no_create_root 1
cmd_cp /bin/cp
cmd_rm /bin/rm
cmd_rsync /usr/bin/rsync
cmd_ssh /usr/bin/ssh
cmd_logger /usr/bin/logger
cmd_du /usr/bin/du
cmd_rsnapshot_diff /usr/bin/rsnapshot-diff
retain hourly 6
retain daily 7
retain weekly 4
retain monthly 3
verbose 2
loglevel 3
logfile /var/log/rsnapshot.log
lockfile /var/run/rsnapshot.pid
rsync_long_args --delete --numeric-ids --relative --delete-excluded
ssh_args -o BatchMode=yes
link_dest 1
exclude *.tmp
cmd_preexec /usr/local/bin/rsnap-pre.sh
cmd_postexec /usr/local/bin/rsnap-post.sh
backup /etc/ localhost/
backup /home/demo/ localhost/
backup_script /usr/local/bin/rsnapshot-mkver.sh localhost/version/
backup_exec /usr/local/bin/rsnap-exec.sh
backup backup@file-server:/srv/appdata/ file-server/
⚠️ 注意:上面回显里看到的空白全部是 TAB 字符,不是多个空格。cat 输出无法区分二者,这也是「TAB 铁律」成为 rsnapshot 头号大坑的原因——用空格替代 TAB 的配置行会被直接判错(实测见 5.1.3)。
3.2 修改配置的正确姿势
rsnapshot 的包自带一个制表符完好的示例文件,最稳妥的改法是在示例文件基础上修改,避免手工敲 TAB 出错:
ls /usr/share/doc/rsnapshot/examples/
实测回显:
rsnapshot.conf.gz
zcat /usr/share/doc/rsnapshot/examples/rsnapshot.conf.gz > /etc/rsnapshot.conf
编辑完成后必须运行语法检查,确认无误再投入使用:
rsnapshot configtest
实测回显:
Syntax OK
3.3 用 -c 参数隔离测试新配置
调参期间强烈建议使用 -c 指向独立配置文件验证,语法检查与实际运行都支持:
rsnapshot -c /etc/rsnapshot-ex.conf configtest
实测回显:
Syntax OK
-c 是全局参数,必须写在子命令(configtest/hourly 等)之前。本文所有参数验证都基于这种方式,每个实验配置只改目标参数、其余保持最小集,读者可用同样方法在自己环境逐项复现。
四、参数总览
rsnapshot 1.4.3 的配置参数按职能分为五类。下表给出全参数的名称、默认值(无特别说明时为源码内建默认)与一句话职能,逐项深读见第五章。
基础与路径类:
| 参数 | 默认值 | 职能 |
|---|---|---|
| config_version | 1.2 | 配置文件格式版本,固定写 1.2 |
| snapshot_root | 无(必填) | 快照存储根目录,必须以 / 结尾(自动补齐见 5.2) |
| no_create_root | 0 | 置 1 时快照根不存在则拒绝运行,防误挂载误删 |
| cmd_cp / cmd_rm | 无 | 1.4.x 仅向后兼容保留,内部已用 rsync/内建复制替代 |
| cmd_rsync | 无(必填) | rsync 可执行文件路径 |
| cmd_ssh | 无 | ssh 可执行文件路径,远程备份必填 |
| cmd_logger | 无 | syslog 工具路径,配 loglevel 向 syslog 记日志 |
| cmd_du | 无 | du 可执行文件路径,rsnapshot du 统计空间用 |
| cmd_rsnapshot_diff | 无 | rsnapshot-diff 路径,rsnapshot diff 对比用 |
保留策略类:
| 参数 | 默认值 | 职能 |
|---|---|---|
| retain(旧名 interval) | 无(必填) | 定义快照保留级别与份数,如 hourly 6 |
| sync_first | 0 | 置 1 时把「实际备份」与「轮转」拆开,先 sync 后轮转 |
备份点类:
| 参数 | 默认值 | 职能 |
|---|---|---|
| backup | 无 | 标准备份点:本地路径或 远端host:path + 快照内存储点 |
| backup_script | 无 | 执行本地脚本,stdout 产物归档到快照内存储点 |
| backup_exec | 无 | 执行本地命令,可仅执行不归档(无存储点时) |
过滤规则类:
| 参数 | 默认值 | 职能 |
|---|---|---|
| include | 无 | rsync include 规则,白名单放行(注意与 --relative 的路径配合,见 5.6) |
| exclude | 无 | rsync exclude 规则,黑名单排除 |
| exclude_file / include_file | 无 | 从文件批量读取 exclude/include 规则,每行一条 |
rsync/ssh 调优类:
| 参数 | 默认值 | 职能 |
|---|---|---|
| rsync_short_args | -a | rsync 短参数 |
| rsync_long_args | --delete --numeric-ids --relative --delete-excluded | rsync 长参数,改动需谨慎 |
| ssh_args | 无 | ssh 额外参数 |
| link_dest | 0 | 置 1 启用 rsync --link-dest 硬链接去重,强烈建议开启 |
| rsync_numtries | 1 | rsync 重试次数,0 表示无限重试 |
| du_args | -csh | rsnapshot du 传给 du 的参数 |
日志与并发类:
| 参数 | 默认值 | 职能 |
|---|---|---|
| logfile | 无 | 日志文件路径 |
| loglevel | 3 | 日志详细度 1-5,4 起记录 rsync 过程 |
| verbose | 2 | 标准输出详细度 1-5,4 起回显完整 rsync 命令 |
| lockfile | /var/run/rsnapshot.pid | 并发锁文件,防两个 rsnapshot 同时跑 |
关键差异解读:retain、snapshot_root、cmd_rsync、backup 四类是必填骨架,缺一不可运行;link_dest 与 sync_first 是最值得显式设置的两个行为开关,直接决定磁盘占用模式与 cron 表写法;过滤规则三参数共用 rsync 的规则引擎,顺序敏感、路径敏感,是仅次于 TAB 的第二大出错源。
五、核心参数分类详解
5.1 配置结构与 TAB 分隔铁律
本节先讲清配置文件的解析规则——它决定了后面所有参数行的写法底线。
5.1.1 config_version
配置文件第一行应为 config_version,声明配置格式版本。1.4.x 的格式版本号是 1.2,可用 check-config-version 子命令验证当前解析器接受的版本:
rsnapshot check-config-version
实测回显:
1.2
写 config_version 1.2(TAB 分隔)即与解析器匹配。该参数缺省时 rsnapshot 不报错,但显式声明可避免未来格式升级时的静默不兼容。
5.1.2 行语法:参数名 + TAB + 值
每行配置 = 参数名 + TAB + 值(多值参数如 retain/backup 用多个 TAB 分隔字段)。行内 # 之后是注释。参数名大小写敏感。
5.1.3 排障实录:空格替代 TAB 必然报错
rsnapshot 解析器只认 TAB。这是 rsnapshot 最著名的坑:从网页/文档复制配置时 TAB 常被转成空格,整份配置瞬间报废。用一份「snapshot_root 行写成空格分隔」的坏配置实测:
rsnapshot -c /etc/rsnapshot-bad-space.conf configtest
实测回显:
----------------------------------------------------------------------------
rsnapshot encountered an error! The program was invoked with these options:
/usr/bin/rsnapshot -c /etc/rsnapshot-bad-space.conf configtest
----------------------------------------------------------------------------
ERROR: /etc/rsnapshot-bad-space.conf on line 2:
ERROR: snapshot_root /srv/rsnapshot/ - missing tabs to separate words - \
change spaces to tabs.
ERROR: /etc/rsnapshot-bad-space.conf on line 21:
ERROR: backup /etc/ localhost/ - snapshot_root needs to be defined before \
backup points
ERROR: /etc/rsnapshot-bad-space.conf on line 22:
ERROR: backup /home/demo/ localhost/ - snapshot_root needs to be defined \
before backup points
ERROR: /etc/rsnapshot-bad-space.conf on line 23:
ERROR: backup_script /usr/local/bin/rsnapshot-mkver.sh localhost/version/ - \
snapshot_root needs to be defined before backup scripts
ERROR: /etc/rsnapshot-bad-space.conf on line 24:
ERROR: backup backup@file-server:/srv/appdata/ file-server/ - snapshot_root \
needs to be defined before backup points
ERROR: ---------------------------------------------------------------------
ERROR: Errors were found in /etc/rsnapshot-bad-space.conf,
ERROR: rsnapshot can not continue. If you think an entry looks right, make
ERROR: sure you don't have spaces where only tabs should be.
三个排障要点从这个报错里读出来:
- 第 2 行
snapshot_root用空格分隔 → 直接报missing tabs to separate words - change spaces to tabs; - snapshot_root 解析失败后,后续所有 backup 点级联报错(
snapshot_root needs to be defined before backup points)——遇到一堆 backup 报错时,先检查第一处 TAB 错误,别逐行去改 backup 行; - 报错行号精确到行,且结尾提示
make sure you don't have spaces where only tabs should be,照着行号用编辑器「显示空白字符」检查即可。
💡 说明:编辑器里确认 TAB 的最简单命令是
cat -A /etc/rsnapshot.conf,TAB 显示为^I,空格原样显示。凡^I缺失的行就是问题行。
5.2 snapshot_root 与 no_create_root
5.2.1 snapshot_root
快照存储根目录,所有快照(hourly.0/、daily.0/ 等)都落在它下面。官方建议以斜杠结尾(/srv/rsnapshot/)。1.4.3 对结尾斜杠有容错——写不带斜杠的值也能正常运行,实测验证:
printf "config_version\t1.2\nsnapshot_root\t/srv/rsnapshot-noslash\ncmd_rsync\t/usr/bin/rsync\nretain\thourly\t2\nverbose\t2\nloglevel\t3\nlogfile\t/var/log/rsn-noslash.log\nlockfile\t/var/run/rsn-noslash.pid\nbackup\t/home/demo/\tlocalhost/\n" > /etc/rsnapshot-noslash.conf
rsnapshot -c /etc/rsnapshot-noslash.conf configtest
实测回显:
Syntax OK
rsnapshot -c /etc/rsnapshot-noslash.conf hourly && ls -d /srv/rsnapshot-noslash/hourly.0/
实测回显:
/srv/rsnapshot-noslash/hourly.0/
无尾斜杠时 configtest 通过、快照也正确落在 /srv/rsnapshot-noslash/hourly.0/(解析器自动补了斜杠,没有拼成 rsnapshot-noslashhourly.0)。尽管如此仍建议显式写尾斜杠:老版本 1.2/1.3 无此容错,且显式斜杠让配置意图一目了然。
⚠️ 注意:snapshot_root 指向的磁盘要预留「最高保留级别 × 单份全量」的空间(硬链接去重后实际占用远小于此,估算方法见 5.5 节 link_dest 的 du 实测)。不要把 snapshot_root 指到 NFS/CIFS 挂载上——硬链接语义在多数网络文件系统上不可靠。
5.2.2 no_create_root:防止误挂载时毁掉快照
no_create_root 置 1 后,snapshot_root 目录不存在时 rsnapshot 拒绝运行而不是创建它。这个参数是快照安全的最后一道闸:典型事故场景是快照根所在磁盘掉线/未挂载,挂载点变成空目录,若 rsnapshot 静默重建目录并全量重备,旧快照并不会因此丢失(各快照目录独立),但监控指标全乱、且新写入全落系统盘。置 1 后直接报错停止,让运维第一时间发现问题。
实测 no_create_root 1 + 快照根不存在:
rsnapshot -c /etc/rsnapshot-absent.conf hourly
实测回显:
----------------------------------------------------------------------------
rsnapshot encountered an error! The program was invoked with these options:
/usr/bin/rsnapshot -c /etc/rsnapshot-absent.conf hourly
----------------------------------------------------------------------------
ERROR: /srv/rsnapshot-absent does not exist.
ERROR: rsnapshot refuses to create snapshot_root when no_create_root is enabled
改为 no_create_root 0 再跑:
rsnapshot -c /etc/rsnapshot-absent0.conf hourly; ls -la /srv/rsnapshot-absent/
实测回显(exit=0,目录被自动创建):
total 12
drwx------ 3 root root 4096 Oct 22 05:35 .
drwxr-xr-x 1 root root 4096 Oct 22 05:35 ..
drwxr-xr-x 3 root root 4096 Oct 22 05:35 hourly.0
两个细节值得注意:自动创建的 snapshot_root 权限是 0700(drwx------,日志中对应 mkdir -m 0700 -p),非 root 用户无法进入;而各级快照目录本身是 0755(mkdir -m 0755)。生产环境推荐 no_create_root 1 + 手工 mkdir /srv/rsnapshot 建好目录,把「目录消失」变成显式故障。
5.3 retain:快照保留策略
5.3.1 语法与级别命名
retain 定义一个保留级别:级别名 + 份数。同一配置可定义多个级别,轮转链自上而下:下一级溢出时删除末尾、整体下移,最高级每次由上一级轮转晋升。本文主配置定义了经典四级:
retain hourly 6
retain daily 7
retain weekly 4
retain monthly 3
含义:hourly 保留 6 份(hourly.0hourly.5),每次运行 4 依次后移、新备份落 hourly.0;hourly 链溢出的 hourly.5 晋升为 daily.0(rsnapshot hourly 时 hourly.5 删除、hourly.0rsnapshot daily 时)……以此类推。
💡 技术拓展:级别名不是关键字,可以自由命名。常见命名方案对比——
命名方案 形态 适用场景 经典四级 hourly/daily/weekly/monthly 通用服务器,粒度清晰,社区文档最多 代号式 alpha/beta/gamma/delta 频率与「小时/天」无关的场景(如 10 分钟一次的 alpha) 双级极简 sync/daily 或 hourly/daily 单机小规模,cron 表最短 rsnapshot 官方文档示例即用 alpha/beta/gamma。本文采用经典四级:备份频率按小时执行最符合「快照备份」的使用直觉,且与 cron 表的 hour 映射直观。
5.3.2 retain 是 1.4.x 的新名字,旧名 interval 仍兼容
1.4 版把该参数从 interval 更名为 retain(官方动机:interval 一词易与 cron 间隔混淆),旧名继续兼容。用 interval 写一份配置实测:
sed "s/^retain\t/interval\t/" /etc/rsnapshot-ex.conf > /etc/rsnapshot-int.conf
rsnapshot -c /etc/rsnapshot-int.conf configtest
实测回显:
Syntax OK
旧配置无需迁移;新配置统一写 retain,语义与官方文档一致。注意一份配置里混用 retain 与 interval 同名级别会重复定义冲突,不要混写。
5.3.3 份数必须 ≥1
级别份数写 0 会被语法检查拦下:
sed "s/retain\thourly\t2/retain\thourly\t0/" /etc/rsnapshot-ex.conf > /etc/rsnapshot-r0.conf
rsnapshot -c /etc/rsnapshot-r0.conf configtest
实测回显:
----------------------------------------------------------------------------
rsnapshot encountered an error! The program was invoked with these options:
/usr/bin/rsnapshot -c /etc/rsnapshot-r0.conf configtest
----------------------------------------------------------------------------
ERROR: /etc/rsnapshot-r0.conf on line 5:
ERROR: retain hourly 0 - "hourly" must be at least 1 or higher
ERROR: ---------------------------------------------------------------------
ERROR: Errors were found in /etc/rsnapshot-r0.conf,
ERROR: rsnapshot can not continue. If you think an entry looks right, make
ERROR: sure you don't have spaces where only tabs should be.
5.3.4 最低级别执行实际备份,其余级别只轮转(retain 与 backup 的联动)
这是 retain 最重要的运行语义:只有最低级别(本例 hourly)在轮转之余执行真实 rsync 备份;更高级别运行时只做 mv 轮转与晋升,不产生任何 rsync。从日志验证——hourly 运行日志含 rsync 行:
grep rsync /var/log/rsnapshot.log | grep hourly | tail -1
实测回显:
[2026-10-22T04:00:01] /usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded --exclude=*.tmp --link-dest=/srv/rsnapshot/hourly.1/localhost/ /etc/ /srv/rsnapshot/hourly.0/localhost/
daily 运行日志只有 mv(轮转晋升),没有 rsync:
grep "\[2026-10-22.*daily" /var/log/rsnapshot.log | head -8
实测回显:
[2026-10-22T00:00:02] /usr/bin/rsnapshot -c /etc/rsnapshot.conf daily: started
[2026-10-22T00:00:02] echo 7246 > /var/run/rsnapshot.pid
[2026-10-22T00:00:02] /bin/rm -rf /srv/rsnapshot/daily.1/
[2026-10-22T00:00:02] mv /srv/rsnapshot/daily.0/ /srv/rsnapshot/daily.1/
[2026-10-22T00:00:02] mv /srv/rsnapshot/hourly.5/ /srv/rsnapshot/daily.0/
[2026-10-22T00:00:02] rm -f /var/run/rsnapshot.pid
[2026-10-22T00:00:02] /usr/bin/rsnapshot -c /etc/rsnapshot.conf daily: completed successfully
mv /srv/rsnapshot/hourly.5/ /srv/rsnapshot/daily.0/ 就是「hourly 溢出晋升为 daily」的现场。由此得出 cron 表设计原则:每个级别都要有 cron 条目(daily 不跑,hourly.5 永远不会被晋升,daily 链很快就空),且低级别频率必须高于高级别。
5.3.5 sync_first:把「备份」与「轮转」解耦
sync_first 1 改变上述语义:实际备份统一由 rsnapshot sync 执行(数据落 .sync 隐藏目录),所有 retain 级别都只做轮转,最低级别轮转时用硬链接把 .sync 复制为 .0 快照。适用场景:希望「备份动作」与「轮转动作」分开排程(例如 sync 放业务低峰、hourly 整点轮转),或者只想跑一次 sync 就手动做多级轮转。
实测(独立配置 sync_first 1 + retain hourly 3):
rsnapshot -c /etc/rsnapshot-sync.conf sync && ls -a /srv/rsnapshot2/
实测回显:
. .. .sync hourly.0 hourly.1 hourly.2
sync 之后跑 hourly,日志可见轮转是 cp -al .sync 硬链接而非 rsync:
tail -6 /var/log/rsnapshot2.log
实测回显:
[2026-10-22T05:40:22] /usr/bin/rsnapshot -c /etc/rsnapshot-sync.conf hourly: started
[2026-10-22T05:40:22] echo 6819 > /var/run/rsnapshot2.pid
[2026-10-22T05:40:22] /bin/rm -rf /srv/rsnapshot2/hourly.2/
[2026-10-22T05:40:22] mv /srv/rsnapshot2/hourly.1/ /srv/rsnapshot2/hourly.2/
[2026-10-22T05:40:22] mv /srv/rsnapshot2/hourly.0/ /srv/rsnapshot2/hourly.1/
[2026-10-22T05:40:22] /bin/cp -al /srv/rsnapshot2/.sync /srv/rsnapshot2/hourly.0
sync_first 1 且从未跑过 sync 时,lowest interval 会静默空转(只建根目录、不轮转不备份、exit=0),完整日志如下:
[2026-10-22T05:42:34] /usr/bin/rsnapshot -c /etc/rsnapshot-sync3.conf hourly: started
[2026-10-22T05:42:34] echo 6880 > /var/run/rsnapshot3.pid
[2026-10-22T05:42:34] mkdir -m 0700 -p /srv/rsnapshot3-sync/
[2026-10-22T05:42:34] rm -f /var/run/rsnapshot3.pid
[2026-10-22T05:42:34] /usr/bin/rsnapshot -c /etc/rsnapshot-sync3.conf hourly: completed successfully
⚠️ 注意:开启 sync_first 后 cron 表必须额外加一条
rsnapshot sync,且频率不低于最低 retain 级别;否则轮转链把旧数据转走、.sync 又不更新,快照会「看起来在跑、实际一直是旧数据」。这是 sync_first 模式最隐蔽的运维事故。
5.4 backup:三类备份点
backup 系列参数定义「备什么、备到哪」。每条 backup 行 = 源 + TAB + 快照内存储点(相对 snapshot_root 的目录,惯例以 / 结尾)。
5.4.1 本地路径备份点
backup /etc/ localhost/
源是本地目录,存储点 localhost/ 只是快照内的目录名(惯例用主机名,本机就叫 localhost)。备份结果落在 /srv/rsnapshot/hourly.0/localhost/etc/。注意 rsnapshot 默认 rsync 参数含 --relative,快照内会保留源路径的完整目录结构(/etc → localhost/etc,/home/demo → localhost/home/demo),实测:
find /srv/rsnapshot/hourly.0/localhost/ -maxdepth 2 -type d
实测回显:
/srv/rsnapshot/hourly.0/localhost/
/srv/rsnapshot/hourly.0/localhost/etc
/srv/rsnapshot/hourly.0/localhost/home
/srv/rsnapshot/hourly.0/localhost/version
/srv/rsnapshot/hourly.0/localhost/home/demo
5.4.2 远程 host:path 备份点
backup backup@file-server:/srv/appdata/ file-server/
源写成 user@host:path 即走 rsync over ssh(依赖 cmd_ssh),存储点用对端主机名 file-server/。远程备份时 rsnapshot 自动把 ssh_args 拼进 rsync 的 --rsh 参数,日志实证:
grep "file-server" /var/log/rsnapshot.log | grep rsync | tail -1
实测回显:
[2026-10-22T04:00:01] /usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded --exclude=*.tmp --rsh=/usr/bin/ssh -o BatchMode=yes --link-dest=/srv/rsnapshot/hourly.1/file-server/ backup@file-server:/srv/appdata/ /srv/rsnapshot/hourly.0/file-server/
可见 ssh_args 的 -o BatchMode=yes 生效(禁用交互输密码,配合免密密钥,cron 场景必需)。远程备份前置:备份服务器以 backup 账号对 file-server 免密可登:
ssh -o BatchMode=yes backup@file-server "hostname"
实测回显:
file-server
⚠️ 注意:源路径尾斜杠语义与 rsync 完全一致——
/srv/appdata/备「目录内容」,/srv/appdata备「目录本身」(存储点下多一层 appdata/)。rsnapshot 文档惯例源尾带斜杠、把目录名表达在存储点上。
5.4.3 backup_script:脚本产物入快照
backup_script 运行一个本地脚本,其 stdout 被收集归档到快照内指定存储点。本文实验脚本每次运行生成一个版本标记文件:
cat /usr/local/bin/rsnapshot-mkver.sh
实测回显:
#!/bin/bash
# rsnapshot backup_script demo: generate a version file each run
/bin/date +"%Y-%m-%d %H:%M:%S backup_script executed" > /tmp/backup_script_output.txt
cat /etc/hostname >> /tmp/backup_script_output.txt
ls /srv/rsnapshot/hourly.0/localhost/version/ && cat /srv/rsnapshot/hourly.0/localhost/version/backup_script_output.txt
实测回显:
backup_script_output.txt
2026-10-22 04:00:01 backup_script executed
backup-server
日志中可见其工作机制:rsnapshot 先在临时目录执行脚本,再用 cp -al 把产物硬链接进快照:
[2026-10-22T04:00:01] mkdir -m 0755 -p /srv/rsnapshot/tmp/
[2026-10-22T04:00:01] cd /srv/rsnapshot/tmp/
[2026-10-22T04:00:01] /usr/local/bin/rsnapshot-mkver.sh
[2026-10-22T04:00:01] cd /srv/rsnapshot/
[2026-10-22T04:00:01] /bin/cp -al /srv/rsnapshot/hourly.1/localhost/version /srv/rsnapshot/hourly.0/localhost/version
典型用途:mysqldump、pg_dump 等把「数据库导出产物」混入文件快照体系。
5.4.4 backup_exec:纯执行钩子
backup_exec 只执行一条本地命令;写成 backup_exec 脚本 存储点/ 时 stdout 同样归档进存储点,不带存储点时仅执行不归档。本文实验配置为纯执行形态:
backup_exec /usr/local/bin/rsnap-exec.sh
cat /usr/local/bin/rsnap-exec.sh; grep "rsnap-exec" /var/log/rsnapshot.log | tail -1
实测回显:
#!/bin/bash
# rsnapshot backup_exec demo: stdout is written into the backup point dest
echo "backup_exec ran on $(hostname) at $(date '+%Y-%m-%d %H:%M:%S')" | tee -a /var/log/rsnap-hooks.log
[2026-10-22T04:00:01] /usr/local/bin/rsnap-exec.sh
💡 说明:backup_script 与 backup_exec 都只在最低 retain 级别运行时执行(与真实备份同频),高级别轮转不会重复执行脚本。
5.5 link_dest:硬链接去重开关
link_dest 1 让 rsnapshot 在备份时加 --link-dest=上一份快照 参数:与上一份快照相同的文件不重写,而是硬链接过去——未变化的文件全库只占一份 inode,这是 rsnapshot「快照看似全量、实际增量」的核心机制。源码内建默认为 0(关闭),因此必须显式开启。
两种模式的运行方式差异可直接从日志对比。link_dest 0(独立配置 retain daily 3 跑两轮):
tail -8 /var/log/rsn-nold.log
实测回显:
[2026-10-22T05:37:50] /usr/bin/rsnapshot -c /etc/rsnapshot-nold.conf daily: started
[2026-10-22T05:37:50] echo 6664 > /var/run/rsn-nold.pid
[2026-10-22T05:37:50] native_cp_al("/srv/rsn-nold/daily.0", "/srv/rsn-nold/daily.1")
[2026-10-22T05:37:50] /usr/bin/rsync -a --delete --numeric-ids /srv/rsn-nold/daily.0/ /srv/rsn-nold/daily.1/
[2026-10-22T05:37:50] /usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded /etc/ /srv/rsn-nold/daily.0/localhost/
[2026-10-22T05:37:50] touch /srv/rsn-nold/daily.0/
[2026-10-22T05:37:50] rm -f /var/run/rsn-nold.pid
[2026-10-22T05:37:50] /usr/bin/rsnapshot -c /etc/rsnapshot-nold.conf daily: completed successfully
link_dest 1(同源数据、独立根目录跑两轮):
tail -8 /var/log/rsn-ld1.log
实测回显:
[2026-10-22T05:37:51] /usr/bin/rsnapshot -c /etc/rsnapshot-ld1.conf daily: started
[2026-10-22T05:37:51] echo 6675 > /var/run/rsn-ld1.pid
[2026-10-22T05:37:51] mv /srv/rsn-ld1/daily.0/ /srv/rsn-ld1/daily.1/
[2026-10-22T05:37:51] mkdir -m 0755 -p /srv/rsn-ld1/daily.0/
[2026-10-22T05:37:51] /usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded --link-dest=/srv/rsn-ld1/daily.1/localhost/ /etc/ /srv/rsn-ld1/daily.0/localhost/
[2026-10-22T05:37:51] touch /srv/rsn-ld1/daily.0/
[2026-10-22T05:37:51] rm -f /var/run/rsn-ld1.pid
[2026-10-22T05:37:51] /usr/bin/rsnapshot -c /etc/rsnapshot-ld1.conf daily: completed successfully
机制差异一目了然:
- link_dest 0:轮转时把 daily.0 的内容用
native_cp_al(内建递归硬链接)加 rsync 同步到 daily.1——daily.1 永远是 daily.0 的镜像副本,内容高度冗余; - link_dest 1:轮转是纯
mv(瞬时完成),新备份通过--link-dest与上一份共享未变文件。
磁盘占用实测对比(同样两轮 daily,/etc/ 为备份源):
du -sh /srv/rsn-nold/ /srv/rsn-ld1/; du -csh /srv/rsn-ld1/daily.[01]/ | tail -3
实测回显:
2.4M /srv/rsn-nold/
2.1M /srv/rsn-ld1/
1.8M /srv/rsn-ld1/daily.0/
276K /srv/rsn-ld1/daily.1/
2.0M total
link_dest 1 下 daily.1 只占 276K(与 daily.0 共享大量硬链接),du 的 total 2.0M 已对重复 inode 去重;link_dest 0 两份接近全量。数据量越大、变化率越低,差距越悬殊。生产配置一律 link_dest 1。
💡 技术拓展:「快照存储去重」不止硬链接一种实现。同类方案对比——
方案 原理 代表工具 取舍 文件级硬链接 未变文件共享 inode rsnapshot 零依赖、快照可直接浏览;只能整文件去重 块级去重+压缩 数据切块指纹去重 BorgBackup、Restic 省空间最多;快照需工具才能读 文件系统 CoW btrfs/zfs 子卷快照 snapper 等 系统级原子快照;绑定特定文件系统 rsnapshot 选硬链接路线,换取「快照即普通目录、cp/rsync 直接恢复、无需任何工具解包」的运维简单性,代价是不做压缩、只做文件级去重。
5.6 exclude / include / exclude_file:过滤规则
三参数直接透传给 rsync 的规则引擎(--exclude/--include/--exclude-from),按配置文件中出现顺序拼装,先匹配先生效。
5.6.1 exclude 与 exclude_file 实测
实验源目录构造三种文件:
find /home/demo2/ | sort
实测回显:
/home/demo2/
/home/demo2/docs
/home/demo2/docs/a.txt
/home/demo2/docs/b.tmp
/home/demo2/docs/d.md
/home/demo2/logs
/home/demo2/logs/c.log
实验配置写 exclude *.tmp + exclude_file /etc/rsnap-excludes.txt(文件内容一行一个模式:*.log),备份后检查快照:
rm -rf /srv/rsnapshot-ex; rsnapshot -c /etc/rsnapshot-ex.conf hourly; find /srv/rsnapshot-ex/hourly.0/ | sort
实测回显:
/srv/rsnapshot-ex/hourly.0/
/srv/rsnapshot-ex/hourly.0/localhost
/srv/rsnapshot-ex/hourly.0/localhost/home
/srv/rsnapshot-ex/hourly.0/localhost/home/demo2
/srv/rsnapshot-ex/hourly.0/localhost/home/demo2/docs
/srv/rsnapshot-ex/hourly.0/localhost/home/demo2/docs/a.txt
/srv/rsnapshot-ex/hourly.0/localhost/home/demo2/docs/d.md
/srv/rsnapshot-ex/hourly.0/localhost/home/demo2/logs
b.tmp(exclude)与 c.log(exclude_file)都未进快照,空目录 logs/ 保留。日志可确认规则透传形态:
grep rsync /var/log/rsn-ex.log | tail -1
实测回显:
[2026-10-22T05:43:29] /usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded --exclude=*.tmp --exclude-from=/etc/rsnap-excludes.txt /home/demo2/ /srv/rsnapshot-ex/hourly.0/localhost/
exclude_file 的格式就是 rsync 的 --exclude-from:每行一个模式、# 开头为注释,模式数量多时比几十行 exclude 清爽得多。
5.6.2 排障实录:include 白名单的三个生效条件
include 用于「只备份指定内容」的白名单模式(如 exclude ** 全排 + include 放行个别目录)。它比 exclude 难用得多——本节实测踩过的三个坑,每一个都足以让白名单静默失效(快照为空但不报错)。
坑一:--relative 使规则路径带源路径前缀。 rsnapshot 默认长参数含 --relative,过滤规则匹配的路径是快照内的归档结构路径(如 home/demo2/docs/),而不是 docs/。用 --include=docs/** --exclude=** 实测,快照为空。修正为完整前缀。
坑二:exclude ** 会隐藏传输根。 白名单必须先放行传输根本身,否则 rsync 在根部就被 ** 剪枝,后面的 include 永远没机会匹配。
坑三:rsync_long_args 默认含 --delete-excluded。 该参数把 exclude 规则升级为「发送端隐藏」,** 变成最高优先级的全隐藏规则,include 完全失效。白名单模式必须把 --delete-excluded 从 rsync_long_args 中去掉。
三条件同时满足的白名单配置(rsync_long_args 已去掉 --delete-excluded):
rsync_long_args --delete --numeric-ids --relative
include home/demo2/
include home/demo2/docs/
include home/demo2/docs/**
exclude **
rm -rf /srv/rsnapshot-in; rsnapshot -c /etc/rsnapshot-in.conf hourly; find /srv/rsnapshot-in/hourly.0/ -type f | sort
实测回显:
/srv/rsnapshot-in/hourly.0/localhost/home/demo2/docs/a.txt
/srv/rsnapshot-in/hourly.0/localhost/home/demo2/docs/b.tmp
快照只含 docs/ 下的文件,白名单生效。且注意 b.tmp 也进来了——它匹配 include home/demo2/docs/** 在前,exclude ** 在后,先匹配先赢。想排除 b.tmp 需把 exclude *.tmp 写在 include 之前。
验证坑三(把 rsync_long_args 换回含 --delete-excluded 的默认值,同规则重跑):
sed "s|rsync_long_args\t--delete --numeric-ids --relative|rsync_long_args\t--delete --numeric-ids --relative --delete-excluded|" /etc/rsnapshot-in.conf > /etc/rsnapshot-in-de.conf; rm -rf /srv/rsnapshot-in-de; rsnapshot -c /etc/rsnapshot-in-de.conf hourly; find /srv/rsnapshot-in-de/hourly.0/ -type f | sort; echo "exit=$?"
实测回显:
exit=0
exit=0 但快照一个文件都没有——静默失败,与坑一/坑二的表现相同。这就是白名单模式必须三个条件逐一排查的原因:rsnapshot 不报错、rsync 不报错,只有快照内容会告诉你真相。
5.7 rsync_long_args / rsync_short_args / ssh_args
rsync_short_args 默认 -a(归档模式:递归+保权限/属主/时间戳/软链)。一般不需要动。
rsync_long_args 默认 --delete --numeric-ids --relative --delete-excluded,逐项含义:
--delete:源端删除的文件,下一轮备份后从快照中同步消失(镜像语义)。实测:删除 /home/demo2/docs/d.md 后重跑,快照中 d.md 消失,其余文件保留:
rm /home/demo2/docs/d.md; rm -rf /srv/rsnapshot-ex; rsnapshot -c /etc/rsnapshot-ex.conf hourly; find /srv/rsnapshot-ex/hourly.0/ -type f | sort
实测回显:
/srv/rsnapshot-ex/hourly.0/localhost/home/demo2/docs/a.txt
--numeric-ids:属主/属组按数字 ID 传输,避免两机用户名映射差异导致属主错乱,保留策略场景必留;--relative:快照内保留源路径完整结构(见 5.4.1);--delete-excluded:被排除文件若已存在于快照中也删除之——它同时把 exclude 规则升级为发送端隐藏(见 5.6.2 坑三),改过滤规则时务必想到它。
改 rsync_long_args 会整体覆盖默认值(不是追加),所以自定义时要把默认项抄全再加新项。常见加法如 --stats(rsync 统计进日志)、--bwlimit=5000(限速 5MB/s,白天备份不拖垮业务网)。
ssh_args 默认无。远程备份建议 -o BatchMode=yes(禁交互,密钥不对直接失败而不是卡住等输入,cron 友好)。其生效形态见 5.4.2 日志中的 --rsh=/usr/bin/ssh -o BatchMode=yes。
5.8 lockfile / logfile / loglevel / verbose
lockfile 默认 /var/run/rsnapshot.pid。rsnapshot 启动时检查锁文件:存在且对应进程存活则拒绝运行,防止两个实例并发轮转打乱快照链。手工放置一个存活 PID 的锁文件实测:
echo $$ > /var/run/rsn-ex.pid; rsnapshot -c /etc/rsnapshot-ex.conf hourly
实测回显:
----------------------------------------------------------------------------
rsnapshot encountered an error! The program was invoked with these options:
/usr/bin/rsnapshot -c /etc/rsnapshot-ex.conf hourly
----------------------------------------------------------------------------
ERROR: Lockfile /var/run/rsn-ex.pid exists and so does its process, can not continue
运行结束锁文件自动删除;进程被 kill -9 后会残留死锁文件,rsnapshot 检测到进程不存在会自动清掉继续跑,无需人工干预。多实例场景(不同配置并行)必须给每份配置独立 lockfile,否则互相锁死。
logfile 指定日志文件。轮转 mv、rsync 命令行、钩子执行、成功/失败结论全部记录在案(本文大量排障都靠它)。排障第一动作:tail -50 logfile。
loglevel 控制日志详细度,默认 3。loglevel 3 记录关键步骤(25 行),loglevel 4 追加 rsync 的执行细节(34 行),实测对比:
wc -l /var/log/rsn-ex.log
实测回显(loglevel 4 运行后,loglevel 3 时为 25 行):
34 /var/log/rsn-ex.log
日常 3 足够;深挖 rsync 行为时临时调 4。
verbose 控制标准输出详细度,默认 2(几乎无输出,cron 干净)。verbose 4 时不仅回显完整命令,还会给 rsync 附加 -v 输出文件清单,实测节选:
sed "s/verbose\t2/verbose\t4/" /etc/rsnapshot-ex.conf > /etc/rsnapshot-v4.conf; rm -rf /srv/rsnapshot-ex; rsnapshot -c /etc/rsnapshot-v4.conf hourly 2>&1 | head -8
实测回显:
Setting locale to POSIX "C"
echo 6923 > /var/run/rsn-ex.pid
mkdir -m 0700 -p /srv/rsnapshot-ex/
mkdir -m 0755 -p /srv/rsnapshot-ex/hourly.0/
/usr/bin/rsync -av --delete --numeric-ids --relative --delete-excluded \
--exclude=*.tmp --exclude-from=/etc/rsnap-excludes.txt /home/demo2/ \
/srv/rsnapshot-ex/hourly.0/localhost/
sending incremental file list
💡 说明:verbose 影响的是「屏幕」(cron 场景会进邮件),loglevel 影响的是「日志文件」。想让 cron 安静、日志详尽,就用默认 verbose 2 + loglevel 4。
5.9 rsync_numtries 与 cmd_* 外部工具路径
rsync_numtries 控制 rsync 失败后的重试次数,源码默认 1(试一次即失败)。设 0 表示无限重试(慎用,远程机下线时 rsnapshot 会挂着不退出、lockfile 一直被占)。非法负值会被语法检查拦截:
sed "s|exclude\t\*.tmp|rsync_numtries\t-1|" /etc/rsnapshot-ex.conf > /etc/rsnapshot-nt.conf; rsnapshot -c /etc/rsnapshot-nt.conf configtest
实测回显:
----------------------------------------------------------------------------
rsnapshot encountered an error! The program was invoked with these options:
/usr/bin/rsnapshot -c /etc/rsnapshot-nt.conf configtest
----------------------------------------------------------------------------
ERROR: /etc/rsnapshot-nt.conf on line 10:
ERROR: rsync_numtries -1 - "-1" is not a legal value for rsync_numtries, \
must be greater than or equal to 0
ERROR: ---------------------------------------------------------------------
ERROR: Errors were found in /etc/rsnapshot-nt.conf,
ERROR: rsnapshot can not continue. If you think an entry looks right, make
ERROR: sure you don't have spaces where only tabs should be.
*cmd_ 系列**指定外部工具的绝对路径,缺哪个就报哪个未定义。其中 cmd_rsync 必填;远程备份还需 cmd_ssh;启用 rsnapshot du 需 cmd_du、rsnapshot diff 需 cmd_rsnapshot_diff、loglevel 写 syslog 需 cmd_logger。1.4.x 中 cmd_cp/cmd_rm 已是向后兼容保留项——实测日志可见轮转/复制分别由 mv、内建 native_cp_al、/bin/cp -al(sync_first 模式)完成,rsync 承担了绝大部分文件操作,这两个参数写不写都不影响行为(写上仅保持与老配置兼容)。
5.10 cmd_preexec / cmd_postexec:备份前后钩子
两个参数各接一个本地可执行脚本:cmd_preexec 在每次备份动作前执行,cmd_postexec 在全部备份点完成后执行。脚本失败(非零退出)时 rsnapshot 中止本次备份(preexec)或记录失败状态(postexec)——适合做备份前的数据库停写/快照冻结、备份后的完整性校验与告警上报。
本文实验脚本各追加一行时间戳日志:
cat /usr/local/bin/rsnap-pre.sh; cat /usr/local/bin/rsnap-post.sh
实测回显:
#!/bin/bash
# rsnapshot cmd_preexec demo
/bin/date +'%Y-%m-%d %H:%M:%S cmd_preexec fired' >> /var/log/rsnap-hooks.log
#!/bin/bash
# rsnapshot cmd_postexec demo
/bin/date +'%Y-%m-%d %H:%M:%S cmd_postexec fired' >> /var/log/rsnap-hooks.log
一次完整 hourly 运行后钩子日志:
tail -3 /var/log/rsnap-hooks.log
实测回显:
2026-10-22 04:00:01 cmd_preexec fired
backup_exec ran on backup-server at 2026-10-22 04:00:01
2026-10-22 04:00:01 cmd_postexec fired
时间线 preexec → 备份点(含 backup_exec)→ postexec 清晰可见。两个脚本都只在最低 retain 级别运行时触发(与真实备份同频,高级别纯轮转不触发)。
六、生产配置模板
以下模板面向「中小规模文件服务器每日增量、保留 7 天/4 周/3 月」的典型场景:8GB+ 内存、快照盘 ≥ 源数据 2 倍、SATA SSD/HDD 均可;源数据变化率低于 20%/天。带 # 注释可直接使用(写入时保留 TAB 分隔)。
config_version 1.2
# 快照根:独立数据盘挂载点,no_create_root 1 防误挂载事故
snapshot_root /srv/rsnapshot/
no_create_root 1
# 外部工具路径(Ubuntu 22.04 标准位置)
cmd_cp /bin/cp
cmd_rm /bin/rm
cmd_rsync /usr/bin/rsync
cmd_ssh /usr/bin/ssh
cmd_logger /usr/bin/logger
cmd_du /usr/bin/du
cmd_rsnapshot_diff /usr/bin/rsnapshot-diff
# 保留策略:6 小时快照、7 天、4 周、3 月
retain hourly 6
retain daily 7
retain weekly 4
retain monthly 3
# 日志与锁
verbose 2
loglevel 3
logfile /var/log/rsnapshot.log
lockfile /var/run/rsnapshot.pid
# rsync/ssh 调优:硬链接去重 + 限速 5MB/s 防拖垮业务网
link_dest 1
rsync_long_args --delete --numeric-ids --relative --delete-excluded --bwlimit=5000
ssh_args -o BatchMode=yes
# 过滤:排除缓存与临时文件
exclude *.tmp
exclude cache/
# 备份点:本机关键目录 + 远端文件服务器
backup /etc/ localhost/
backup /home/ localhost/
backup root@file-server:/srv/appdata/ file-server/
要点解读:no_create_root 1 要求部署时手工 mkdir /srv/rsnapshot 一次;bwlimit 按业务网余量调整,夜间窗口可去掉;link_dest 1 是本模板省盘的核心,不得关闭;远程源写成 root@file-server 时需配套该账号的免密密钥(本文实验采用专用低权账号 backup@file-server,权限更收敛,生产建议沿用专用账号)。
七、常见问题
Q1:configtest 报 missing tabs to separate words,但我的配置看起来明明是 TAB?
多半是编辑器把 TAB 自动转成了空格(vim 的 expandtab、某些网页复制)。用 cat -A /etc/rsnapshot.conf 检查:TAB 显示为 ^I。修复:vim 中 :set noexpandtab 后对问题行重新缩进,或直接从 zcat /usr/share/doc/rsnapshot/examples/rsnapshot.conf.gz 重新起步。完整报错形态与级联报错分析见 5.1.3。
Q2:include 白名单配了但快照是空的,也不报错? 按三条件逐一排查(见 5.6.2):规则路径是否带了 --relative 的源路径前缀(home/demo2/docs/ 而非 docs/);是否放行了传输根本身(include home/demo2/);rsync_long_args 是否还含 --delete-excluded(含则必失效)。三者齐备后仍空,再检查 include 与 exclude 的书写顺序(先匹配先赢)。
Q3:磁盘突然涨满,快照占的空间怎么估?
确认配置了 cmd_du 后直接运行 rsnapshot du,按快照级别逐份统计且自动按硬链接去重:
rsnapshot du
实测回显:
16M /srv/rsnapshot/hourly.0/
312K /srv/rsnapshot/hourly.1/
312K /srv/rsnapshot/hourly.2/
272K /srv/rsnapshot/hourly.3/
260K /srv/rsnapshot/hourly.4/
264K /srv/rsnapshot/hourly.5/
260K /srv/rsnapshot/daily.0/
8.3M /srv/rsnapshot/daily.1/
26M total
普通 du -sh 会把硬链接重复计数——同一份 hourly.1 单独统计显示 16M:
du -sh /srv/rsnapshot/hourly.1/
实测回显:
16M /srv/rsnapshot/hourly.1/
对比 rsnapshot du 里 hourly.1 只有 312K:差异部分全部是与相邻快照共享的硬链接文件。估算真实占用一律以 rsnapshot du 的 total(去重口径)为准;du -csh /srv/rsnapshot/hourly.[0-5]/ 分项合计也能得到去重结果(原理见 5.5 节 du 实测)。
Q4:rsnapshot version 怎么不显示版本号?
Ubuntu 22.04 的 1.4.3-2 打包缺陷:/usr/bin/rsnapshot 中 my $VERSION = ''; 未注入版本号,导致 version 子命令只输出 rsnapshot、version-only 输出空行。查版本用 dpkg -l rsnapshot 或 apt policy rsnapshot。
Q5:开了 sync_first,快照怎么一直停在旧数据?
sync_first 1 后所有 retain 级别只轮转不备份,真实备份只在 rsnapshot sync 里发生。cron 表必须加 sync 条目且频率不低于最低级别,详见 5.3.5;从未跑过 sync 时 lowest interval 会静默空转(实测日志见 5.3.5 末尾),容易误以为一切正常。
Q6:两台服务器用户名不一致,恢复出来属主乱了?
确认 rsync_long_args 含 --numeric-ids(默认含)。若自定义过 rsync_long_args 且漏抄此参数,属主会按两端用户名映射错位;按数字 ID 传输即可保持一致。
Q7:快照根所在盘掉线过一次,怎么防止 rsnapshot 在空挂载点上继续写?
no_create_root 1(见 5.2.2):目录消失即报错 rsnapshot refuses to create snapshot_root when no_create_root is enabled,配合监控告警把故障前置。再配合 5.8 的 logfile 监控 ERROR 关键字即可闭环。
八、参考链接
- rsnapshot 官网:http://rsnapshot.org/
- rsnapshot 官方 HOWTO(配置参数权威说明):http://rsnapshot.org/howto/1.4/rsnapshot-HOWTO.en.html
- rsnapshot.conf 手册页:
man rsnapshot(服务器本机阅读,参数与默认值以本手册为准) - 本系列相关文档:《rsnapshot 介绍与选型指南》(定位与选型)、《Ubuntu 22.04 安装 rsnapshot 1.4.3 指南》(安装与部署)、《rsnapshot 1.4.3 常用 CLI 命令详解》(子命令实操)
- 同类工具对照:《Duplicity 介绍与选型指南》(加密增量备份路线)、《Syncthing 介绍与选型指南》(持续同步路线)