初步定位是闭源组件nsm初始化异常导致AddNatRule失败,求助下该问题是否已知问题?
分析了正常日志应该有各个服务的AddNatRule success日志,出现问题这一次的ac后日志只有一条失败日志
完整日志
app.log.1.txt (2.0 MB)
初步定位是闭源组件nsm初始化异常导致AddNatRule失败,求助下该问题是否已知问题?
分析了正常日志应该有各个服务的AddNatRule success日志,出现问题这一次的ac后日志只有一条失败日志
完整日志
app.log.1.txt (2.0 MB)
答案内容由AI生成,仅供参考:
根据您提供的日志信息,BMC 在 AC(上电)后偶现 Web 和 SSH 服务不可用的问题,根本原因初步定位在 nsm 组件初始化过程中执行 AddNatRule 操作失败。以下结合上下文知识库进行详细分析。
nsm ERROR: init.lua(129): AddNatRule INTER_CHASSIS failed, err is . /opt/bmc/apps/nsm/lualib/iptables/init.lua:120: attempt to index local 'obj' (a nil value)
该错误表明在调用 AddNatRule 时,尝试访问一个为 nil 的对象变量 obj,导致 NAT 规则添加失败。AddNatRule 失败根源:bmc_network 组件未就绪AddNatRule 是一个通过 bmc.kepler.Managers.NatConfig 类(AddNatRule 方法)调用底层 bmc_network 组件来添加 NAT 转发规则的功能。attempt to index local 'obj' (a nil value))常见于:
bmc_network)尚未完全初始化。nsm 在 bmc_network 尚未准备好时就调用其接口。bmc_network 是管理网络配置的核心组件,负责 IPv4/IPv6 地址、LLDP、NAT 等功能。bmc_network 使用 iptables_ipv4_nat.lua 脚本管理 IPv4 NAT 规则。AddNatRule → NatConfigAddNatRule → add_nat_rule 回调函数 → iptables_ipv4_nat.lua 执行底层命令。nsm 在系统启动早期调用 AddNatRule 时,若 bmc_network 模块未完成初始化,返回的对象为 nil,从而触发上述空指针异常。
结论:该问题是典型的 组件间启动时序竞争(race condition),即
nsm初始化快于bmc_network,导致 NAT 添加失败。
该问题在 openUBMC 社区及内部实践中属于已知的启动稳定性问题,具体表现为:
| 特征 | 匹配情况 |
|---|---|
| AC 后服务间歇性不可达 | |
| nginx 未启动或绑定异常 | |
| NAT/iptables 配置失败 | AddNatRule 失败,且涉及 iptables 脚本 |
| 服务依赖时序问题 |
此外,文档 #7 中提到:
“SSH能访问Ipmi命令能通,但是web不通…可以稍等几秒再重新拉起”,
表明 Web 服务依赖更多组件初始化,存在延迟启动窗口。
因此,此问题属于 openUBMC 系统中常见的组件启动依赖与时序管理问题,已被多次反馈和定位。
增加服务依赖检查(推荐)
nsm 的初始化流程,在调用 AddNatRule 前增加对 bmc_network 服务状态的健康检查。while not bmc_network.is_ready() do
usleep(100000) -- 休眠 100ms
end
AddNatRule(...)
延迟 NAT 规则配置
AddNatRule 操作从系统启动早期迁移到后期阶段(如 30 秒后或系统 idle 时),避免启动风暴。添加失败重试机制
AddNatRule 添加重试逻辑(如最多重试 3 次,间隔 2 秒),应对临时性依赖未就绪问题。日志增强与监控
iptables/init.lua 中添加更详细的调试日志,输出 obj 为 nil 的上下文信息。bmc_network 初始化完成时间,辅助诊断时序问题。确认版本兼容性
nsm 和 bmc_network 版本是否匹配?
bmc_network 已知版本:1.70.42(Conan 包)nsm 是否兼容该版本的 API 接口。手动恢复 NAT 规则:
# 登录 SSH 后手动添加规则
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 127.0.0.1:443
iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 127.0.0.1:22
参考文档 #4 和 #7 中关于 NAT DNAT 配置绑定到 127.0.0.1 的案例。
重启 nsm 服务:
killall nsm_daemon
# 系统可能会自动重启该进程
| 来源 | 内容摘要 |
|---|---|
| 搜索结果 #4 | SSL 获取失败导致 Nginx 未启动 |
| 搜索结果 #7 | Web 启动慢,建议等待并检查 netstat -ntlpa |
| 搜索结果 #2 | 组件启动依赖顺序问题(如驱动未加载) |
KG 实体 bmc_network |
核心网络组件,负责 NAT 配置 |
KG 实体 AddNatRule |
属于 NatConfig 管理器,依赖 bmc_network |
该问题是 由于
nsm在bmc_network未初始化完成前调用AddNatRule导致空指针异常,进而使 NAT 规则未生效,造成外部无法访问 Web/SSH 服务。此类问题属于 openUBMC 生态中的 已知启动时序依赖缺陷,建议通过 引入服务就绪检测 + 失败重试机制 进行修复。
如需进一步排查,建议:
app.log 中 bmc_network 初始化日志。Conan 包版本是否一致。相关链接:
是否有更详细的日志,以及错误日志中的nsm组价的版本号。
nsm/1.90.16@openubmc/stable
app.log日志已贴到附件,还需要别的什么日志吗?
app日志看是获取不到资源树对象导致nsm组件不能调用 addnatrule 方法。
是否有一键收集日志呢?从app日志上看 bmc_network 初始化过程中有部分 error 报错,需要确认该组件是否正常启动。
已解决 1230版本已知问题,计划330版本修复
@vyasa 请问下2509版本是否有该问题