I have a firstboot.service that, from a stock OS image creates a unique hostname based on the MAC of the primary ethernet adapter. It runs as expected during boot but the hostname that gets registered with DHCP is still the default hostname as set from the kernel. So after the device boots, I can ping it at defaultname.mynet.lan
but when I login and call hostname
it displays foo-XXXX
as expected.
As you can see below, the service is registered to run before network.target
. As you may guess I'm using systemd-networkd
and systemd-resolved
for networking.
- Do I have to do something else to propagate the hostname to running processes?
- Can I set the hostname earlier in the boot process, if so what target should I use?
firstboot.service
[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
firstboot.sh
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
ConditionHost=ubuntu*