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/hostnameBefore=network.targetAfter=local-fs.targetAfter=sys-subsystem-net-devices-eth0.device[Service]Type=oneshotExecStart=/bin/bash -c /usr/local/sbin/firstboot.shRemainAfterExit=yes[Install]WantedBy=network.targetfirstboot.shHOST_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
Set hostname on first boot before network.service
debian;systemd;dhcp;hostname
Nothing ensures that your firstboot.service runs before systemd-networkd is started. You have to useWants=network-pre.targetBefore=network-pre.targetinstead of Before=network.target to achieve that.  As man systemd.special explains:network-pre.target:  This passive target unit may be pulled in by services that want  to run before any network  is set up, for example for the purpose of setting up a firewall.  All network management  software orders itself after this target, but does not pull it in.You'll also need DefaultDependencies=false to avoid the implicit dependency on basic.target (see man systemd.service).