大概是本月(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_1和layout_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.jsonc和custom-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知识(笑)。
如果解决不掉,那就换个更为主流的桌面环境来用(不)。


0 Comments