openUBMC300 V3问题定位分享
更新时间: 2025/12/23
在Gitcode上查看源码

定位问题基本思路:

  1. 确定版本
  2. 结合日志确定代码异常点
  3. 在异常点附近增加日志,复现问题

通用问题定位

如何确定版本

首先确定openUBMC大版本与构建时间,是否为目标版本,命令行下执行:

bash
ipmcget -d version

此处展示了openUBMC主版本:5.1.0.1,B版本B002,以及构建时间、备区版本号等

然后确定组件版本号:

bash
cat /etc/package_info

通过组件版本号可以方便的定位到组件代码记录,恢复代码现场。

有哪些日志需要关注

首先跟进日志找到报错问题点,环境日志存放目录: /var/log

app.log 调试日志,系统运行过程中会记录的日志,一般运行中报错看这里

operation.log 操作日志,客户可以看到的日志,一般记录用户的操作,整体上需要和v2一致

security.log 安全日志,客户可以看到的日志,一般记录登录、锁定等安全信息

framework.log 文件,存放每个组件被拉起时的日志(skynet框架日志),如果某个组件启动失败,会在这里报错

如果在组件中加print打印,也可以使用journalctl来查看服务的日志:

bash
journalctl -f -u security

其中:

-f参数表示持续跟踪打印的日志

-u后跟模块名可以只查看某个systemd拉起服务的日志

资源树查询基本操作

针对找不到资源树路径、接口、属性等问题,可以先手动查看dbus资源树,再确定是否由依赖组件资源不存在导致。

基础linux命令

  1. 初始化dbus环境:

bmc环境可以直接执行source /etc/profile;如果自定义的dbus环境,需要指定DBUS_SESSION_BUS_ADDRESS与DBUS_SESSION_BUS_PID即可

  1. 查看当前服务的启动情况:

可以使用ps aux加grep操作,例如过滤所有包含config字段的进程:ps aux|grep config.cfg

  1. 重启某个服务

可以使用systemd的restart命令:systemctl restart security

或者直接kill掉某个进程,目前bmc组件会自动重拉:kill {进程PID号}

如果要重启所有服务,可以使用以下命令:

bash
ps aux|grep config.cfg|grep -v "grep config.cfg"|awk '{print($2)}'|xargs kill
# 或者
killall skynet
  1. 替换某个文件内容

使用vi操作,vi的用法不在这里赘述

如何在异常情况下通过删除数据库恢复环境

目前数据库存储了ip、用户名密码、ssl证书等信息,如果删除数据库后,需要重新初始化这些信息,才能重新正常使用BMC

其中用户名密码会恢复为默认,ssl证书可以重新导入,但是ip信息需要预先记录下来。先登录bmc环境,执行如下命令

重要:删除数据库会导致ip丢失,无串口环境谨慎操作

bash
# 推荐ipmc命令查询ip相关信息
ipmcget -d ipinfo
# 查询ip等信息,资源树路径可能会变动,已最新的为准/bmc/kepler/Managers/后的id表示bmc管理板id,默认为1
busctl --user introspect bmc.kepler.bmc_network /bmc/kepler/Managers/1/EthernetInterfaces/Ipv4

将ip、子网掩码、网关记录下来

bash
# 将数据库备份,并重启服务
mv /data/trust/persistence/per_poweroff.db /data/trust/persistence/per_poweroff.db.bak

# 可以重启持久化服务,或者重启所有服务
killall skynet

通过串口登录Administrator用户,设置好ip

bash
busctl --user call bmc.kepler.bmc_network /bmc/kepler/Managers/1/EthernetInterfaces/Ipv4 bmc.kepler.Managers.EthernetInterfaces.Ipv4 SetIpMaskGateway a{ss}sss 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 <ip> 255.255.252.0 76.76.16.1

ip设置好后,可以通过ssh登录,此时将ssl证书通过xftp等工具传递到bmc的/tmp目录,执行导入ssl证书的操作即可

bash
# 导入带私钥的证书,需要先知道证书密码,如果没有密码就传''字符串,类似下面的命令
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCertWithKey a{ss}sss 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 URI /tmp/IISCert.p12 123456

通过操作sqlite来修改底层数据库信息,也可以达到重置默认用户效果

先telnet登录环境,然后使用sqlite打开数据库,执行相应sql语句即可,比如重置用户,只需要删除相对应的数据表:

bash
# 打开数据库
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db

# 在sqlite命令行执行sql语句,例如查询用户数据
sqlite> SELECT * FROM persist_table where table_name = 't_snmp_user_info';
sqlite> SELECT * FROM persist_table where table_name = 't_manager_account' and prime_key != 'Id:2';

# 如果需要删除用户的信息,需要删除对应的数据表
sqlite> DELETE FROM persist_table where table_name = 't_snmp_user_info';
sqlite> DELETE FROM persist_table where table_name = 't_manager_account';
sqlite> DELETE FROM persist_table where table_name = 't_ipmi_user_info';

# 删除完成后退出
sqlite> .quit

# 退出后重启所有服务即可
killall skynet

