Ubuntu 26 root shutdown时被拒

💡 原文中文,约4100字,阅读约需10分钟。
📝

内容提要

Ubuntu 26中,root执行shutdown被拒,因普通用户通过D-Bus向systemd-logind注册了shutdown inhibitor。可用systemd-inhibit --list查看,或systemctl poweroff -i强制关机。文章还介绍了用gdbus调用login1接口管理会话、锁屏及关机,并监控D-Bus消息的方法。

🔎

延伸解读

Inhibitor机制:系统关机的“安全锁”

Ubuntu 26中,shutdown命令实际是systemctl的符号链接,关机操作由systemd-logind管理。普通用户可通过D-Bus注册inhibitor,阻止关机,例如防止升级中断。root执行shutdown被拒,正是因为有用户注册了shutdown inhibitor。理解这一机制,有助于排查类似问题,避免误以为系统故障。

强制关机与优雅关机的权衡

当root关机被拒时,提示信息建议使用systemctl poweroff -i强制忽略inhibitor。但强制关机可能中断其他用户的重要任务,如升级或文件保存。更稳妥的做法是先通过systemd-inhibit --list或gdbus查询inhibitor来源,正常结束相关进程后再关机,以减少数据丢失风险。

D-Bus接口:系统管理的另一扇门

文章展示了通过gdbus调用login1接口管理会话、锁屏和关机的方法。例如,root可远程执行LockSessions锁屏,且无需密码即可解锁,这比交互式操作更灵活。但普通用户直接调用PowerOff会因缺少交互式授权而失败,说明D-Bus接口的权限控制与常规命令不同,需谨慎使用。

Q&A

Ubuntu 26中root执行shutdown被拒,提示被某个用户inhibit,这是什么原因?

这是因为普通用户通过D-Bus向systemd-logind注册了shutdown inhibitor,阻止了关机操作。systemctl poweroff会询问systemd-logind,发现有inhibitor存在,就会拒绝关机。

如何查看当前系统中生效的inhibitor?

可以使用命令 systemd-inhibit --list 或 systemd-inhibit --no-pager --no-legend --list 查看。也可以使用更底层的gdbus命令:gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1 --method org.freedesktop.login1.Manager.ListInhibitors

root shutdown被拒时,如何强制关机?

可以使用 systemctl poweroff -i 命令,其中 -i 表示忽略inhibitor,强制关机。但更好的做法是找出注册inhibitor的进程并正常结束它,然后再关机。

如何通过gdbus调用login1接口实现锁屏和解锁?

锁屏:gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1 --method org.freedesktop.login1.Manager.LockSessions。解锁:gdbus call --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1 --method org.freedesktop.login1.Manager.UnlockSessions。注意,gdbus解锁不需要密码,但无法取消登录界面。

🏷️

标签

➡️

继续阅读