greetd

出自 ArchWiki

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

安装

安装 greetdgreetd-gitAUR 软件包。

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

Greeters

Greetd 默认自带 greetd-agreety 作为其 greeter,但这只是一个最小化的实现。您应该考虑使用几个可用的 greeter 之一

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

启动 greetd

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

另请参阅 显示管理器#加载显示管理器

Greeter 配置

由 greetd 运行的 greeter 配置是通过 /etc/greetd/config.tomldefault_session 部分的 command 选项完成的。如果没有进行任何更改,将使用内置的 agreety greeter。另请参阅 #agreety

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

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

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

agreety

这是默认的 greeter。它由 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 gtkgreet"
...

使用 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 中列出会话。

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

wlgreet

为了启动 wlgreet,需要一个支持 wlr-layer-shell-unstable 的合成器。按照 上面描述的 使用 Sway 设置 gtkgreet 所需的步骤,但将以下内容用于 /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,您需要 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,除非 greeter 根据您选择的会话设置它们(例如,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 "$@"

然后使用此包装脚本作为 greeter 运行的命令。例如,使用 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 会话类型

注意: 这对于在 Wayland 上正确运行 GNOME 是必要的。

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

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

如果您的 greeter 不支持此功能,也可以在 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"
...

参见