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