On Mon, Jul 31, 2017 at 7:38 AM, Andrey Yurovsky <yurov...@gmail.com> wrote:
> On Mon, Jul 31, 2017 at 7:24 AM, Lennart Poettering > <lenn...@poettering.net> wrote: > > On Fr, 28.07.17 12:08, Andrey Yurovsky (yurov...@gmail.com) wrote: > > > >> I have an embedded target where the hostname is expected to be a > >> string derived in part from the MAC address of an Ethernet interface. > >> I've been looking at how to properly set the system's hostname and > >> also have systemd-networkd use it in the DHCP request it sends out, > >> however there seems to be an order of operations issue. > >> > >> 1. in systemd/core/main.c the /etc/hostname contents are > unconditionally read > >> 2. I can add a service that uses the special network-pre.target to > >> override /etc/hostname with my generated string and I see that while > >> the initial string is pickedup by systemd, the new hostname will in > >> fact be used > >> 3. I then have a .network file specifying DHCP on that Ethernet > interface > >> > >> But then on initial boot I see that the DHCP Discover coming out has > >> option 12 set to the original hostname that systemd picked up in > >> main.c, even though the network-pre.target caused my unit to run. I > >> can then reboot the system and this time main.c picks up the "new" > >> hostname and option 12 is indeed set to this. > >> > >> One workaround I found was to have my unit write the Hostname= option > >> to the .network file but that seems like the wrong approach. > >> > >> Is there a correct way to replace or otherwise set the hostname and > >> have systemd use it from the beginning and ensure that the DHCP client > >> specifies it in option 12? > > > > Hmm, I am not sure I follow. Do you want the hostname to be "sticky"? > > i.e. if you boot up once, and your special hostname is not initialized > > yet, you initialize from whatever the MAC address is, and then store > > it to /etc/hostname, and from that point on and for all future boots > > it's supposed to stay fixed? Or do you want it to be fully > > dynamic: as soon as an ethernet device shows up, set the hostname, > > and when no device has shown up the hostname should remain > > uninitialized, and on subsequent boot everything starts from fresh, > > with no previous data? > > Sorry, what I mean is the hostname is "sticky" but is always the same > (there's just the one built-in Ethernet interface, nothing is > dynamic), the trick is I always want that generated hostname used and > I never want to see a DHCP Discover go out with a default hostname > that isn't this generated string (it's a bit off but is meant to > maintain expected behavior from this device). > > There's an option under [dhcp] section https://www.freedesktop.org/software/systemd/man/systemd.network.html SendHostname= When true (the default), the machine's hostname will be sent to the DHCP server. UseHostname= When true (the default), the hostname received from the DHCP server will be set as the transient hostname of the system Hostname= Use this value for the hostname which is sent to the DHCP server, instead of machine's hostname. would think if you set your name there it won't matter what /etc/hostname is? > > > Under the assumption you want the latter: just drop /etc/hostname, so > > that no static hostname is managed by systemd/hostnamed. In this case > > the system will boot up with the fallback hostname (which is > > "localhost" unless your distro overrides that at compile time). Then, > > add a udev rule that is run when an interface shows up, and that > > changes the hostname as necessary, maybe by invoking the > > /usr/bin/hostname binary. > > I didn't think of that, thank you! That makes a lot of sense. > > > The DHCP client in networkd will query the hostname the instant it > > starts setting up the DHCP session. It will use whatever is set at > > that point in time. Hence, if you set the hostname from the udev rule > > things should be properly race-free as networkd will only take > > possession of any interface after the udev rule ran, and hence will > > necessarily initialize its DHCP client at a point in time the hostname > > is set to what you want it to be set to. > > Got it. Thank you for taking the time to answer my weird question, I > really appreciate it. > _______________________________________________ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/systemd-devel >
_______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel