6 KiB
Greetd
This guide goes over how to setup greetd
, which is a minimalistic Display
Manager (DM) that starts right after boot and asks the user to log in.
A DM is useful for letting you pick which session you wish to load after
logging in (e.g. which WM/DE), but also to provide a slightly nicer UI in
comparison to the default agetty
TTY based login screen.
Another neat feature that greetd offers is automatic login, which will allow you to skip the login process entirely, logging you in right after the boot. This can be useful if you're already typing in your LUKS encryption password each time after a boot, which already acts as a sufficient layer of protection against attackers trying to enter your system.
Warning
If you've set up TPM unlocking for your LUKS encryption, setting up automatic login is not safe, unless you're using a TPM passphrase/PIN.
Important
If you're following while using my dotfiles, you will need to manually place the greetd config from the repo into
/etc/greed/config.toml
. The installation scripts don't do this, as many people prefer not using a greeter.You will also need to follow the installation instructions to download greetd and enable it.
Greetd + tuigreet
Since I prefer a minimalistic approach to most things in my system, I like to
use a terminal based greeter. Greetd itself is just a daemon that supports
various greeters. Most of these greeters are graphical, but there are terminal
based ones too, most notably tuigreet
, which works right from the TTY.
First, install and enable greetd, to make sure it gets started on boot.
sudo pacman -S greetd greetd-tuigreet
sudo systemctl enable greetd
Now, we will want to define our greetd configuration in
/etc/greetd/config.toml
. There should already be a default configuraion that
uses agreety
greeter, which is similar to agetty
, we'll want to change that
to tuigreet
, which in my opinion looks a lot better. We can use the following
config:
[terminal]
# The VT to run the greeter on. Can be "next", "current" or a number
# designating the VT.
vt = 1
# The default session, also known as the greeter.
[default_session]
command = "tuigreet --time --remember --remember-user-session --asterisks --greeting 'Stop staring and log in already' --theme 'border=magenta;text=cyan;prompt=green;time=red;action=white;button=yellow;container=black;input=gray' --sessions /usr/share/wayland-sessions --xsessions /usr/share/xsessions --session-wrapper /usr/local/bin/greetd-session-wrapper --xsession-wrapper /usr/local/bin/greetd-session-wrapper startx /usr/bin/env"
# The user to run the command as. The privileges this user must have depends
# on the greeter. A graphical greeter may for example require the user to be
# in the `video` group.
user = "greeter"
Note
I know the
tuigreet
command is really hard to orient in when written in a single line like this, however, attempting to use a multi-line string doesn't seem to work with greetd (even though it is a part of the TOML standard). This issue has already been reported, yet it doesn't seem like it was addressed.
You may have noticed that I've referred to a
/usr/local/bin/greetd-session-wrapper
script here, that's a custom script that
I wrote to get greetd to run the command to start the WM/DE session within a
running user shell (bash/zsh), so that the appropriate environment variables
will be set when the WM is launched.
This is the content of that script:
#!/bin/bash
set -euo pipefail
# This is a helper wrapper script for greetd.
#
# It will run the session / application using the appropriate shell configured for
# this user. That way, we can make sure all of the environment variables are set
# before the WM/DE session is started.
#
# This is very important, as without it, variables for things like qt theme
# will not be set, and applications executed by the WM/DE will not be themed properly.
script_name="$0"
shell="$(getent passwd "$USER" | awk -F: '{print $NF}')"
command=("$@")
exec "$shell" -c 'exec "$@"' "$script_name" "${command[@]}"
With this configuration, you can now reboot and check whether greetd works properly. (You will still be asked for a password.)
reboot
If everything worked properly, you should've been presented with a custom tuigreet login screen after booting.
Tip
Feel free to adjust the
tuigreet
settings to your liking by editing thecommand
in the greetd settings. If you need a reference for what settings are available, you can check out thetuigreet
project page.
Configuring automatic Login
To configure automatic login, we'll need to modify the greetd
settings in
/etc/greetd/config.toml
and add an initial session section:
[terminal]
# The VT to run the greeter on. Can be "next", "current" or a number
# designating the VT.
vt = 1
# Auto-login session, triggered right after boot.
# If the user logs out, greetd will render the default session
[initial_session]
user = "itsdrike" # TODO: CHANGE THIS
command = "/usr/local/bin/greetd-session-wrapper Hyprland"
# The default session, also known as the greeter.
[default_session]
command = "tuigreet --time --remember --remember-user-session --asterisks --greeting 'Stop staring and log in already' --theme 'border=magenta;text=cyan;prompt=green;time=red;action=white;button=yellow;container=black;input=gray' --sessions /usr/share/wayland-sessions --xsessions /usr/share/xsessions --session-wrapper /usr/local/bin/greetd-session-wrapper --xsession-wrapper /usr/local/bin/greetd-session-wrapper startx /usr/bin/env"
# The user to run the command as. The privileges this user must have depends
# on the greeter. A graphical greeter may for example require the user to be
# in the `video` group.
user = "greeter"