
Hat
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 摘要 (Powered by OpenAI)
本文深入介绍了 BIRD 配置管理器的四层配置架构、热重载和撤销机制,以及 CLI 命令行解析与配置文件解析共享同一语法引擎的设计。
BIRD 的配置系统由三个模块协同工作:
💡 译者注
BIRD 的配置解析器是用 Bison (YACC 的 GNU 版本) 生成的,语法定义位于 conf/cf-lex.l (词法) 和 conf/cf-parse.y (语法)。这种工具链选择在 90 年代末期设计 BIRD 时是主流做法,至今仍保证了良好的向后兼容性和确定性解析行为。现代路由器软件(如 FRRouting)已大多转向基于 protobuf/gRPC 的配置接口。
配置管理器最精巧的设计是同时共存最多四份配置:
| 配置 | 指针变量 | 状态说明 |
|---|---|---|
| 活动配置 (Active) | config | 当前正在使用的配置,所有模块从中读取参数 |
| 旧配置 (Old) | old_config | 正在从中切换出的配置,用于 undo 回滚 |
| 待生效 (Future) | future_config | 排队等待下次重配置。若用户再次重配置,旧的被释放并替换 |
| 解析中 (New) | new_config | 正在解析的新配置。仅在解析期间非 NULL,关联的内存池 cfg_mem 也仅在解析期间存在 |
用户执行 configure
│ ┌─── 解析成功 ───► config_commit() ──► future_config
▼ │ (等待用户 confirm)
config_alloc() ──► new_config
│ │ config_timer 超时
▼ │ (未确认)
config_parse() │ │
│ │ ▼
├── 成功 ────────────┘ config_undo()
│ (恢复到 old_config)
└── 失败 ──► config_free(new_config)
(new_config = NULL)💡 译者注
四份配置同时存在的设计对于路由器软件的可靠性至关重要。在生产环境中,错误的配置变更可能导致全网路由中断。BIRD 的"配置确认"机制(configure 后需在限定时间内 confirm)类似于 Juniper JunOS 的 commit confirmed——如果在超时前未确认,自动回滚到旧配置。这是运营商级路由软件的基本要求。
流程简洁明了:
struct config *c = config_alloc("新配置名"); // 1. 分配 config 结构
int ok = config_parse(c); // 2. 解析配置文件
if (ok) config_commit(c); // 3. 提交切换
else config_free(c); // 解析失败则释放CLI 命令的解析方式与配置文件完全一致——共享同一套词法和语法分析引擎。区别仅在于:
config 结构体这种"配置即 CLI"的统一设计避免了维护两套解析逻辑的负担。
| 函数 | 说明 |
|---|---|
config_alloc(name) | 创建新 config 结构,附加资源池和线性内存池 |
config_parse(c) | 调用 cf_read_hook 读取输入并解析。前后执行 preconfig/postconfig 钩子 |
config_commit(c) | 通知配置管理器切换到新配置,成为 future_config |
config_free(c) | 释放配置结构及所有关联资源 |
config_free_old() | 释放 old_config,在请求重配置时使用,避免同时保留三份配置 |
cli_parse(c) | 解析 CLI 命令(与 config_parse 共享引擎) |

译者
原文作者: <Ondrej Filip>, <Martin Mares>, <Maria Matejka>, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=prog-3.html
原文标题: 3. Configuration
遵循协议: CC BY-NC-SA 4.0
译者: hat
翻译时间: 2026-05-01
更新时间: 2026-05-01
本文链接: https://bird.xmsl.dev/docs/developer-guide/3-1-configuration.html