跳转至内容

greetd

来自 ArchWiki

greetd 是一个最小化、独立且灵活的 登录管理器守护进程,它不对用户想要启动的程序(无论是基于控制台还是图形界面)做任何假设。任何可以从控制台启动的脚本或程序都可以由 greetd 启动,这使得它特别适合 Wayland 合成器。它还可以像其他显示管理器一样启动一个 登录器来开始用户会话。

安装

安装 greetdgreetd-gitAUR 包。

默认的 greetd 配置文件位于 /etc/greetd/config.toml。PAM 相关配置设置在 /etc/pam.d/greetd

登录器

Greetd 内置了 greetd-agreety 作为其登录器,但这是一个最小化的实现。您应该考虑使用几个可用的登录器之一。

  • greetd-agreety — 默认的,一个类似于 agetty 的基于文本的登录器。
https://git.sr.ht/~kennylevinsen/greetd || greetd-agreety
  • cosmic-greeter — 一个 libcosmic 登录器。
https://github.com/pop-os/cosmic-greeter || cosmic-greeter
  • dlm — 一个 fbdev 登录器。
https://git.sr.ht/~kennylevinsen/dlm || greetd-dlm-gitAUR
  • ddlm — 一个 fbdev 登录器。dlm 的增强/扩展版本。
https://github.com/deathowl/ddlm || greetd-ddlm-gitAUR
  • gtkgreet — 一个 GTK 登录器。
https://git.sr.ht/~kennylevinsen/gtkgreet || greetd-gtkgreet, greetd-gtkgreet-gitAUR
  • ReGreet — 一个 GTK 登录器。支持多种自定义选项。仅限 Wayland。
https://github.com/rharish101/ReGreet || greetd-regreet, greetd-regreet-gitAUR
  • wlgreet — 一个 Wayland 登录器。
https://git.sr.ht/~kennylevinsen/wlgreet || greetd-wlgreetAUR, greetd-wlgreet-gitAUR
  • tuigreet — 一个控制台 UI 登录器。
https://github.com/apognu/tuigreet || greetd-tuigreet
  • qtgreet — 一个 Qt 登录器。
https://gitlab.com/marcusbritanicus/QtGreet || greetd-qtgreetAUR
  • nwg-hello — 用 Python 编写的 greetd 的 GTK3 登录器。
https://github.com/nwg-piotr/nwg-hello || nwg-hello
  • sysc-greet — 一个用 Go 编写的 TUI ASCII 登录器。
https://github.com/Nomadcxx/sysc-greet || sysc-greetAUR

启动 greetd

启用 greetd.service,以便 greetd 在启动时启动。

另见 Display manager#Loading the display manager

登录器配置

通过 /etc/greetd/config.toml 文件中的 default_session 部分的 command 选项来配置 greetd 运行的登录器。如果不做任何更改,将使用包含的 agreety 登录器。另请参阅 #agreety

默认情况下,登录器以 greeter 用户身份运行。可以通过编辑配置文件中 default_session 部分的 user 选项,并将 another_user 替换为所选用户来更改此设置。

...
[default_session]
user = "another_user"
...

确保 /etc/greetd 目录的 所有权已相应设置。

agreety

这是默认登录器。它由 greetd 启动,配置文件设置如下:

...
[default_session]
command = "agreety --cmd $SHELL"
...

agreety 可以在用户登录后启动任意命令。例如,要启动 Sway,请将上面的示例中的 $SHELL 替换为 sway

gtkgreet

为了运行,gtkgreet 需要一个合成器。为了获得完整的体验,需要一个支持 wlr-layer-shell-unstable 的合成器,但其他合成器也可以工作。因此,建议使用 sway,但像 cage 这样的工具也可以使用。下方提供了 cage 和 sway 的示例。

为了指定 gtkgreet 可以启动的登录环境,请在 /etc/greetd/environments 中列出它们。例如:

sway
bash

您还可以使用 -c mycommand 参数调用 gtkgreet,将 mycommand 替换为所需的程序(例如,gtkgreet -c bashgtkgreet -c sway)。在下面的合成器示例中按需操作。

使用 cage

安装 cage 并将 command 选项设置如下:

...
[default_session]
command = "cage -s -- gtkgreet"
...

