greetd
greetd 是一个最小化、独立且灵活的 登录管理器守护进程,它不对用户想要启动的程序(无论是基于控制台还是图形界面)做任何假设。任何可以从控制台启动的脚本或程序都可以由 greetd 启动,这使得它特别适合 Wayland 合成器。它还可以像其他显示管理器一样启动一个 登录器来开始用户会话。
安装
安装 greetd 或 greetd-gitAUR 包。
默认的 greetd 配置文件位于 /etc/greetd/config.toml。PAM 相关配置设置在 /etc/pam.d/greetd。
登录器
Greetd 内置了 greetd-agreety 作为其登录器,但这是一个最小化的实现。您应该考虑使用几个可用的登录器之一。
- greetd-agreety — 默认的,一个类似于 agetty 的基于文本的登录器。
- cosmic-greeter — 一个 libcosmic 登录器。
- dlm — 一个 fbdev 登录器。
- ddlm — 一个 fbdev 登录器。
dlm的增强/扩展版本。
- gtkgreet — 一个 GTK 登录器。
- ReGreet — 一个 GTK 登录器。支持多种自定义选项。仅限 Wayland。
- wlgreet — 一个 Wayland 登录器。
- tuigreet — 一个控制台 UI 登录器。
- qtgreet — 一个 Qt 登录器。
- nwg-hello — 用 Python 编写的 greetd 的 GTK3 登录器。
- sysc-greet — 一个用 Go 编写的 TUI ASCII 登录器。
启动 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 bash 或 gtkgreet -c sway)。在下面的合成器示例中按需操作。
使用 cage
... [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 的合成器(例如,wayfireAUR,sway)。
使用 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,您需要 sway 或 hyprland。
使用 Sway
... [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 会话类型
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
缺少鼠标光标
如果您正在使用 qtgreet 和 wayfire 等合成器,并且通常需要导出变量(例如 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" ...