How can I configure systemd to automatically log me in to my desktop environment, preferably without using a login manager? I'm using Arch Linux.
This is described in the ArchWiki:
Create a new service file similar to
getty@.serviceby copying it to
cp /usr/lib/systemd/system/getty@.service /etc/systemd/system/autologin@.service
This basically copies the already existing
getty@.service to a new file
autologin@.service which can be freely modified. It is copied to
/etc/systemd/system because that's where site-specific unit files are stored.
/usr/lib/systemd/system contains unit files provided by packages so you shouldn't change anything in there.
You will then have to symlink that
autologin@.service to the getty service for the tty on which you want to autologin, for examply for tty1:
ln -s /etc/systemd/system/autologin@.service /firstname.lastname@example.org
Up to now, this is still the same as the usual
getty@.service file, but the most important part is to modify the
autologin@.service to actually log you in automatically.
To do that, you only need to change the
ExecStart line to read
ExecStart=-/sbin/agetty -a USERNAME %I 38400
The difference between the
ExecStart line in
autologin@.service is only the
-a USERNAME which tells agetty to log the user with the username USERNAME in automatically.
Now you only have to tell systemd to reload its daemon files and start the service:
systemctl daemon-reload systemctl start email@example.com
(I'm not sure if the service will start properly if you're already logged in on tty1, the safest way is probably to just reboot instead of starting the service).
If you then want to automatically start X, insert the following snippet into your
~/.bash_profile (taken from the wiki again):
if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then exec startx fi
You will have to modify your
~/.xinitrc to start your desktop environment, how to do that depends on the DE and is probably described in the ArchWiki as well.
Directly modify the file
/firstname.lastname@example.org (which is a symlink to
-a/--autologin USERNAME to the line:
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=-/sbin/agetty -a USERNAME %I $TERM
You might also remove
-o '-p -- \\u' (as present on the current Arch installation) as this would start the login for
USERNAME but still asks for the password.
After rebooting, you will be logged in automatically.
P.s. Change the filename
email@example.com to the
tty you want to log into.
IMO, the Arch Wiki currently recommends a much simpler solution:
Either run the helper (
systemctl edit getty@tty1) or do what I did manually:
mkdir -p /firstname.lastname@example.org/ touch /email@example.com/override.conf
The text you want to enter (by either method) is (be sure to change username appropriately):
[Service] ExecStart= ExecStart=-/usr/bin/agetty --autologin username --noclear %I $TERM
NOTE: The empty line is important! The empty line will first clear the ExecStart entry, while the next line will introduce a new exec command.
Now, restart (
shutdown -r 0) and something to the effect of
... login: username (automatic login) will happen where it previously blocked waiting for username/password input
Once rebooted, and auto-logged in, if you're like me and want to SSH into this system now, you probably need to run:
systemctl enable sshd.service
Which will create the symlink (e.g.
ln -s '/usr/lib/systemd/system/sshd.service' '/etc/systemd/system/multi-user.target.wants/sshd.service')