也可以通过查询或者修改数据库某些字段,来检查功能场景是否符合预期,具体操作参考数据库语法,不在这里赘述。

针对老版本(没有串口OS切换BMC命令)

安全问题定位

skynet日志中,如何查询特定服务打印的日志

skynet对每个服务,会分配一个唯一id,可以通过该id确认是哪个服务报错

8表示iam服务,上面报错的日志就是iam打印出来的

单元测试没有跑任何一个用例就直接失败,如何定位?

  1. 先确定出错的代码是哪一行

一般出错在初始化阶段,从单元测试的第一行开始加日志,在requeir阶段、setup阶段都可能出错,在每个地方都加一些日志,看执行到哪一步报错

  1. 根据出错的代码来分析异常

集成测试某个接口失败后没有日志提示,如何定位?

  1. 先确定哪个测试用例报错。

如果是初始化阶段报错,排查类似单元测试,如果是测试用例报错,需要排查服务端代码

  1. 某个接口报错的话,需要在对应的服务端加打印,确定报错行数,集成测试中,某个接口报错是不会有具体行数的,因为集成测试只调用了接口(作为客户端)

如果在某行执行代码出查看调用堆栈?

可以使用debug.traceback(),会打印所有的调用堆栈

单元测试的调试

配置开发环境,可以实时调试单元测试,对于具体功能开发,确定输入输出后,可以通过单元测试来逐行排查代码逻辑是否符合预期

web打不开如何定位

目前遇到很多web打不卡的问题,主要是ssl证书获取失败,导致Nginx未加载,下面写一下定位方法:

  1. 首先telnet到环境中,查看资源树中,ssl证书资源是否正常加载:

    # 初始化dbus环境
    source /etc/profile
    
    # 查看ssl资源
    busctl --user introspect bmc.kepler.trust /bmc/kepler/Managers/1/NetworkProtocol/HTTPS/Certificates/1
  2. 如果有ssl资源,可能是nsm模块未读取数据,具体情况可以拉相关模块接口人处理

  3. 如果没有ssl资源,显示如下情况: 表示trust中,ssl证书未成功加载,需要确定ssl证书是否导入,确定点如下:

  • /data/trust/cert/ssl/SSL_1.crt是否存在,该文件是ssl证书的保存路径
  • 数据库是否存在ssl证书数据
ls -lh /data/trust/cert/ssl/SSL_1.crt
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "SELECT * FROM persist_table  where table_name = 't_certificate' ;"

正常情况:

异常情况:

如果持久化数据不存在,说明持久化异常,需要相关责任人处理,如果上述两个功能正常,需要trust模块处理

导入证书失败

随rtos升级,openssl升级到了3.0版本,相比1.1版本,安全性方面有较大变化,需要重新生成安全性更高的证书并导入。

查看自己的openssl版本,telnet登录bmc环境,执行:

openssl version

导入证书需要注意的问题如下:

  1. 证书时间必须正确,建议设置为当前时间,由于有些环境开启了时间同步功能,时间会跳变回去,建议直接将修改时间的命令与证书导入命令一起执行:

    date -s "2023-06-01 10:00:00" && busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCertWithKey a{ss}sss 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 URI /tmp/cert.p12 123456
  2. 证书路径必须在/tmp下:

清理iam和trust数据

如果安全子系统出现严重错误,可以清理相关加密数据,telnet后做如下操作即可

# 删iam
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_account_service';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_role';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_session_service';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_authentication';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_ldap';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_ldap_controller';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_kerberos';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_remote_group';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_snmp_user_info';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_login_rule';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_authorization';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_ipmi_user_info';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_manager_account';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_history_password';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_snmp_community';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_certificate_authentication';"
# 删trust
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_certificate';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_certificate_service';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_certificate_revocation_list';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_banner_config';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_ssl_cipher_suits';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_ssl_version';"
/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_csr_conf';"
# 重启所有服务
killall skynet
# 重新设置用户密码,web界面操作即可
# 重新导入ssl证书,cli解密操作
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCertWithKey a{ss}sss 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 URI /tmp/cert.p12 123456

新老版本数据清理的方法(SSL证书无法导入)

老版本查证书数据:

/usr/sbin/sqlite3 /data/opt/bmc/per_poweroff.db "SELECT * FROM persist_table  where table_name = 't_certificate' ;"

新版本查证书数据:

/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "SELECT * FROM persist_table  where table_name = 't_certificate' ;"

新版本:

/usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "DELETE FROM persist_table where table_name = 't_certificate';"
killall security
cp /data/IISCert.p12  /tmp/
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCertWithKey a{ss}sss 3 Interface Busctl UserName Administrator ClientIp 127.0.0.1 URI /tmp/IISCert.p12 123456

降级到老版本:

/usr/sbin/sqlite3 /data/opt/bmc/per_poweroff.db "DELETE FROM persist_table where table_name = 't_certificate';"
killall security
cp /data/server2.p12 /tmp/
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCertWithKey a{ss}iss 3 Interface Busctl UserName Administrator ClientIp 127.0.0.1 1 /tmp/IISCert.p12 123456