greetd
greetd 是一个最小化、不可知论和灵活的登录管理器守护进程,它不对用户想要启动的内容做出假设,无论是基于控制台还是图形界面。任何可以从控制台启动的脚本或程序都可以被 greetd 启动,这使得它特别适合 Wayland 合成器。它也可以像任何其他显示管理器一样启动一个 greeter 来启动用户会话。
安装
安装 greetd 或 greetd-gitAUR 软件包。
默认的 greetd 配置文件位于 /etc/greetd/config.toml
。 PAM 相关的配置在 /etc/pam.d/greetd
中设置。
Greeters
Greetd 默认自带 greetd-agreety 作为其 greeter,但这只是一个最小化的实现。您应该考虑使用几个可用的 greeter 之一
- greetd-agreety — 默认的,一个类似于 agetty 的基于文本的 greeter。
- cosmic-greeter — 一个 libcosmic greeter。
- dlm — 一个 fbdev greeter。
- ddlm — 一个 fbdev greeter。
dlm
的增强/扩展版本。
- gtkgreet — 一个 GTK greeter。
- ReGreet — 一个 GTK greeter。 支持各种自定义选项。仅限 Wayland。
- wlgreet — 一个 Wayland greeter。
- tuigreet — 一个控制台 UI greeter。
- qtgreet — 一个 Qt greeter。
- nwg-hello — 基于 GTK3 的 greetd greeter,使用 python 编写。
启动 greetd
启用 greetd.service
以便在启动时启动 greetd。
另请参阅 显示管理器#加载显示管理器。
Greeter 配置
由 greetd 运行的 greeter 配置是通过 /etc/greetd/config.toml
中 default_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 bash
或 gtkgreet -c sway
)。在下面的合成器示例中根据需要执行此操作。
使用 cage
... [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,您需要 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,除非 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 会话类型
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" ...