跳转至内容

GDM

来自 ArchWiki
(重定向自 GNOME Display Manager)

来自 GDM - GNOME 显示管理器:“GNOME 显示管理器 (GDM) 是一个管理图形显示服务器并处理图形用户登录的程序。”

显示管理器X Window 系统Wayland 用户提供图形化登录提示。

安装

GDM 可以通过 gdm 软件包进行 安装,并且作为 gnome 组的一部分安装。

按照 显示管理器#加载显示管理器 章节在启动时运行 GDM。

配置

提示: 下面列出的大多数配置选项都可以使用 gdm-settingsAUR 图形应用程序轻松设置。

登录屏幕背景图片

本文或本章节的准确性存在争议。

原因: 该配置不是持久性的,更新 GNOME Shell 后更改会被撤销。20250224:针对 Gnome 47 进行更新。(在 Talk:GDM 中讨论)
  • 从 GNOME 3.16 开始,GNOME Shell 主题现在以二进制文件 (gresource) 形式存储。
  • 此更改将在后续更新 gnome-shell 时被覆盖。

首先,你需要将现有的 GNOME Shell 主题解压到你主目录下的一个目录中。你可以使用以下脚本完成此操作

extractgst.sh
#!/bin/sh
gst=/usr/share/gnome-shell/gnome-shell-theme.gresource
workdir=${HOME}/shell-theme

