我有一个firstboot.service,它从库存操作系统映像创建一个基于主以太网适配器的MAC 的唯一主机名。它在引导期间按预期运行,但使用 DHCP 注册的主机名仍然是从内核设置的默认主机名。因此,在设备启动后,我可以 ping 它,defaultname.mynet.lan
但当我登录并调用它时,它会按预期hostname
显示。foo-XXXX
如下所示,该服务已注册为在 之前运行network.target
。正如您可能猜到的,我正在使用systemd-networkd
和systemd-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.target
man systemd.service