在 systemd.run 内核参数上等待网络(如 systemd 单元中的 require/wants )

在 systemd.run 内核参数上等待网络(如 systemd 单元中的 require/wants )

我在用着内核systemd.run参数在 Manjaro ARM 首次启动时应用一些自动配置任务,例如设置主机名、添加默认用户……并且我想使用pacman.除了安装pacman软件包之外,一切正常。例如,我正在尝试更新所有软件包并安装 vim:

pacman -Syu --noconfirm
pacman -S --noconfirm vim

例如,这会为每个镜像抛出几个错误

+ pacman -Syu --noconfirm
:: Synchronizing package databases...
 core downloading...
 extra downloading...
 community downloading...
error: failed retrieving file 'core.db' from manjaro.mirrors.lavatech.top : Could not resolve host: manjaro.mirrors.lavatech.top
warning: too many errors from manjaro.mirrors.lavatech.top, skipping for the remainder of this transaction
error: failed retrieving file 'extra.db' from manjaro.mirrors.lavatech.top : Could not resolve host: manjaro.mirrors.lavatech.top
error: failed retrieving file 'community.db' from manjaro.mirrors.lavatech.top : Could not resolve host: manjaro.mirrors.lavatech.top
error: failed retrieving file 'core.db' from ftp.nluug.nl : Could not resolve host: ftp.nluug.nl

我尝试 ping 我的本地服务器以及互联网域,例如

+ ping -c1 192.168.0.19
ping: connect: Network is unreachable

所以看起来脚本运行时网络连接还没有建立。我试过systemd.wants但还是不行,网络不可用。还尝试了不同的单位,systemd.wantscmdline.txt

systemd.wants=systemd-networkd.service
systemd.wants=systemd-networkd-wait-online.service
systemd.wants=network-online.target
systemd.wants=dhcpcd.service

systemd 指令/boot/cmdline.txt

systemd.run=/boot/my_init_wrapper.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target systemd.wants=systemd-networkd.service

自从systemd-run-generator只提到三个选项(runrun_success_actionrun_failture_action)我认为我误解了第一个文档,并且似乎无法为systemd.run.generator.我想知道这一点,因为 systemd 单元本身可以指定不同类型的依赖项。还有其他方法可以在内核中指定它们吗cmdline.txt

我正在 Raspberry Pi 4 上尝试这个。但由于这个问题仅与 systemd 有关,因此,它是否在 pi 或任何其他带有 systemd 的机器上运行并不重要。所以我将其作为一般 Linux 问题而不是 RPI 平台发布在这里。

答案1

我认为在这种情况下,您最好不要通过,systemd.run而是将其作为正常服务并使用ConditionFirstBoot=yes- 至少对于pacman部分而言。

根据手动的,此类单位最好还参考first-boot-complete.target

[Unit]
Description="Update packages & install vim"
ConditionFirstBoot=yes
Wants=first-boot-complete.target
Before=first-boot-complete.target
Wants=network-online.target
After=network-online.target

[Service]
#optional ping test
#ExecCondition=/usr/bin/ping -c 2 -w 2 manjaro.org
#not running arch - adapt pacman path if need be:
ExecStart=/usr/bin/pacman -Syu --noconfirm
ExecStart=/usr/bin/pacman -S --noconfirm vim

[Install]
WantedBy=default.target

ping 测试可能会很有趣,因为“网络在线”含义的不确定性


首次启动条件来自手册的引用:

首次启动条件=

采用布尔参数。该条件可用于根据系统是否第一次启动来确定单元的条件。这大致意味着/etc/未填充(有关详细信息,请参阅 参考资料中的“首次引导语义” machine-id(5))。这可用于/etc/在恢复出厂设置后首次启动时或在新系统实例首次启动时填充。

为了鲁棒性,单位ConditionFirstBoot=yes应该先命令自己first-boot-complete.target并用 拉入这个被动目标Wants=。这确保了在首次启动中止的情况下,这些单元将在下次系统启动期间重新运行。

如果systemd.condition-first-boot=在内核命令行上指定了该选项(采用布尔值),它将覆盖此条件检查的结果,优先于/etc/machine-id存在检查。

相关内容