I will just explain how my laptop startup look like. One boot process from grub to login. I use Laptop only for me so I don’t have to take care for multiuser.

I try no make the boot process as minimal as possible. And require as well user interaction as possible.

Grub

First of all I will use grub as my bootloader to load Linux itself.

I setup the grub timeout to 0 get get a faster boot time.

GRUB_TIMEOUT=0

To apply the settings I have to rebuild the grub configuration with:

update-grub

Linux

After Linux has started it will immediately decrypt my harddrive. For that I need to insert my Key.

Systemd

Linux will start systemd will take care of starting all oder needed processes. When the system is ready systemd will mange the autologin. I don’t use a dispaly manager I just login right in to the shell.

systemd autologin

I setup the autologin on the following way:

With the command following command I will create the configuration file for the login. (/etc/systemd/system/[email protected]/override.conf)

systemctl edit [email protected]

Add the lines to the configuration file:

[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin USERNAME --noclear %I 38400 $TERM

Enable the new service in systemd

systemctl enable [email protected]

At the next boot you will be log in automatically.

user session

I use ZSH as my login shell. It will first check if an xserver is running and we are on tty1. I do this by adding the following snippet to my .zprofile.

if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
                  exec startx
fi

xsession

The startx command load the .xinitrc file in my home directory. I only will explain here the importend parts of my .xinitrc file. The full file can be found in my dotfiles.

I start my user services with systemd. Some of the application need to have information the running xserver. For application of this kind I first load the X variables in to systemd and DBUS.

systemctl --user import-environment DISPLAY XAUTHORITY &
if command -v dbus-update-activation-environment >/dev/null 2>&1; then
        dbus-update-activation-environment DISPLAY XAUTHORITY &
fi

To start the application with systemd I start my x target. this systemd target I includes all the service I want to start in my user session and depends on X.

systemctl --user start x.target & 

Don’t enable the target if you do this it will start before you have the variables you need

At the end I start i3 as my display manager with:

exec /usr/bin/i3