某些时候,bmc 功能不正常,已经难以操作,例如某些组件持续工作不正常,持续拒绝 graceful reset ,造成 BMC 无法复位;
busctl 强制重启 BMC
此时可以使用下面命令强制复位 BMC,绕开 GracefulReset 功能:
busctl --user call bmc.kepler.maca /bmc/kepler/MacaService bmc.kepler.SystemControl ForceReset a{ss}y 0 0
busctl 回滚 BMC
此外,我们也可以通过 busctl 来做强制回滚,在调试烧片包时格外有用(比如只有 telnet 正常工作,web 和 ssh 都进不去的场景):
busctl --user call bmc.kepler.firmware_mgmt /bmc/kepler/UpdateService bmc.kepler.UpdateService Rollback a{ss}is 0 1 “ActiveBMC”
利用 M3 核机制,进行强制回滚
还有一些意外的复杂场景,比如升级组件被搞挂了,造成根本无法下发回滚动作,此时往往只能近端接串口进 uboot 做切分区动作,但其实,还有一种触发强制回滚邪修:
telnet 一通,就发送 busctl --user call bmc.kepler.maca /bmc/kepler/MacaService bmc.kepler.SystemControl ForceReset a{ss}y 0 0 进行强制重启
连续强制重启五次,会触发 M3 核的切分区动作,动作不能太慢,telnet 一通马上执行;
原理:每次 BMC 启动后,M3 核都会等待来自 BMC 的“组件全部启动完成信号”,未收到该信号 5 次,就会触发回滚;
telnet 刚连通时还处于启动早期,“组件全部启动完成”信号未被下发到 M3 核,所以只要整 5 次就会触发强制回滚;
(当然,前提是打包了 busybox ,使得 telnet 开箱即用)