ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kylin V10 响应BMC软关机事件时为什么时灵时不灵?一次从 ACPI 到 systemd-logind 的实战排查

Kylin V10 响应BMC软关机事件时为什么时灵时不灵?一次从 ACPI 到 systemd-logind 的实战排查 最近在做服务器 BMC 电源控制测试时遇到了一个比较奇怪的问题同样是通过 BMC 发起 RedfishGracefulShutdown在不同的 Host OS 运行状态下结果完全不同。最开始很容易怀疑 BMC、ACPI、Linux 内核或者systemd-logind本身有问题。但经过一轮排查后发现问题并不是 BMC 没有发送请求也不是 Host OS 完全不支持软关机而是Kylin V10 默认运行在图形环境时Power Key 会进入图形桌面的电源管理处理路径当图形界面没有可用交互时这条路径无法完成预期的关机操作。切换到纯文本多用户模式后Power Key 可以由systemd-logind直接处理。这篇文章记录一下完整的排查过程。一、先看最直观的测试结果实际测试得到以下结果Host 当前状态BMCGracefulShutdownGUI 正常登录、可以交互✅GUI 已锁屏❌GUI 注销仅 SOL 登录❌GUI 运行环境存在但 GUI 未进入可交互状态仅 SOL/无人登录❌init 3/multi-user.target SOL 登录✅init 3/multi-user.target 无用户登录✅最开始容易产生的错误结论是“Kylin V10 必须登录GUI用户才能响应 BMC 软关机。”但这个结论很快就被init 3的测试推翻了。因为进入multi-user.target后即使没有任何用户登录BMC 的GracefulShutdown也可以正常让 Host 关机。所以真正需要排查的问题变成了为什么graphical.target下的行为和multi-user.target下不一样二、首先确认 BMC 的 GracefulShutdown 有没有真正到达 HostBMC 侧发送的是 RedfishResetType GracefulShutdown在 Host 上执行journalctl -f -u systemd-logind然后从 BMC 发起一次GracefulShutdown。日志中可以看到systemd-logind[899]: Power key pressed.本次测试中实际出现过2月 05 17:42:42 localhost.localdomain systemd-logind[899]: Power key pressed. 2月 05 17:44:20 localhost.localdomain systemd-logind[899]: Power key pressed.这一步非常关键。因为它至少证明BMC ↓ Power Key / ACPI ↓ Linux Kernel / Input ↓ systemd-logind事件已经成功到达systemd-logind。因此问题并不是BMC 没有发送软关机请求。也不是Linux 没有收到 Power Button 事件。接下来要继续看systemd-logind收到事件之后为什么没有完成关机。三、确认 ACPI Power Button 正常继续检查dmesg | grep -i acpi可以看到ACPI: button: Power Button [PWRB]说明 Linux 内核已经识别到了 ACPI Power Button。结合上一节systemd-logind: Power key pressed.可以基本确认ACPI ↓ Linux Kernel ↓ Input ↓ systemd-logind这条路径本身没有明显异常。换句话说问题已经可以从 ACPI/Kernel 层进一步缩小。四、检查 systemd-logind 的 Power Key 配置执行busctl get-property \ org.freedesktop.login1 \ /org/freedesktop/login1 \ org.freedesktop.login1.Manager \ HandlePowerKey本次测试返回s poweroff说明当前运行中的systemd-logind实际配置为HandlePowerKeypoweroff再查看cat /etc/systemd/logind.conf可以看到#HandlePowerKeypoweroff PowerKeyIgnoreInhibitedno需要注意#HandlePowerKeypoweroff前面的#并不是禁用而是使用默认值。而通过busctl查询运行时配置可以进一步确认当前实际生效的是HandlePowerKeypoweroff因此目前看HandlePowerKey本身没有明显配置错误。五、真正的线索出现了MATE Power Manager在图形环境下执行systemd-inhibit --list可以看到WHO UID USER PID COMM WHAT ModemManager 0 root 687 ModemManager sleep NetworkManager 0 root 971 NetworkManager sleep UPower 0 root 1997 upowerd sleep root 0 root 1960 mate-power-mana handle-power-key:handle-suspend-ke...其中最关键的是mate-power-manager handle-power-key这说明mate-power-manager正在参与 Power Key 的处理。这和 GUI 正常工作时看到的现象也能够对应起来。从 BMC 发起GracefulShutdown后GUI 会弹出对话框一分钟后自动关机可以提前关机、提前重启或者取消本次请求。如下这明显不是单纯的Power Key ↓ systemd-logind ↓ poweroff而是图形桌面的电源管理程序参与了后续处理。六、为什么系统明明“没有登录 GUI”后台却已经有完整图形环境查看systemctl get-default结果graphical.target说明系统默认启动目标就是图形环境。进一步查看ps -ef | grep -E lightdm|Xorg|mate-session|mate-power-manager本次测试中可以看到root 1233 1 0 16:58 ? 00:00:00 /usr/sbin/lightdm root 1315 1233 0 16:58 tty1 00:00:06 /usr/libexec/Xorg -core -noreset :0 -seat seat0 ... root 1659 1233 0 16:58 ? 00:00:00 lightdm --session-child ... root 1683 1659 0 16:58 ? 00:00:00 mate-session root 1960 1683 0 16:58 ? 00:00:00 mate-power-manager也就是说系统的后台已经是LightDM ↓ Xorg ↓ MATE Session ↓ mate-power-manager因此可以明确的是“没有人在 GUI 界面操作”并不等于“系统没有图形环境”。只要默认启动目标是graphical.target图形栈和桌面电源管理程序就可能已经运行。七、通过loginctl进一步确认图形 Session执行loginctl list-sessions例如可以看到SESSION UID USER SEAT TTY 1 0 root seat0 3 0 root ttyAMA0其中Session 1 ↓ GUI / MATE ↓ seat0 ↓ Display :0 Session 3 ↓ BMC SOL ↓ ttyAMA0再查看 GUI Sessionloginctl show-session 1本次测试中关键字段为Id1 User0 Nameroot Seatseat0 Display:0 Servicelightdm-autologin Desktopmate Typex11 Classuser Activeyes Stateactive这些字段说明Servicelightdm-autologin Desktopmate Typex11 Seatseat0 Display:0 Activeyes Stateactive系统实际上已经建立了 MATE 图形 Session。所以不能简单通过“有没有人在 GUI 上输入用户名密码”来判断系统是不是已经进入图形环境。八、MATE Power Manager 是怎么启动的执行systemctl status mate-power-manager --no-pager可以发现Unit mate-power-manager.service could not be found.这并不奇怪因为它不是 systemd 的 system service。继续搜索grep -R mate-power-manager \ /etc/xdg/autostart \ /usr/share/autostart \ /etc/X11 \ /etc/xdg 2/dev/null可以找到/etc/xdg/autostart/mate-power-manager.desktop其中Execmate-power-manager说明mate-power-manager是由桌面环境自动启动的。也就是说它的生命周期与 MATE 图形 Session 密切相关。九、真正关键的实验执行init 3到这里最直接的方法就是把图形环境完全停掉再测试一次。执行init 3或者使用 systemdsystemctl isolate multi-user.target然后检查ps -ef | grep -E lightdm|Xorg|mate-session|mate-power-manager这时可以看到lightdm 不存在 Xorg 不存在 mate-session 不存在 mate-power-manager 不存在再检查loginctl list-sessions如果通过 SOL 登录会看到SESSION UID USER SEAT TTY 3 0 root ttyAMA0此时系统已经真正退出图形环境。十、最关键的结果退出图形环境后GracefulShutdown 恢复正常保持系统处于multi-user.target状态然后再次从 BMC 发送Redfish GracefulShutdown结果Host 正常关机更重要的是即使没有任何用户登录GracefulShutdown 也可以正常完成。因此可以确认没有用户登录并不是 GracefulShutdown 失败的根本原因。真正产生影响的是graphical.target ↓ LightDM / Xorg / MATE ↓ mate-power-manager ↓ Power Key 的图形电源管理处理路径而切换到multi-user.target后这套图形电源管理路径退出Power Key 可以由systemd-logind直接处理。十一、为什么 SOL 登录在不同情况下结果也不一样这也是整个问题里非常容易混淆的地方。情况一系统处于graphical.target即使你通过 SOL 登录graphical.target ↓ LightDM Xorg MATE mate-power-manager仍然存在。此时 SOL 只是ttyAMA0 ↓ 创建一个终端 Session它并不会让后台的图形电源管理程序消失。因此graphical.target SOL和multi-user.target SOL并不是相同环境。情况二执行init 3此时graphical.target ↓ 停止图形环境 ↓ multi-user.targetMATE 和mate-power-manager退出。此时即使通过SOL登录也不会再引入图形电源管理路径。因此multi-user.target SOL ↓ GracefulShutdown ↓ ✅而且multi-user.target 无用户登录 ↓ GracefulShutdown ↓ ✅两种情况都可以工作。十二、这里还有一个重要概念isolate不等于修改默认启动模式例如执行systemctl isolate multi-user.target之后再执行systemctl get-default仍然可能看到graphical.target这是正常的。因为systemctl isolate multi-user.target只是将当前系统立即切换到multi-user.target。它不会修改下一次开机的默认 target。如果希望服务器每次启动都默认进入纯文本多用户模式可以执行systemctl set-default multi-user.target然后systemctl get-default确认multi-user.target十三、为什么服务器测试环境更适合multi-user.target如果我们的测试目标是验证 BMC 在无人值守情况下能否正常执行 Host GracefulShutdown。那么最稳定的测试环境应该尽量避免 GUI 桌面环境参与。推荐Host Power On ↓ Host OS 正常启动 ↓ multi-user.target ↓ 不启动 GUI ↓ 不依赖用户登录 ↓ BMC GracefulShutdown ↓ systemd-logind ↓ Host Off而不是Host Power On ↓ graphical.target ↓ LightDM ↓ Xorg ↓ MATE ↓ mate-power-manager后者会把桌面电源管理组件也引入测试环境。十四、最终结论这个问题最开始看起来像是“Kylin V10 在没有登录用户时不能响应 BMC 软关机。”但经过实际测试真实情况并不是这样。我们已经确认ACPI Power Button → 正常 systemd-logind 收到 Power Key → 正常 HandlePowerKey → poweroff而系统默认graphical.target会启动LightDM Xorg MATE mate-power-manager其中mate-power-manager会参与handle-power-key的处理。因此在图形环境中Power Key 进入了桌面电源管理路径当存在有效 GUI 交互时可以弹出电源操作提示并继续执行关机而图形环境存在但没有可用 GUI 交互时这条路径无法完成预期处理。当切换到multi-user.target之后图形桌面退出mate-power-manager消失Power Key 回到systemd-logind的系统级处理路径GracefulShutdown 恢复正常。因此对于服务器类、无人值守的 BMC 电源控制测试更推荐systemctl set-default multi-user.target让 Host OS 默认进入multi-user.target。这次排查最终说明的并不是“Linux 必须登录用户才能软关机”而是“graphical.target 下的桌面电源管理会改变 Power Key 的处理路径”。对于服务器测试环境而言如果测试目标是验证 BMC 的 GracefulShutdown 能否在无人值守状态下正常工作那么使用multi-user.target会得到更加稳定、明确的测试结果。总结服务器看起来停在登录界面但后台实际上已经运行完整图形栈。init3注销图形界面即可响应持久化的解决方案systemctl set-default multi-user.target即进host os界面时不要默认选择图形界面。这样在未登录时能响应软关机。init5 后进入图形界面由GUI图形栈接管软关机。所以需要注意的是服务器OS要么在图形界面时保持登录状态要么锁屏时退到非GUI界面。
返回列表