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备份恢复rsnapshot2026/10/22

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 指南》,完成以下前置:

  1. 已安装 rsnapshot 1.4.3 及其依赖(rsync、perl、logger);
  2. 已创建快照根目录(或接受 rsnapshot 自动创建,见 5.2 节 no_create_root);
  3. 远程备份场景下,备份服务器对被备份机的 ssh 免密登录已打通(本文使用 backup@file-server,验证命令见 5.7 节);
  4. 有 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_version1.2配置文件格式版本,固定写 1.2
snapshot_root无(必填)快照存储根目录,必须以 / 结尾(自动补齐见 5.2)
no_create_root0置 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_first0置 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-arsync 短参数
rsync_long_args--delete --numeric-ids --relative --delete-excludedrsync 长参数,改动需谨慎
ssh_args无ssh 额外参数
link_dest0置 1 启用 rsync --link-dest 硬链接去重,强烈建议开启
rsync_numtries1rsync 重试次数,0 表示无限重试
du_args-cshrsnapshot du 传给 du 的参数

日志与并发类:

参数默认值职能
logfile无日志文件路径
loglevel3日志详细度 1-5,4 起记录 rsync 过程
verbose2标准输出详细度 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.

三个排障要点从这个报错里读出来:

  1. 第 2 行 snapshot_root 用空格分隔 → 直接报 missing tabs to separate words - change spaces to tabs;
  2. snapshot_root 解析失败后,后续所有 backup 点级联报错(snapshot_root needs to be defined before backup points)——遇到一堆 backup 报错时,先检查第一处 TAB 错误,别逐行去改 backup 行;
  3. 报错行号精确到行,且结尾提示 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),每次运行 rsnapshot hourly 时 hourly.5 删除、hourly.04 依次后移、新备份落 hourly.0;hourly 链溢出的 hourly.5 晋升为 daily.0(rsnapshot 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 级别运行时执行(与真实备份同频),高级别轮转不会重复执行脚本。

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。

💡 技术拓展:「快照存储去重」不止硬链接一种实现。同类方案对比——

方案原理代表工具取舍
文件级硬链接未变文件共享 inodersnapshot零依赖、快照可直接浏览;只能整文件去重
块级去重+压缩数据切块指纹去重BorgBackup、Restic省空间最多;快照需工具才能读
文件系统 CoWbtrfs/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 关键字即可闭环。

八、参考链接