Backupninja 1.2.2 配置文件体系详解
Backupninja 1.2.2 配置文件体系详解:全局主配置 /etc/backupninja.conf、动作配置目录 /etc/backup.d/ 与各 handler 段落字段三层一次讲透,文件原文、字段默认值与报错产物均 Debian 13 实测取证。
Backupninja 1.2.2 配置文件体系详解
目标:把 Backupninja 的三层配置体系(全局主配置 /etc/backupninja.conf、动作配置目录 /etc/backup.d/、各 handler 的段落字段)一次讲透。文中所有文件原文、字段默认值、报错与产物均为 Debian 13 上 Backupninja 1.2.2-1 的实机验证记录(环境见第一节),涉及调度语义的部分以随包手册 backup.d(5)、backupninja.conf(5) 为准。
一、环境信息
| 项目 | 实测值 |
|---|---|
| 操作系统 | Debian 13.7 (trixie),x86_64,容器 systemd 环境 |
| 软件版本 | backupninja 1.2.2-1(Debian trixie/main) |
| 实测日期 | 2026-10-24 |
| 参照手册 | backupninja(1)、ninjahelper(1)、backup.d(5)、backupninja.conf(5)(随包 1.2.2-1) |
| 实测 handler | .tar、.rsync、.rdiff、.sys、.sh 共五类(其余九类以包内 example.* 为准) |
安装过程与运行验证见 《Debian 13 安装 Backupninja 1.2.2 指南》,架构与选型背景见 《Backupninja 1.2.2 介绍与选型指南》。
二、配置体系总览
Backupninja 的配置分三层,读取顺序自上而下:
| 层 | 文件/目录 | 谁来解析 | 覆盖关系 |
|---|---|---|---|
| 全局层 | /etc/backupninja.conf | 主脚本 backupninja | 提供默认调度(when)、日志与报告参数、各目录路径、程序路径 |
| 动作层 | /etc/backup.d/双数字序.后缀 | 主脚本预解析 when,其余按后缀转发 | 文件内 when = 覆盖全局默认调度 |
| handler 层 | 后缀对应 /usr/share/backupninja/ 下的脚本 | 各 handler 自行解析 ini 段/键或整段脚本 | 不同后缀的字段集互不通用 |
一个动作配置的一生:cron 每小时拉起主脚本 → check_perms 权限校验 → 预解析 when 决定本次是否执行 → 以 /var/lock/backupninja/ 锁文件互斥 → 按 .sh(整文件当脚本执行)或「ini 段 + 后缀」把配置交给 handler → 结果计入汇总日志与邮件报告。
三、全局配置 /etc/backupninja.conf 详解
3.1 实测原文(1.2.2-1 包内默认值)
#
# |\_
# B A C K U P N I N J A /()/
# `\|
# main configuration file
#
# how verbose to make the logs
# 5 -- Debugging messages (and below)
# 4 -- Informational messages (and below)
# 3 -- Warnings (and below)
# 2 -- Errors (and below)
# 1 -- Fatal errors (only)
loglevel = 4
# Produce prometheus metrics of backup status (default = no).
# Requires `prometheus-node-exporter` to be installed
reportprom = false
# send a summary of the backup status to
# this email address:
reportemail = root
# if set to 'yes', a report email will be generated
# even if all modules reported success. (default = yes)
reportsuccess = yes
# if set to 'yes', info messages from handlers will be
# sent into the email (default = no)
reportinfo = no
# if set to 'yes', a report email will be generated
# even if there was no error. (default = yes)
reportwarning = yes
# if set to 'yes', disk space usage will be included in
# the backup email report
reportspace = no
# where to rsync the backupninja.log to be aggregated in
# a ninjareport
reporthost =
# what user to connect to reporthost to sync the
# backupninja.log
reportuser = ninja
# where on the reporthost should the report go
reportdirectory = /var/lib/backupninja/reports
# number of columns the report email body should wrap to
#reportwrap = 80
# set to the administration group that is allowed to
# read/write configuration files in /etc/backup.d
admingroup = root
# where to log:
logfile = /var/log/backupninja.log
# directory where all the backup configuration files live
configdirectory = /etc/backup.d
# where backupninja helper scripts are found
scriptdirectory = /usr/share/backupninja
# where backupninja libs are found
libdirectory = /usr/lib/backupninja
# whether to use colors in the log file
usecolors = yes
# default value for 'when'
when = everyday at 01:00
# programs paths(可覆盖各后端工具路径,默认全部注释)
# RDIFFBACKUP=/usr/bin/rdiff-backup
# MYSQL=/usr/bin/mysql
# MYSQLDUMP=/usr/bin/mysqldump
# PSQL=/usr/bin/psql
# RSYNC=/usr/bin/rsync
# ...(SLAPCAT、LDAPSEARCH、CSTREAM、MYSQLHOTCOPY、
# PGSQLDUMP、PGSQLDUMPALL、GZIP、GZIP_OPTS 等同段)
(原文为完整注释文件,上方为保留全部生效键与关键注释的节选;lockdirectory 缺省即 /var/lock/backupninja,实测锁文件名形如 /var/lock/backupninja/_etc_backup.d_10.tar。)
3.2 字段逐项解读
| 字段 | 默认值 | 作用与实测语义 |
|---|---|---|
| loglevel | 4 | 日志级别 1–5;实测 4 时输出 Info/Debug 混合流,5 最啰嗦(排查 handler 行为时建议临时调 5) |
| reportemail | root | 报告收件人;配合本地 MTA 投递,实测 exim4 送达主题 backupninja: backup-server / success -- /etc/backup.d/40-dpkg.sh |
| reportsuccess | yes | 成功轮次也发邮件(实测成功轮次收到了邮件,与默认值一致) |
| reportinfo | no | info 级消息是否进邮件 |
| reportwarning | yes | 有警告动作时发送 |
| reportspace | no | 报告中是否附带磁盘空间告警 |
| reporthost / reportuser / reportdirectory | 空 / ninja / /var/lib/backupninja/reports | 把各机 /var/log/backupninja.log rsync 到报表机聚合为 ninjareport;单机可留空 |
| admingroup | root | 允许读写 /etc/backup.d 的管理组 |
| logfile | /var/log/backupninja.log | 主日志路径 |
| usecolors | yes | 日志着色 |
| reportprom | false | 1.2.2 新增:输出 Prometheus node-exporter 文本文件指标;实测即使 false,目录 /var/lib/prometheus/node-exporter 缺失时每轮仍打印一行 Error: ... does not exist!(不计入错误统计) |
| scriptdirectory | /usr/share/backupninja | handler 脚本目录;自研 handler 放这里 |
| libdirectory | /usr/lib/backupninja | 框架函数库(easydialog、parseini、tools) |
| configdirectory | /etc/backup.d | 动作配置目录 |
| backupdir | /var/backups | 全局默认备份根目录(默认注释,即用 /var/backups),可被动作文件内 backupdir 覆盖 |
| when | everyday at 01:00 | 全局默认调度;动作文件内未写 when 时生效 |
| 程序路径段 | 全注释 | RDIFFBACKUP、MYSQL、MYSQLDUMP、PSQL、RSYNC 等可显式指定各后端工具路径 |
四、动作配置文件(/etc/backup.d/)
4.1 命名规则与执行顺序
- 命名模板:
[0-9][0-9]<名称>.<后缀>,如10-etc.tar、20-var.rsync、40-dpkg.sh。后缀决定 handler,双数字序决定同类内顺序; - 主脚本按文件名排序执行(实测顺序:10-etc.tar → 20-var.rsync → 30-sys.sys → 40-dpkg.sh → 50-etc.rdiff);
- 官方手册建议:数据库 dump 类小编号在前,文件系统增量类大编号在后,使导出的 SQL 落入后续的文件备份中;
- 临时停用:把文件改名为
*.disabled(ninjahelper 的 disable/enable 菜单就是做这个改名); - ninjahelper 向导生成的文件采用
10.tar这种「数字.后缀」形式(实测生成 /etc/backup.d/10.tar),与手工命名10-etc.tar同属合法形态。
4.2 权限纪律(硬性)
每个动作文件必须属主 root 且组/其他无读写权限(实测合法形态 -rw------- root root);/etc/backup.d/ 目录本身为 drwxrws---(带 setgid)。权限不符时主脚本在 check_perms 阶段拒绝,日志会出现 Debug: check_perms ... 流。新建后统一 chmod 600 是必备动作。
4.3 when 调度语法
when 写在动作文件内(或全局 conf),支持多行并存:
| 写法 | 含义 | 实测行为 |
|---|---|---|
when = everyday at 01:00 | 每天 01:00 那次整点执行(分钟可省略 01) | --test 输出 skipping ... because current time does not match everyday at 01:00 |
when = sundays at 02:00 / when = Tuesday at 05:00 | 每周指定日 | 星期名大小写均可 |
when = 30th at 22 / when = 30 at 22:00 | 每月 30 日 22 点 | th 后缀可选 |
when = hourly | 主脚本每次被 cron 拉起都执行 | 实测在任意整点均命中(日志标 because 'when = hourly') |
when = manual | 不参与定时,仅 backupninja --run 或 ninjahelper 手动执行 | 实测 --test 输出 does not match manual |
语法红线(backup.d(5) 原文归纳):at 之后必须是两位小时(可附 :分钟);at 5:00、tuesday at 2am 属于非法写法;合法星期/日与时刻组合共 7 种官方示例(sundays、30th、30、everyday、Tuesday、hourly、manual)。
4.4 格式约定
.sh动作是纯 shell 脚本(第一行when = ...被主脚本预解析,其余行原样执行);实测确认 test 模式下 .sh 不真正执行——handler 内部逻辑为[ $test ] || ( . $1 ),即只有正式运行才加载脚本体;- 其余后缀为 ini 风格
[section]+key = value,#注释;同一键重复出现(如多个include =)即多值累积,是 include/exclude 类字段的标准用法; - 段名与键名因 handler 而异,见第五节分型详解。
五、handler 配置分型详解(五类实测)
5.1 .tar 全量归档
# /etc/backup.d/10-etc.tar(实测配置原文)
when = manual
backupname = backup-server
backupdir = /srv/backup/tar
compress = bzip
includes = /etc
excludes = /tmp /proc /sys /dev
| 键 | 说明 |
|---|---|
| when / backupname / backupdir | 调度、产物文件名前缀、目标目录(自动创建) |
| compress | bzip(默认)/ gzip / none |
| includes / excludes | 空格分隔多路径,生成 tar 的 --exclude 序列 |
实测产物三件套(ls 原文):
-rw------- 1 root root 111 Oct 24 06:46 backup-server-2026.10.24-0646.err
-rw------- 1 root root 20931 Oct 24 06:46 backup-server-2026.10.24-0646.list
-rw------- 1 root root 309662 Oct 24 06:46 backup-server-2026.10.24-0646.tar.bz2
.err 内容为 tar 提示(如 Removing leading '/' from member names)。另一实测细节:日志中 handler returned exit code 1 与 SUCCESS 并存——tar handler 末行的 [ $? -ne 0 ] 判定式本身返回 1(tar 实际成功、无 fatal 触发),属于框架的「正常噪音」,不必按字面理解为失败。
5.2 .rsync 目录镜像(含轮转)
# /etc/backup.d/20-var.rsync(实测配置原文)
[general]
mountpoint = /srv/backup
backupdir = rsync/var
format = short
days = 7
[source]
from = local
include = /var/log
[dest]
dest = local
三段结构:[general] 管目标与轮转——mountpoint 是备份主目录(不必是真实挂载点)、backupdir 是相对 mountpoint 的子目录、format 有 short(backup.0、backup.1…按 days 个增量轮转,取自 rsync_snapshots 增量法)/long(daily.1、weekly.1、monthly.1,由 keepdaily/keepweekly/keepmonthly 控制)/mirror(不轮转)三种;[source] 的 from = local|remote 与 include/exclude 决定备份什么;[dest] 的 dest = local|remote(remote 时补 host/user/sshoptions)决定推到哪里。
实测第一跑直接 Fatal: Backupdir /srv/backup/rsync/var does not exist——rsync handler 不自动建目标目录,mkdir -p 该组合路径后重跑成功。成功后的落盘结构(find 原文节选):
/srv/backup/rsync/var/var/log/log.0/ # 本次镜像(log.0)
/srv/backup/rsync/var/var/log/metadata/ # 轮转元数据(备份时间戳等)
注意路径出现 var/var:backupdir 段 + include 路径原样拼接所致,规划 backupdir 命名时要预估最终目录形态。
5.3 .rdiff 增量备份
# /etc/backup.d/50-etc.rdiff(实测配置原文,修正后可跑通版本)
[source]
label = backup-server
type = local
include = /etc
include = /root
exclude = /etc/systemd/system
[dest]
type = local
directory = /srv/backup/rdiff/backup-server
keep = 60
| 键 | 说明 |
|---|---|
| [source] label | 备份标签,会作为 [dest] directory 下的一层子目录(实测最终路径 = directory/label) |
| [source] type | local / remote(remote 时配 host/user/sshoptions) |
| include / exclude | 多值键,映射为 rdiff-backup 的 --include/--exclude |
| [dest] type | local / remote;漏配时 handler 报 Fatal: desttype '' is neither local nor remote(实测踩坑原文) |
| [dest] directory + keep | 目标目录(父目录需预先存在,否则 Unable to delete and/or create directory)与保留策略(60 即 60D) |
| 其他可用键 | options(附加参数)、nicelevel、bwlimit、ignore_version、testconnect 等(handler 源码 getconf 实查) |
兼容性实测:Debian trixie 的 rdiff-backup 2.2.6 走 legacy CLI 兼容模式可正常备份(会话统计正常输出),但每次打印 deprecated 告警,导致动作以 WARNING 收尾——用 2.x 引擎时需知晓;引擎侧原理与用法见 《rdiff-backup 介绍与选型指南》。
5.4 .sys 系统信息收集
# /etc/backup.d/30-sys.sys(实测配置原文)
packages = yes
partitions = yes
hardware = yes
dohwinfo = yes
实测产物(/var/backups/,即全局 backupdir):
-rw-r--r-- 1 root root 6114 Oct 24 06:47 debconfsel.txt # debconf 应答
-rw-r--r-- 1 root root 1874 Oct 24 06:47 dpkg-selections.txt # 包清单
-rw-r--r-- 1 root root 152K Oct 24 06:47 hardware.txt # hwinfo 输出
-rw-r--r-- 1 root root 10.1M Oct 24 06:47 sysreport.txt # 系统报告汇总
依赖实测:未装 fdisk 时报 Warning: can't find sfdisk, skipping sfdisk report,apt-get install fdisk kmod 后该告警消失;残留 Info: executing of /sbin/modinfo failed 为 Info 级、不影响 SUCCESS。选型上这类「系统画像」文件适合纳入每天的文件备份——sys 用小编号、文件备份用大编号。
5.5 .sh 自定义脚本
# /etc/backup.d/40-dpkg.sh(实测配置原文)
when = hourly
dpkg --get-selections > /srv/backup/dpkg-selections.txt
首行 when 被主脚本预解析,其余内容在正式运行时由 sh 加载执行(脚本体内可直接调用框架 fatal/error 函数做结果上报)。实测:--test 模式不执行脚本体(无产物生成);正式 --run 与 cron 触发均真实落盘。它是打通「安装→验证→定时」全链路的最短路径,也是自定义前后钩子(如备份前冻结数据库、备份后清理临时区)的扩展点。
5.6 其余 handler 速览(以包内 example.* 为准)
| 后缀 | 段结构 | 典型键(示例文件实查) |
|---|---|---|
| .mysql | ini | databases、backupdir、hotcopy 等;依赖 mysql 客户端 |
| .pgsql | ini | databases、backupdir、stopvm 等;依赖 pg_dump 系 |
| .dup | ini([source]/[dest]/[gpg]/[general] 型多值键) | include/exclude 多值(示例含 /etc、/root、/home 等)、encryptkey/signkey、desturl 型远端;duplicity 依赖,能力详见 《Duplicity 介绍与选型指南》 |
| .borg | ini(多值 include/exclude) | 示例含 include = /opt /srv /etc /root /home /usr/local /var;borg 仓库/密钥段见 example.borg |
| .restic | ini | repository = /mnt/backup、password = secret、run_backup = yes、dry_run |
| .maildir | ini | 基于慢速 rsync 的邮件目录同步 |
| .svn / .trac | ini | svnadmin dump / trac-admin hotcopy 封装 |
| .makecd | ini | genisoimage/wodim 制作 ISO/刻录 |
六、校验与试运行方法
排查配置的标准动作(全部实测有效):
backupninja --test:全量 dry-run,逐文件输出 check_perms 与 when 匹配结果,不真正执行 handler(.sh 也不执行);backupninja --test --run /etc/backup.d/10.tar:单文件试运行,输出 handler 将要执行的完整命令行(实测可见 tar 的 --exclude/-f 全序列);backupninja --run 文件:单文件正式执行,日志标because of --now;backupninja -n:本次全量执行但不发邮件报告;- 临时把全局 loglevel 调到 5,看 handler 的每步 Debug;
- TUI 侧的 ninjahelper 每条动作菜单里也有 test 项,等价于第 2 条(详见本专栏命令详解篇)。
七、参考链接
- 本站专栏:《Debian 13 安装 Backupninja 1.2.2 指南》(安装与运行验证)
- 本站专栏:《Backupninja 1.2.2 介绍与选型指南》(架构与选型)
- 本站专栏:《rdiff-backup 介绍与选型指南》(.rdiff 引擎)
- 本站专栏:《rsnapshot 配置文件详解》(同为配置文件驱动,含 rsync 轮转语义对照)
- 本站专栏:《Duplicity 介绍与选型指南》(.dup 引擎)
- 随包手册:backup.d(5)、backupninja.conf(5);示例:/usr/share/doc/backupninja/examples/(backupninja 1.2.2-1,实测环境 Debian 13)