Hyprland UWSM注销后黑屏排查思路

发布于 29 天前  68 次阅读


大概是本月(2025年12月)初的时候,在更新完软件包后,发现在Hyprland-UWSM会话中不能正常注销用户了。

点击注销按钮后,屏幕一直黑屏,SDDM界面一直不显示。

Ctrl+Alt+F3进TTY,通过sudo systemctl restart sddm命令重启SDDM服务,倒是可以重新选择桌面会话登录了。

切换不带UWSM的Hyprland会话登录,再注销试试,倒是正常。说明问题要么出在UWSM上,要么出在Hyprland上。

当然也不能排除是我用的HyDE dotfile的问题,总之先试着看看是什么问题吧。

不抱希望地尝试排查,竟然意外地搞定了。

上半个月在打砍口垒冬活,今天打完圣诞节限定任务,就来把这个问题的解决办法记录一下吧。

1、解决方式

不卖关子,先写解决方式。

把状态栏、注销菜单等所有包含注销按钮的组件调用的注销命令全部换成loginctl kill-session $XDG_SESSION_ID,然后等Hyprland修复这个bug吧。

以我用的HyDE桌面环境为例,waybar状态栏右上角的电源按钮用左键点击是调用wlogout;用右键点击是调用waybar的菜单模块。所以这2个都要改一下。

在改配置文件前,建议按照惯例把修改前的配置文件备份一份。

1.1.修改wlogout配置文件

HyDE环境下的wlogout配置文件在~/.config/wlogout目录下。需要修改的是该目录下的layout_1layout_2这2个配置文件。它们都有这样一段配置。

{
"label": "logout",
"action": "hyde-shell logout",
"text": "Logout",
"keybind": "e"
}

hyde-shell logout替换成loginctl kill-session $XDG_SESSION_ID即可。

{
    "label": "logout",
    "action": "loginctl kill-session $XDG_SESSION_ID",
    "text": "Logout",
    "keybind": "e"
}

1.2.修改waybar配置文件

HyDE环境下的waybar配置文件位于~/.local/share/waybar/modules目录。需要修改的是其中的custom-power.jsonccustom-powermenu.jsonc这2个文件。它们都有一段这样的配置。

"menu-actions": {
"lock": "hyde-shell lockscreen.sh",
"logout": "hyprctl dispatch exit 0",
"shutdown-now": "shutdown now",
"shutdown-wait": "systemctl poweroff",
"reboot-now": "systemctl reboot",
"reboot-firmware": "systemctl reboot --firmware-setup",
"suspend": "systemctl suspend",
"hibernate": "systemctl hibernate"
},

hyprctl dispatch exit 0替换成loginctl kill-session $XDG_SESSION_ID即可。

1.3.最好重启下系统

确实是从Windows那边带过来的坏习惯(笑)。不过因为第一次登录的会话实际上没有完全注销掉,重启一下也没坏处,刚好也能应用修改后的配置文件。

2.排查思路

我一开始的排查方向是看看日志,总之先journalctl -b粗略地看一遍吧。

然后看到在进行注销时,Hyprland报错关闭了。当时没有记录,完整报错信息已经忘了。

loginctl命令看看现有会话,发现先前登录的会话根本没注销掉。

因为UWSM是将桌面会话包装成守护进程来运行的,所以Hyprland的异常退出影响到了后面的注销会话。会话没注销,SDDM就不会重新启动登录界面,这就导致了黑屏的现象。

尝试回退Hyprland的版本,发现一旦回退,会动到好多东西,于是放弃,还是找临时解决方法吧。

先看看注销按钮调用的是什么命令,于是在翻了一堆文档后找到上面那些配置。

在终端中敲一下原本调用的命令,效果和点注销按钮一样,屏幕持续黑屏,只能切换到TTY重启SDDM服务,再次登录。

试了试号称最佳实践的loginctl terminate-user ""uwsm stop命令,也没用,都是执行完后黑屏。

后来搜到NIX OS论坛下的这个帖子(https://discourse.nixos.org/t/sddm-gets-black-screen-after-logout-from-hyprland-uwsm/66777),虽然帖子里的问题和我遇到的不完全相同,但是解决方式值得一试。就是上文中替换的loginctl kill-session $XDG_SESSION_ID命令。

3.个人吐槽

Hyprland毕竟不是特别主流的窗口管理器,所以还是容易遇到这样那样的问题的。遇到问题了,就尝试自己解决解决,也能顺带地学学Linux知识(笑)。

如果解决不掉,那就换个更为主流的桌面环境来用(不)。