如何使用 systemd 自动登录到桌面?

fhu*_*cho 23 boot arch-linux systemd

如何配置 systemd 以自动登录我的桌面环境,最好不使用登录管理器?我正在使用 Arch。

Wie*_*and 28

这在Arch Wiki 中有描述:

创建一个类似于getty@.service通过将其复制到的新服务文件/etc/systemd/system/

cp /usr/lib/systemd/system/getty@.service /etc/systemd/system/autologin@.service
Run Code Online (Sandbox Code Playgroud)

这基本上将已经存在getty@.service的文件复制到autologin@.service可以自由修改的新文件中。它被复制到,/etc/systemd/system因为这是存储特定于站点的单元文件的地方。/usr/lib/systemd/system包含由包提供的单元文件,因此您不应更改其中的任何内容。

然后,您必须将其符号链接autologin@.service到要自动登录的 tty 的 getty 服务,例如 tty1:

ln -s /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
Run Code Online (Sandbox Code Playgroud)

到现在为止,这仍然和通常的getty@.service文件一样,但最重要的部分是修改autologin@.service以实际自动登录。为此,您只需要更改ExecStart要读取的行

ExecStart=-/sbin/agetty -a USERNAME %I 38400
Run Code Online (Sandbox Code Playgroud)

ExecStartingetty@.service和in 行之间的区别autologin@.service仅在于-a USERNAME它告诉 agetty 使用用户名 USERNAME 自动登录用户。

现在你只需要告诉 systemd 重新加载它的守护进程文件并启动服务:

systemctl daemon-reload
systemctl start getty@tty1.service
Run Code Online (Sandbox Code Playgroud)

(如果您已经在 tty1 上登录,我不确定该服务是否会正常启动,最安全的方法可能是重新启动而不是启动该服务)。

如果您想自动启动 X,请将以下代码段插入您的~/.bash_profile(再次从wiki 中获取):

if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then
    exec startx
fi
Run Code Online (Sandbox Code Playgroud)

您必须修改您~/.xinitrc的桌面环境才能启动桌面环境,具体操作取决于 DE,并且可能在 Arch wiki 中也有描述。

  • 执行符号链接时出现错误“文件存在” (2认同)

小智 6

直接修改文件/etc/systemd/system/getty.target.wants/getty@tty1.service(它是到 的符号链接/lib/systemd/system/getty@service):

附加-a/--autologin USERNAME到行:

ExecStart=-/sbin/agetty --noclear %I $TERM
Run Code Online (Sandbox Code Playgroud)

因此:

ExecStart=-/sbin/agetty -a USERNAME %I $TERM
Run Code Online (Sandbox Code Playgroud)

您也可以删除-o '-p -- \\u'(如当前 Arch 安装中的那样),因为这将启动登录USERNAME但仍要求输入密码。

重新启动后,您将自动登录。

PS更改文件名getty@tty1.servicetty你想登录。


jak*_*ann 6

IMO,Arch Wiki目前推荐了一个更简单的解决方案:

要么运行助手 ( systemctl edit getty@tty1) 要么执行我手动执行的操作:

mkdir -p /etc/systemd/system/getty@tty1.service.d/
touch /etc/systemd/system/getty@tty1.service.d/override.conf
Run Code Online (Sandbox Code Playgroud)

您要输入的文本(通过任一方法)是(确保适当更改用户名):

[Service]
ExecStart=
ExecStart=-/usr/bin/agetty --autologin username --noclear %I $TERM
Run Code Online (Sandbox Code Playgroud)

注意:空行很重要!(诚​​然,我不知道为什么......)

现在,重新启动 ( shutdown -r 0) 并且... login: username (automatic login)会在先前阻止等待用户名/密码输入的地方发生一些影响


重新启动并自动登录后,如果您像我一样现在想通过 SSH 进入这个系统,您可能需要运行:

systemctl enable sshd.service
Run Code Online (Sandbox Code Playgroud)

这将创建符号链接(例如ln -s '/usr/lib/systemd/system/sshd.service' '/etc/systemd/system/multi-user.target.wants/sshd.service'