-s 参数启用 cage 中的 VT 切换(仅限 0.1.2 及更新版本),强烈建议这样做以防止锁定自己。

使用 sway

安装 sway。使用 Sway 时,必须在用户登录后终止它。为此,必须创建一个特定的配置文件,例如在 /etc/greetd/sway-config 中,内容如下:

# `-l` activates layer-shell mode. Notice that `swaymsg exit` will run after gtkgreet.
exec "gtkgreet -l; swaymsg exit"

bindsym Mod4+shift+e exec swaynag \
-t warning \
-m 'What do you want to do?' \
-b 'Poweroff' 'systemctl poweroff' \
-b 'Reboot' 'systemctl reboot'

include /etc/sway/config.d/*

然后,必须将 greetd 设置为使用上述配置文件启动 Sway。将 command 选项设置如下:

...
[default_session]
command = "sway --config /etc/greetd/sway-config"
...

ReGreet

与 gtkgreet 类似,ReGreet 需要一个合成器。例如,Cage 和 Sway 都可以像用于 gtkgreet 那样使用,只需将 gtkgreet 命令替换为 regreet。Sway 的配置将如下所示:

# Notice that `swaymsg exit` will run after ReGreet.
exec "regreet; swaymsg exit"

bindsym Mod4+shift+e exec swaynag \
-t warning \
-m 'What do you want to do?' \
-b 'Poweroff' 'systemctl poweroff' \
-b 'Reboot' 'systemctl reboot'

include /etc/sway/config.d/*

ReGreet 会拾取 /usr/share/xsession(对于 X11 会话)和 /usr/share/wayland-sessions(对于 Wayland 会话)中的可用会话。因此,无需在 /etc/greetd/environments 中列出会话。

ReGreet 可以通过 /etc/greetd/regreet.toml 中的 TOML 文件进行配置。/usr/share/doc/greetd-regreet/regreet.sample.toml 文件中提供了一个示例文件,其中包含所有可用选项。将其复制到 /etc/greetd/regreet.toml 并进行所需的更改,注释掉或删除不需要的行。任何无效的选项都会被忽略。

wlgreet

为了启动 wlgreet,需要一个支持 wlr-layer-shell-unstable 的合成器。按照设置 gtkgreet 与 Sway 的步骤 如上所述,但为 /etc/greetd/sway-config 使用以下内容:

exec "wlgreet --command sway; swaymsg exit"

bindsym Mod4+shift+e exec swaynag \
-t warning \
-m 'What do you want to do?' \
-b 'Poweroff' 'systemctl poweroff' \
-b 'Reboot' 'systemctl reboot'
 
include /etc/sway/config.d/*

tuigreet

tuigreet 不需要任何特殊设置,只需将 command 选项设置为:

...
[default_session]
command = "tuigreet --cmd sway"
...

tuigreet --help 将显示自定义选项。

ddlm

ddlm 不需要任何特殊设置,只需将 command 选项设置为:

...
[default_session]
command = "ddlm --target sway"
...

qtgreet

要使用 qtgreet,您需要一个基于 WLR 的合成器(例如,wayfireAURsway)。

使用 Wayfire

安装 wayfireAUR 并将 command 选项设置如下:

...
[default_session]
command = "wayfire --config /etc/qtgreet/wayfire.ini"
...

引用的 Wayfire 配置文件包含在 qtgreet 中。

使用 Hyprland

command 选项设置如下:

...
[default_session]
command = "Hyprland --config /etc/greetd/hyprland.conf"
...

然后创建 /etc/greetd/hyprland.conf 如下:

/etc/greetd/hyprland.conf
exec-once = qtgreet; hyprctl dispatch exit

nwg-hello

要使用 nwg-hello,您需要 swayhyprland

使用 Sway

安装 sway 并将 command 选项设置如下:

...
[default_session]
command = "sway -c /etc/nwg-hello/sway-config"
...

引用的 Sway 配置文件包含在 nwg-hello 中。

使用 Hyprland

安装 hyprland 并将 command 选项设置如下:

...
[default_session]
command = "Hyprland -c /etc/nwg-hello/hyprland.conf"
...

引用的 Hyprland 配置文件包含在 nwg-hello 中。

技巧与提示

启用自动登录

如果您希望用户自动登录,必须在 /etc/greetd/config.toml 中定义一个 initial_session 部分:

...
[initial_session]
command = "sway"
user = "myuser"
...

command 选项可以包含任何可执行文件的名称。在上面的示例中,Sway 将由 myuser 在启动时启动。

如果您不想使用 greetd 并始终启用自动登录,请参阅 autologin

运行本地程序

将您的 PATH 添加到 ~/.profile,否则 greetd 调用的 DE 将无法运行本地程序。Greetd 将无法访问 .bashrc.zshrc,因此请不要在那里定义 PATH。

~/.profile
export PATH="$HOME/.local/bin:$PATH"

设置环境变量

默认情况下,greetd 不设置 XDG_SESSION_TYPE 和 XDG_CURRENT_DESKTOP 等环境变量,除非登录器根据您选择的会话设置它们(例如,TUI 将根据所选会话文件的位置设置会话类型)。一种解决办法是使用一个包装脚本,在运行实际命令之前设置任何所需的环境变量。例如,要启动 sway:

/usr/local/bin/start-sway
#!/bin/sh
export XDG_SESSION_TYPE=wayland
export XDG_SESSION_DESKTOP=sway
export XDG_CURRENT_DESKTOP=sway

# Wayland stuff
export QT_QPA_PLATFORM=wayland
export SDL_VIDEODRIVER=wayland
export _JAVA_AWT_WM_NONREPARENTING=1

exec sway "$@"

然后使用此包装脚本作为登录器运行的命令。例如,对于 gtkgreet,您可以使用:

/etc/greetd/config.toml
...
[default_session]
command = "gtkgreet -c /usr/local/bin/start-sway"
...

或者将 start-sway 放入 /etc/greetd/environments

参见 如何设置 XDG_SESSION_TYPE=wayland

设置 logind 会话类型

注意 运行 GNOME on Wayland 需要此设置。

logind 会话类型由 XDG_SESSION_TYPE 环境变量设置。但是,必须在 PAM 会话打开 **之前** 设置它。因此,通过 ~/.profile 或包装脚本设置变量将不起作用(两者都发生在会话打开之后)。

正确的方法是通过登录器发送的环境变量(这些在会话打开之前设置)。因此,如果您的登录器支持,只需让它发送适当的 XDG_SESSION_TYPE=xxx

如果您的登录器不支持此功能,也可以在 auth 组下使用 pam_env。缺点是所有由 greetd 启动的会话都将使用该会话类型,这根据您的使用场景可能会有问题,也可能不会。

以下是如何使用 pam_env 方法来实现 Wayland 会话:

/etc/greetd/config.toml
[general]
service = "greetd-spawn"
/etc/greetd/greetd-spawn.pam_env.conf
XDG_SESSION_TYPE DEFAULT=wayland OVERRIDE=wayland
/etc/pam.d/greetd-spawn
auth       include      greetd
auth       required     pam_env.so conffile=/etc/greetd/greetd-spawn.pam_env.conf
account    include      greetd
session    include      greetd

缺少鼠标光标

如果您正在使用 qtgreetwayfire 等合成器,并且通常需要导出变量(例如 WLR_NO_HARDWARE_CURSORS=1)才能使鼠标光标工作,一种解决方案是创建一个单独的 可执行脚本,然后从 /etc/greetd/config.toml 调用它。

/usr/local/bin/greetd-startup.sh
#!/bin/sh
export WLR_NO_HARDWARE_CURSORS=1
exec wayfire --config /etc/qtgreet/wayfire.ini
/etc/greetd/config.toml
...
[default_session]
command = "/usr/local/bin/greetd-startup.sh"
...

防止 systemd 消息覆盖基于控制台的 greetd

如果您正在使用 tuigreet 等基于控制台的登录器,systemd 消息可能会覆盖 UI。要防止这种情况发生,您可以使用 console=quiet 内核参数,因为它会阻止显示任何消息(包括启动时的消息)。

如果您仍然希望在启动时看到消息,您可以改用 console=tty1 添加到 内核参数。这将把来自 /dev/console(广播到所有 tty)的所有消息重定向到 /dev/tty1,而 tty1 在启动时被使用。现在您只需要为登录器选择任何其他 TTY。要么指定一个特定的 tty(非 tty1),要么使用 next 选项。

/etc/greetd/config.toml
...
vt = "next"
...

参见