环境: Ubuntu 26.04,GNOME 50、默认 Wayland、NVIDIA Blackwell(595 open 驱动)、4K 显示器、分数缩放 166.7%。gdm3 版本
50.0-0ubuntu1。
桌面会话里把缩放调到 166.7% 之后,登录界面(GDM greeter)还是糊的。按网上常见做法把自己的 ~/.config/monitors.xml 复制到 /var/lib/gdm3/.config/monitors.xml、属主改成 gdm:gdm、重启 gdm——没用,登录界面依然是没有缩放的小字。这条老经验在 Ubuntu 26.04 不灵了,因为 gdm 50.0 同时改了两件事:greeter 进程的运行用户、和它读配置的目录。
现象
sudo install -o gdm -g gdm -m 644 ~/.config/monitors.xml /var/lib/gdm3/.config/monitors.xml
sudo systemctl restart gdm
重启后登录界面依旧糊,字号也对不上 167% 缩放。同样的 monitors.xml 在自己用户的桌面里是生效的,所以问题不在文件内容本身——而在 GDM 是否真的读到它。
取证一:greeter 跑在哪个用户下?
翻 GDM 日志,留意 PAM 那一行:
$ sudo journalctl -u gdm -b
... gdm-launch-environment][2924]: pam_unix(gdm-launch-environment:session):
session opened for user gdm-greeter(uid=60578) by (uid=0)
uid 60578 的用户叫 gdm-greeter,不是传统的 gdm(uid 975)。但奇怪的是:
$ getent passwd gdm-greeter
(空)
$ getent passwd 60578
(空)
NSS 里查不到这个用户,也不是 systemd 的 DynamicUser:
$ busctl call org.freedesktop.systemd1 /org/freedesktop/systemd1 \
org.freedesktop.systemd1.Manager LookupDynamicUserByName s gdm-greeter
Call failed: Dynamic user gdm-greeter does not exist.
也就是说,greeter 进程通过 PAM 在一个静态 uid 60578 下跑,但这个用户不在 passwd 数据库里——它由 gdm 自己管理(/var/lib/gdm3/.migrated-dyn-users 就是这次迁移留下的标记文件)。老路径 /var/lib/gdm3/.config/ 是给 uid 975 的 gdm 用户用的,greeter 根本不是这个用户。
取证二:新配置目录在哪?
直接看 gdm 二进制里的字符串路径:
$ sudo strings /usr/sbin/gdm3 | grep -E '/var/lib/gdm3|gdm-greeter'
/var/lib/gdm3
/var/lib/gdm3/seat0
/var/lib/gdm3/seat0/state
/var/lib/gdm3/.local/state
/var/lib/gdm3/seat0/config
/var/lib/gdm3/.config
/var/lib/gdm3/%s/config
/var/lib/gdm3/%s/state
gdm-greeter
/var/lib/gdm3/.migrated-dyn-users
/var/lib/gdm3/seat0/config/ 和 /var/lib/gdm3/%s/config(%s 就是 seat 名)是新的按 seat 隔离的配置目录,binary 里同时还保留 /var/lib/gdm3/.config 是为了兼容旧路径(但显然不是 greeter 启动时实际读的那个)。
进一步看 seat0/config/ 的实际所有者:
$ sudo ls -la /var/lib/gdm3/seat0/config/
drwx------ 4 60578 nogroup ...
-rw------- 1 60578 nogroup ... user-dirs.dirs
drwx------ 3 60578 nogroup ... ibus
drwx------ 2 60578 nogroup ... pulse
属主就是 uid 60578,目录 700。里面已经有 ibus、pulse、user-dirs.dirs 等 XDG 风格的运行时配置——这才是 greeter 真正的 XDG_CONFIG_HOME。
根因
合在一起就是一句话:
Ubuntu 26.04 的 gdm 50.0 把 greeter 改成在 uid 60578 (
gdm-greeter) 下跑,并把它的配置目录从/var/lib/gdm3/.config/搬到了按 seat 隔离的/var/lib/gdm3/seat0/config/。
老路径下放的 monitors.xml 既不在新路径上、属主又是错的用户,所以 greeter 完全读不到。
解决
先在自己的「设置 → 显示」里把分辨率、缩放、刷新率调成你想要的样子,系统会把这套配置写进 ~/.config/monitors.xml。然后复制到新路径,属主用 uid 60578(用数字写,因为 gdm-greeter 名字在 NSS 里查不到):
sudo install -o 60578 -g nogroup -m 600 \
~/.config/monitors.xml \
/var/lib/gdm3/seat0/config/monitors.xml
如果之前按老经验放过 /var/lib/gdm3/.config/monitors.xml,顺手清掉避免误导:
sudo rm -f /var/lib/gdm3/.config/monitors.xml
重启 gdm(注意:会立即结束当前图形会话,先存好工作):
sudo systemctl restart gdm
验证
重启后看登录界面是否按设定的分辨率和缩放渲染。也可以核对一下文件状态:
$ sudo ls -la /var/lib/gdm3/seat0/config/monitors.xml
-rw------- 1 60578 nogroup 599 May 26 12:31 /var/lib/gdm3/seat0/config/monitors.xml
属主 60578、模式 600,和同目录其它文件对齐就对了。
顺手注意
NVIDIA + Wayland: 确认
nvidia_drm的 KMS 已经打开,这是 GDM 走 Wayland、能读懂分数缩放的前提:$ sudo cat /sys/module/nvidia_drm/parameters/modeset Ymutter 实验特性: Ubuntu 26.04 的 GDM 默认已经把
scale-monitor-framebuffer打开(可以用sudo -u gdm dbus-run-session gsettings get org.gnome.mutter experimental-features验证),不需要再手动设置。显示器序列号:
monitors.xml里用了 EDID 的 vendor/product/serial 来匹配显示器。换了线、换了显示器、或者通过 KVM 切换让 EDID 变了,GDM 就会匹配不上回退到默认。这时重做一次「设置 → 显示」并重新复制即可。
后续工作流
以后每次在桌面里改了显示设置,把新的 ~/.config/monitors.xml 同步过去就行:
sudo install -o 60578 -g nogroup -m 600 \
~/.config/monitors.xml \
/var/lib/gdm3/seat0/config/monitors.xml
sudo systemctl restart gdm
小结
按"复制 monitors.xml 给 gdm 用户"这条老经验,在 Ubuntu 26.04 上会默默失败——路径和用户都改了,但 GDM 不会报错也不会回退,只是用默认未缩放的画面把登录界面渲染出来。排查的关键是从 PAM 日志里看 greeter 实际跑在哪个 uid,再从 binary strings 里翻出新的配置目录;改完用 ls -la 确认属主就行。