for r in `gresource list $gst`; do
	r=${r#\/org\/gnome\/shell/}
	if [ ! -d $workdir/${r%/*} ]; then
	  mkdir -p $workdir/${r%/*}
	fi
done

for r in `gresource list $gst`; do
        gresource extract $gst $r >$workdir/${r#\/org\/gnome\/shell/}
done

导航到创建的目录。你应该会发现主题文件已被提取到该目录(在 theme 子文件夹下)。现在将你喜欢的背景图片复制到此目录。

接下来,你需要在 theme 目录下创建一个具有以下内容的文件(下表针对 Gnome 47,以防万一请验证 theme 子文件夹的内容是否与此列表匹配,包括背景图片)

gnome-shell-theme.gresource.xml
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/org/gnome/shell/theme">
    <file>calendar-today.svg</file>
    <file>calendar-today-light.svg</file>
    <file>gnome-shell-dark.css</file>
    <file>gnome-shell-light.css</file>
    <file>gnome-shell-high-contrast.css</file>
    <file>gnome-shell-start.svg</file>
    <file>pad-osd.css</file>
    <file>process-working-dark.svg</file>
    <file>process-working-light.svg</file>
    <file>workspace-placeholder.svg</file>
    <file>filename</file>
  </gresource>
</gresources>

filename 替换为背景图片的文件名,或者删除该行以改用十六进制颜色值。

现在,打开 gnome-shell-light.cssgnome-shell-dark.css 文件,并按如下方式更改 #lockDialogGroup 定义

#lockDialogGroup {
  background: url("filename");
  background-size: widthpx heightpx;
  background-repeat: no-repeat;
}

background-size 设置为 GDM 使用的分辨率;这不一定是图像的分辨率。有关显示分辨率的列表,请参阅 显示分辨率

再次说明,将 filename 设置为背景图片名称,filename 应在 CSS 中用引号括起来。如果你希望图像缩放以填充,background-size 也可以设置为 auto

如果使用多台显示器,图像最终会跨越显示器显示,因此使用 SVG 文件作为背景可能更好。

如果你只想更改背景颜色,请按如下方式调整 #lockDialogGroup 定义

#lockDialogGroup {
  background-color: #color;
}

其中 color 是新的十六进制编码背景颜色。

接下来,使用以下命令编译主题

$ glib-compile-resources gnome-shell-theme.gresource.xml

然后,将生成的 gnome-shell-theme.gresource 文件复制到 /usr/share/gnome-shell 目录(请保留原始文件的备份)。

# cp /usr/share/gnome-shell/gnome-shell-theme.gresource /usr/share/gnome-shell/gnome-shell-theme-original.gresource
# cp ./gnome-shell-theme.gresource /usr/share/gnome-shell

最后,注销,你应该会发现 gdm 正在使用你喜欢的背景图片(如果更改未立即应用,你可能需要重启 gdm)。

如果后续更新重置了 gnome-shell-theme.gresource 文件,只需重复上述步骤,并验证 XML 的内容是否与提取的文件列表匹配。

有关更多信息,请参阅以下 论坛主题。一个用于自动执行上述步骤的 shell 脚本可在 DimaZirix 的 GitHub 仓库 获取。

dconf 配置

某些 GDM 设置存储在 dconf 数据库中。可以通过向 /etc/dconf/db/gdm.d 目录添加 keyfiles,然后以 root 身份运行 dconf update 重新编译 GDM 数据库来配置它们,也可以通过登录系统上的 GDM 用户并直接使用 gsettings 命令行工具更改设置。请注意,对于前者,需要一个 GDM 配置文件——这必须手动创建,因为它不再随上游提供,见下文

/etc/dconf/profile/gdm
user-db:user
system-db:gdm
file-db:/usr/share/gdm/greeter-dconf-defaults

对于后者,你可以使用以下命令登录到 GDM 用户

# machinectl shell gdm@ /bin/bash

创建以下 keyfile

/etc/dconf/db/gdm.d/02-logo
[org/gnome/login-screen]
logo='/path/to/logo.png'

然后重新编译 GDM 数据库。

或者,以 GDM 用户身份执行以下操作以更改标志

[gdm]$ dbus-launch gsettings set org.gnome.login-screen logo '/path/to/logo.png'

要禁用标志,你可以将该值设置为空字符串

[gdm]$ dbus-launch gsettings set org.gnome.login-screen logo ''

更改光标主题

GDM 不会理会 GNOME 光标主题设置,也会忽略根据 XDG 规范 设置的光标主题。要更改 GDM 中使用的光标主题,请创建以下 keyfile

/etc/dconf/db/gdm.d/10-cursor-settings
[org/gnome/desktop/interface]
cursor-theme='theme-name'

然后重新编译 GDM 数据库。或者,以 GDM 用户身份暂时执行以下操作并更改光标主题

[gdm]$ dbus-launch gsettings set org.gnome.desktop.interface cursor-theme 'theme-name'

更改图标主题

可以使用相同的方法更改图标主题。创建以下 keyfile

/etc/dconf/db/gdm.d/11-icon-settings
[org/gnome/desktop/interface]
icon-theme='theme-name'

然后,重新编译 GDM 数据库。或者,以 GDM 用户身份暂时执行以下操作并更改图标主题

[gdm]$ dbus-launch gsettings set org.gnome.desktop.interface icon-theme 'theme-name'

登录屏幕的大字体

单击屏幕右上角的辅助功能图标(一个中间带有人物剪影的白圈),然后勾选 大文本 选项。

要设置特定的缩放因子,请创建以下 keyfile

/etc/dconf/db/gdm.d/03-scaling
[org/gnome/desktop/interface]
text-scaling-factor=1.25

然后重新编译 GDM 数据库。或者,以 GDM 用户身份暂时执行以下操作并更改字体

[gdm]$ dbus-launch gsettings set org.gnome.desktop.interface text-scaling-factor 1.25

关闭声音

此调整会禁用登录屏幕上调整系统音量(通过键盘)时听到的听觉反馈。

创建以下 keyfile

/etc/dconf/db/gdm.d/04-sound
[org/gnome/desktop/sound]
event-sounds=false

然后重新编译 GDM 数据库。或者以 GDM 用户身份暂时执行以下操作并关闭声音

[gdm]$ dbus-launch gsettings set org.gnome.desktop.sound event-sounds 'false'

配置电源按钮行为

  • 电源按钮的 logind 设置 被 GNOME 设置守护进程覆盖。[1]
  • 从 GDM 3.18 开始,电源按钮无法设置为 交互式[2]
  • 在某些情况下,此设置将被忽略并使用硬编码的默认值。[3]
警告: 请注意,acpid 守护进程也会处理“电源按钮”和“休眠按钮”事件。同时运行这两个系统可能会导致意外行为。

创建以下 keyfile

/etc/dconf/db/gdm.d/05-power
[org/gnome/settings-daemon/plugins/power]
power-button-action='action'

然后重新编译 GDM 数据库。或者,以 GDM 用户身份暂时执行以下操作并配置行为

[gdm]$ dbus-launch gsettings set org.gnome.settings-daemon.plugins.power power-button-action 'action'

其中 action 可以是 nothingsuspendhibernate 之一。

启用轻触点击

轻触点击在 GDM(和 GNOME)中默认是禁用的,但你可以通过 dconf 设置轻松启用它。

注意: 如果你想在 X 下执行此操作,必须先设置正确的 X 服务器访问权限——请参阅 #配置 X 服务器访问权限

要启用轻触点击,请创建以下 keyfile

/etc/dconf/db/gdm.d/06-tap-to-click
[org/gnome/desktop/peripherals/touchpad]
tap-to-click=true

然后重新编译 GDM 数据库。或者,以 GDM 用户身份暂时执行以下操作并启用该操作

[gdm]$ dbus-launch gsettings set org.gnome.desktop.peripherals.touchpad tap-to-click 'true'

禁用/启用辅助功能菜单

本文或本章节已过时。

原因: 从 GDM 43 开始,下面的配置键不起作用。你可以尝试 org.gnome.desktop.a11y.applications screen-keyboard-enabled true 来代替。(在 Talk:GDM 中讨论)

要禁用或启用辅助功能菜单,请创建以下 keyfile

/etc/dconf/db/gdm.d/07-accessibility
[org/gnome/desktop/interface]
toolkit-accessibility='boolean'

然后重新编译 GDM 数据库。或者,以 GDM 用户身份暂时执行以下操作并更改状态

[gdm]$ dbus-launch gsettings set org.gnome.desktop.interface toolkit-accessibility 'boolean'

当键值为 false 时菜单被禁用,为 true 时启用。

在 GDM 上启用夜间模式

要在 GDM 上启用 夜间模式,请运行

[gdm]$ dbus-launch gsettings set org.gnome.settings-daemon.plugins.color night-light-enabled true

键盘布局

GDM 需要在 /etc/vconsole.conf 中设置 XKBLAYOUT 参数;如果没有设置,它将默认为标准的 us (qwerty) 布局,即它不会遵守 KEYMAP 中设置的值。

一种普遍适用的方法是使用 localectl --no-convert set-x11-keymap [keymap]:有关详细信息,请参阅 Xorg 中的键盘配置#设置键盘布局

警告: 在不加 --no-convert 的情况下使用 localectl set-x11-keymap 也会更改 KEYMAP= 的值,如果使用包含重音字符的密码对 整个系统进行加密,这可能会导致系统无法启动。请参阅 systemd 问题 #34967

更改语言

系统语言将应用于 GDM。如果系统有多个用户,可以为 GDM 设置与系统语言不同的语言。在这种情况下,首先确保安装了 gnome-control-center。然后,启动 gnome-control-center 并选择 区域和语言。在标题栏中,勾选 登录屏幕 切换按钮。最后,单击 语言 并从列表中选择你的语言。系统将提示你输入 root 密码。请注意,除非系统上存在多个用户,否则 登录屏幕 按钮在标题栏中不可见 [4]

提示: 通过添加 2 种不同的输入语言,注销然后选择默认语言,一旦删除了第二个选项,GDM 就会记住你的选择。

用户和登录

自动登录

警告: 不要尝试对由 systemd-homed 管理的用户执行此操作。此功能目前 未实现 且会导致 GDM 崩溃。

要在 GDM 中启用自动登录,请将以下内容添加到 /etc/gdm/custom.conf(将 username 替换为你自己的用户名)

/etc/gdm/custom.conf
# Enable automatic login for user
[daemon]
AutomaticLogin=username
AutomaticLoginEnable=True
提示: 如果添加这些行后 GDM 失败,请从 TTY 中注释掉它们。

或者用于延迟自动登录

/etc/gdm/custom.conf
[daemon]
TimedLoginEnable=true
TimedLogin=username
TimedLoginDelay=1

你可以设置自动登录使用的会话(将 gnome-xorg 替换为所需的会话)

/var/lib/AccountsService/users/username
[User]
XSession=gnome-xorg

无密码登录

如果你想在 GDM 中跳过密码提示,只需将以下行添加到 /etc/pam.d/gdm-password 的第一行

auth sufficient pam_succeed_if.so user ingroup nopasswdlogin

然后,将 nopasswdlogin 组添加到你的系统。有关组描述和组管理命令,请参阅 用户组

现在,将你的用户添加到 nopasswdlogin 组,你只需单击你的用户名即可登录。

警告
  • 不要root 账户执行此操作。
  • 你将无法再使用 GDM 在登录时更改会话类型。如果你想更改默认会话类型,你需要先从 nopasswdlogin 组中删除你的用户。

禁用指纹登录

使用 指纹 登录时,它不会解锁密钥环,因此你仍会被要求输入密钥环密码。你可能希望禁止登录并仅保留指纹来解锁会话。为此,只需为 GDM 用户禁用指纹。

以 GDM 用户身份暂时执行以下操作并更改此设置

[gdm]$ dbus-launch gsettings set org.gnome.login-screen enable-fingerprint-authentication false

多会话下的免密码关机

GDM 使用 polkit 和 logind 来获取关机权限。你可以通过设置以下内容,在多个用户登录时关闭系统

/etc/polkit-1/localauthority.conf.d/org.freedesktop.logind.policy
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "http://www.freedesktop.org/software/polkit/policyconfig-1.dtd">

<!--
Policy definitions for logind
 -->

<policyconfig>

  <action id="org.freedesktop.login1.power-off-multiple-sessions">
    <description>Shutdown the system when multiple users are logged in</description>
    <message>System policy prevents shutting down the system when other users are logged in</message>
    <defaults>
      <allow_inactive>yes</allow_inactive>
      <allow_active>yes</allow_active>
    </defaults>
  </action>

</policyconfig>

你可以在 org.freedesktop.login1(5) 中找到所有可用的 logind 选项(例如 reboot-multiple-sessions)。

在 GDM 中启用 root 登录

不建议以 root 身份登录,但如有必要,你可以编辑 /etc/pam.d/gdm-password 并在 auth required pam_deny.so 行之前添加以下行

/etc/pam.d/gdm-password
auth            sufficient      pam_succeed_if.so uid eq 0 quiet

该文件应该看起来像这样

/etc/pam.d/gdm-password
...
auth            sufficient      pam_succeed_if.so uid eq 0 quiet
auth            sufficient      pam_succeed_if.so uid >= 1000 quiet
auth            required        pam_deny.so
...

重启 GDM 后,你应该能够以 root 身份登录。

从登录列表中隐藏用户

gdm 用户列表的用户由 AccountsService 收集。它会自动隐藏系统用户(UID < 1000)。要从登录列表中隐藏普通用户,请在 /var/lib/AccountsService/users/ 中创建一个以要隐藏的用户命名的文件,或者编辑该文件,使其至少包含以下内容

/var/lib/AccountsService/users/username
[User]
SystemAccount=true

通过 RDP 进行远程登录

注意: 目前,只能远程创建无头(headless)会话。
注意: 一次只能存在一个图形会话。尝试创建新会话将提示终止现有的(如果存在)。
通过图形界面

远程登录可以通过导航到 Gnome 设置应用中的 系统 > 远程桌面 > 远程登录 来通过图形界面进行配置。

通过命令行界面
注意: 为了工作,Gnome 远程桌面需要 TLS 证书和凭据。除非之前已设置,否则两者都将缺失,需要手动设置。

要显示当前状态和凭据,可以使用以下命令

# grdctl --system status --show-credentials

设置凭据

# grdctl --system rdp set-credentials rdp_login rdp_password

生成新的 TLS 密钥和证书

# winpr-makecert3 -rdp -path /etc/gnome-remote-desktop -n rdp-tls

如果省略 -n rdp-tls 部分,将使用 主机名 作为名称。

设置 TLS 密钥和证书

# grdctl --system rdp set-tls-key /etc/gnome-remote-desktop/rdp-tls.key
# grdctl --system rdp set-tls-cert /etc/gnome-remote-desktop/rdp-tls.crt

最后,启用远程登录

# grdctl --system rdp enable

设置默认显示器配置

一些 桌面环境 将显示设置存储在 ~/.config/monitors.xml 中,并基于此生成 xrandr 命令。GDM 有一个用途类似的文件,位于 /etc/xdg/monitors.xml(这是全局 mutter 配置,也会影响新的 GNOME 会话)。

注意: /var/lib/gdm/.config/monitors.xml − 旧版。

如果你已在 ~/.config/monitors.xml 中设置好显示器(分辨率、刷新率、方向、缩放、主显示器等),并希望 GDM 遵守这些设置

# cp /home/user/.config/monitors.xml /etc/xdg/monitors.xml

要在每次启动时自动重新配置显示器设置,请为 gdm.service 使用 放置文件(drop-in file)

/etc/systemd/system/gdm.service.d/override.conf
[Service]
ExecStartPre=/bin/cp /home/user/.config/monitors.xml /etc/xdg/monitors.xml

monitors.xml 中用于屏幕旋转和缩放的相关部分是

<monitors version="2">
  <configuration>
    <logicalmonitor>
      ...
      <scale>2</scale>
      ...
      <transform>
        <rotation>right</rotation>
        <flipped>no</flipped>
      </transform>
      ...
    </logicalmonitor>
  </configuration>
</monitors>

更改将在注销时生效。这是必要的,因为 GDM 不遵守 xorg.conf

如果你修改了 Mutter 的实验性功能设置(通常用于分数缩放或可变刷新率),请确保 dconf 设置是全局完成的,而不是仅针对你的用户,请参阅 分数缩放。这是因为这些设置可能导致 monitors.xml 不兼容,请参阅 GDM 错误 1028

配置 X 服务器访问权限

你可以使用 xhost 命令配置 X 服务器访问权限。

例如,要授予 GDM 访问 X 服务器的权限,请使用以下命令

# xhost +SI:localuser:gdm

故障排除

升级到 GNOME 50 后 GDM 问候界面不显示用户列表

本文或本章节的准确性存在争议。

原因: 这可能是由于不兼容的 libgdm 引起的,例如来自 AUR 的版本。(在 Talk:GDM 中讨论)
注意: 首先查看 此论坛主题,并确保这并非由来自 AUR 的陈旧 lightdm 变体引起

升级到 GDM 50 后,问候界面可能完全无法显示用户选择列表,仅作为 gdm-greeter 用户启动,没有选择或切换到任何常规用户账户的选项。当 /etc/dconf/profile/gdm 为空或缺少必需条目时,可能会发生这种情况。

该文件不属于任何软件包(pacman -Qo /etc/dconf/profile/gdm 返回 "No package owns ..."),因此在更新期间它不会被自动创建或修复。

验证文件是否包含以下内容

user-db:user
system-db:gdm
file-db:/usr/share/gdm/greeter-dconf-defaults

如果文件为空或缺少这些条目,请填充它并运行

# dconf update

然后重启 GDM。没有此配置文件,gnome-shell 将无法在问候模式下启动,也无法显示用户列表。

Wayland 和专有 NVIDIA 驱动程序

要在 GDM 中使用 NVIDIA 驱动程序运行 Wayland,你必须满足以下三个条件

如果出现黑屏而不是 GDM,请尝试在计算机的 BIOS 设置中禁用集成显卡。

在某些情况下,GNOME 启动失败并将控制权转回 GDM,这反过来导致登录屏幕重新出现。你可以尝试按 BBS#2126478 中的建议设置以下环境变量

/etc/environment
MUTTER_DEBUG_KMS_THREAD_TYPE=user

注销时失败

如果 GDM 在启动时能正常运行,但在注销时反复尝试后失败,请尝试将此行添加到 /etc/gdm/custom.conf 的 daemon 部分

GdmXserverTimeout=60

无根 Xorg

请参阅 Xorg#Rootless Xorg

使用 Xorg 后端

默认使用 Wayland 后端,仅在无法启动 Wayland 后端时才使用 Xorg 后端。例如,你可能希望改用 Xorg 后端,如果

要默认使用 Xorg 后端,请取消注释 /etc/gdm/custom.conf 中的以下行

#WaylandEnable=false

gdm 删除不完整

删除 gdm 后,systemd 可能会报告以下内容

user 'gdm': directory '/var/lib/gdm' does not exist

要消除此警告,请以 root 身份登录并 删除主用户 gdm,然后 删除组 gdm

使用具有 root 权限的 pwckgrpck 验证 gdm 是否已成功删除。最后,你可能需要仔细检查是否没有残留任何 gdm未归属文件

GDM 自动挂起(GNOME 3.28)

GDM 使用单独的 dconf 数据库来控制电源管理。要应用你的用户电源设置,请将它们复制到 GDM 的 dconf 数据库

$ IFS=$'\n'; for x in $(sudo -u username gsettings list-recursively org.gnome.settings-daemon.plugins.power); do eval "sudo -u gdm dbus-launch gsettings set $x"; done; unset IFS

其中 username 是你的用户名。

要仅在交流电源上禁用自动挂起,请运行

[gdm]$ dbus-launch gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing'

(要同时在电池供电时禁用自动挂起,请将命令中的 ac 替换为 battery 运行。)

重启 GDM 以激活更改。

对于更新版本的 GNOME(在 49.1 上测试)

# Create following files and any directories if they do not exist.
$ cat /etc/dconf/profile/gdm 
user-db:user
system-db:gdm
file-db:/usr/share/gdm/greeter-dconf-defaults

$ cat /etc/dconf/db/gdm.d/00-disable-suspend 
[org/gnome/settings-daemon/plugins/power]
sleep-inactive-ac-type='nothing'
sleep-inactive-ac-timeout=0

$ sudo dconf update
$ sudo reboot

补充论坛链接

  1. https://bbs.archlinux.org/viewtopic.php?id=309828
  2. https://unix.stackexchange.com/a/746767

GDM 忽略 Wayland 并默认使用 X.Org

Wayland 需要内核模式设置 (KMS) 才能工作,在某些机器上 GDM 进程比 KMS 更早启动,导致 GDM 无法识别 Wayland 而只能使用 X.Org。这可能会导致日志中出现类似以下的消息

gnome-shell[569]: Failed to open gpu '/dev/dri/card0': GDBus.Error:org.freedesktop.DBus.Error.AccessDenied: Operation not permitted
gnome-shell[569]: Failed to create backend: No GPUs found
systemd[505]: org.gnome.Shell@wayland.service: Failed with result 'protocol'.
systemd[505]: Failed to start GNOME Shell on Wayland.

或者,同样的问题可能导致 GDM 不显示或显示器仅显示 TTY 输出。

你可以通过 更早启动 KMS 来解决此问题。你可能还希望确认 Wayland 已在 GDM 配置中启用(见上文)。

当存在 NVIDIA (e)GPU 时 AMD 或 Intel GPU 黑屏

起初,如果没有 NVIDIA 设备,GDM 会在 Wayland 上启动并正常工作,但一旦插入 NVIDIA eGPU(或因其他原因加载了 nvidia 模块),它就会停止工作。该问题的典型症状是注销和 GDM 重启时出现带有闪烁光标的黑屏,并且在 GDM 的日志中出现以下消息(以 root 身份运行 journalctl -u gdm -b 查看)

Gdm: Child process -<some PID> was already dead.

解决方案与 #GDM 忽略 Wayland 并默认使用 X.Org 相同:防止在加载 nvidia 模块时运行 /usr/lib/gdm-disable-wayland

注意,一旦 /usr/lib/gdm-disable-wayland 运行,GDM 上的 Wayland 将不再有效。这是因为 WaylandEnable=false 已被写入 /run/gdm/custom.conf,它覆盖了 /etc/gdm/custom.conf。要无需重启即可修复此情况,请删除 /run/gdm/custom.conf 然后重启 GDM。

无法启用 GDM

请参阅 systemd/FAQ#因预先存在的符号链接导致启用单元失败

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.