定位问题基本思路:
- 确定版本
- 结合日志确定代码异常点
- 在异常点附近增加日志,复现问题
通用问题定位
如何确定版本
首先确定openUBMC大版本与构建时间,是否为目标版本,命令行下执行:
ipmcget -d version此处展示了openUBMC主版本:5.1.0.1,B版本B002,以及构建时间、备区版本号等
然后确定组件版本号:
cat /etc/package_info通过组件版本号可以方便的定位到组件代码记录,恢复代码现场。
有哪些日志需要关注
首先跟进日志找到报错问题点,环境日志存放目录: /var/log
app.log 调试日志,系统运行过程中会记录的日志,一般运行中报错看这里
operation.log 操作日志,客户可以看到的日志,一般记录用户的操作,整体上需要和v2一致
security.log 安全日志,客户可以看到的日志,一般记录登录、锁定等安全信息
framework.log 文件,存放每个组件被拉起时的日志(skynet框架日志),如果某个组件启动失败,会在这里报错
如果在组件中加print打印,也可以使用journalctl来查看服务的日志:
journalctl -f -u security其中:
-f参数表示持续跟踪打印的日志
-u后跟模块名可以只查看某个systemd拉起服务的日志
资源树查询基本操作
针对找不到资源树路径、接口、属性等问题,可以先手动查看dbus资源树,再确定是否由依赖组件资源不存在导致。
基础linux命令
- 初始化dbus环境:
bmc环境可以直接执行source /etc/profile;如果自定义的dbus环境,需要指定DBUS_SESSION_BUS_ADDRESS与DBUS_SESSION_BUS_PID即可
- 查看当前服务的启动情况:
可以使用ps aux加grep操作,例如过滤所有包含config字段的进程:ps aux|grep config.cfg
- 重启某个服务
可以使用systemd的restart命令:systemctl restart security
或者直接kill掉某个进程,目前bmc组件会自动重拉:kill {进程PID号}
如果要重启所有服务,可以使用以下命令:
ps aux|grep config.cfg|grep -v "grep config.cfg"|awk '{print($2)}'|xargs kill
# 或者
killall skynet- 替换某个文件内容
使用vi操作,vi的用法不在这里赘述
如何在异常情况下通过删除数据库恢复环境
目前数据库存储了ip、用户名密码、ssl证书等信息,如果删除数据库后,需要重新初始化这些信息,才能重新正常使用BMC
其中用户名密码会恢复为默认,ssl证书可以重新导入,但是ip信息需要预先记录下来。先登录bmc环境,执行如下命令
重要:删除数据库会导致ip丢失,无串口环境谨慎操作
# 推荐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、子网掩码、网关记录下来
# 将数据库备份,并重启服务
mv /data/trust/persistence/per_poweroff.db /data/trust/persistence/per_poweroff.db.bak
# 可以重启持久化服务,或者重启所有服务
killall skynet通过串口登录Administrator用户,设置好ip
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.1ip设置好后,可以通过ssh登录,此时将ssl证书通过xftp等工具传递到bmc的/tmp目录,执行导入ssl证书的操作即可
# 导入带私钥的证书,需要先知道证书密码,如果没有密码就传''字符串,类似下面的命令
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语句即可,比如重置用户,只需要删除相对应的数据表:
# 打开数据库
/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打印出来的
单元测试没有跑任何一个用例就直接失败,如何定位?
- 先确定出错的代码是哪一行
一般出错在初始化阶段,从单元测试的第一行开始加日志,在requeir阶段、setup阶段都可能出错,在每个地方都加一些日志,看执行到哪一步报错
- 根据出错的代码来分析异常
集成测试某个接口失败后没有日志提示,如何定位?
- 先确定哪个测试用例报错。
如果是初始化阶段报错,排查类似单元测试,如果是测试用例报错,需要排查服务端代码
- 某个接口报错的话,需要在对应的服务端加打印,确定报错行数,集成测试中,某个接口报错是不会有具体行数的,因为集成测试只调用了接口(作为客户端)
如果在某行执行代码出查看调用堆栈?
可以使用debug.traceback(),会打印所有的调用堆栈
单元测试的调试
配置开发环境,可以实时调试单元测试,对于具体功能开发,确定输入输出后,可以通过单元测试来逐行排查代码逻辑是否符合预期
web打不开如何定位
目前遇到很多web打不卡的问题,主要是ssl证书获取失败,导致Nginx未加载,下面写一下定位方法:
首先telnet到环境中,查看资源树中,ssl证书资源是否正常加载:
# 初始化dbus环境 source /etc/profile # 查看ssl资源 busctl --user introspect bmc.kepler.trust /bmc/kepler/Managers/1/NetworkProtocol/HTTPS/Certificates/1如果有ssl资源,可能是nsm模块未读取数据,具体情况可以拉相关模块接口人处理
如果没有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导入证书需要注意的问题如下:
证书时间必须正确,建议设置为当前时间,由于有些环境开启了时间同步功能,时间会跳变回去,建议直接将修改时间的命令与证书导入命令一起执行:
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证书路径必须在/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