在首次启动时在 network.service 之前设置主机名

在首次启动时在 network.service 之前设置主机名

我有一个firstboot.service,它从库存操作系统映像创建一个基于主以太网适配器的MAC 的唯一主机名。它在引导期间按预期运行,但使用 DHCP 注册的主机名仍然是从内核设置的默认主机名。因此,在设备启动后,我可以 ping 它,defaultname.mynet.lan但当我登录并调用它时,它会按预期hostname显示。foo-XXXX

如下所示,该服务已注册为在 之前运行network.target。正如您可能猜到的,我正在使用systemd-networkdsystemd-resolved进行网络连接。

  • 我是否需要执行其他操作才能将主机名传播到正在运行的进程?
  • 我可以在启动过程的早期设置主机名吗?如果可以,我应该使用什么目标?

首次启动服务

[Unit]
ConditionPathExists=|!/etc/hostname
Before=network.target
After=local-fs.target
After=sys-subsystem-net-devices-eth0.device

[Service]
Type=oneshot
ExecStart=/bin/bash -c "/usr/local/sbin/firstboot.sh"
RemainAfterExit=yes

[Install]
WantedBy=network.target

首次启动文件

HOST_PREFIX=${HOST_PREFIX:-"foo"}
NET_DEVICE=${NET_DEVICE:="eth0"}
LAST_MAC4=$(sed -rn "s/^.*([0-9A-F:]{5})$/\1/gi;s/://p" /sys/class/net/${NET_DEVICE}/address)
NEW_HOSTNAME=${HOST_PREFIX}-${LAST_MAC4:-0000}

echo $NEW_HOSTNAME > /etc/hostname
/bin/hostname -F /etc/hostname

答案1

没有什么可以确保您firstboot.service之前的运行systemd-networkd开始。你必须使用

Wants=network-pre.target
Before=network-pre.target

而不是Before=network.target为了实现这一点。解释如下man systemd.special

网络预目标: 该被动目标单元可以由想要在设置任何网络之前运行的服务拉入,例如为了设置防火墙的目的。所有网络管理软件都会根据这个目标自行排序,但不会将其拉入。

您还需要避免对(请参阅)DefaultDependencies=false的隐式依赖。basic.targetman systemd.service

相关内容