我想在 Arch Linux 上完成以下任务:在启动时在后台启动 dhcpcd,同时自动登录并启动 X 窗口服务器。
这是我到目前为止所尝试过的。首先,我使用以下命令启用自动登录放入片段中致 getty@tty1:
[Service]
ExecStart=
ExecStart=-/usr/bin/agetty --autologin username --noclear %I $TERM
我还添加exec startx
到我的 .bash_profile 文件中。这些一起成功地让我在启动时登录并启动 X
接下来,我使用 systemctl 启用了 dhcpcd 服务:(enp4s0 是我的以太网端口)。这成功启动了 dhcpcd,然后登录。但是,在建立连接时,登录提示延迟了大约 10 秒,这有点烦人。当我看到 X 环境时,我希望 dhcpcd 连接在后台发生。sudo systemctl enable [email protected]
因此,我通过运行并创建以下代码片段添加After=getty@tty1
到 dhcpcd 服务文件中:sudo systemctl edit [email protected]
[Unit]
[email protected]
此后,我在启动时不再出现登录屏幕,并且检查日志显示 systemd 检测到依赖循环并且从未启动 getty。
大概这是因为 getty 的类型为“idle”,这意味着它在作业顺序中最后启动。所以我Type=simple
在getty服务文件中设置。但是,我现在收到错误,不允许非特权用户在启动时登录,并且永远不会出现登录提示。我不确定如何继续。
我意识到一种解决方案是将 dhcpcd 放入我的 bash_profile 中。但是,有什么方法可以单独使用 systemd 来完成我想要的事情吗?我将来可能想以这种方式运行其他服务,并且我不希望弄乱我的 bash_profile。
答案1
我在上面找到了答案拱门维基。
解决方案是使用以下 dhcpcd 代码片段。
[Service]
ExecStart=
ExecStart=/usr/bin/dhcpcd -b -q %I
这-b 标志在后台启动 dhcpcd,并且 -q 使其“安静”,以便其输出不会污染终端(错误和警告除外)。
默认情况下,dhcpcd 具有该类型forking
,并由 systemd 使用 -w 标志调用。 -w 标志阻止它在获取 IP 之前进行分叉,并且由于它具有 Type=forking,因此它不会将自身置于后台并继续启动过程,直到发生这种情况为止,这需要几秒钟的时间。这解释了大约 10 秒的启动延迟。通过立即使用 -b 进入后台,我们可以防止这种延迟。