Woher bestimmt systemd den vorübergehenden Hostnamen?

7

Startet in RHEL 7.2 systemdund ermittelt den Hostnamen des Hosts. Wenn /etc/hostnamenicht verfügbar (dh entfernt) und nicht /etc/machine-infoverfügbar ist und der Kernel nicht mit diesen Informationen (dh sysctl's kernel.hostname) konfiguriert ist , systemdweist er dem Host einen "vorübergehenden" Hostnamen zu. Die Frage ist: Woher bestimmt es das?

Der Host wurde ursprünglich so benannt. Ich habe dann den Host geklont (es ist eine VM) und alle Verweise auf diesen Namen gelöscht. Aber dann wird es während des Startvorgangs sehr früh so eingestellt.

Wenn ich hochfahre, rescuemodekann ich sehen, dass der Hostname sehr früh festgelegt wird:

[    0.456076] systemd[1]: systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +AC
L +XZ)
[    0.456664] systemd[1]: Detected virtualization 'kvm'.
[    0.456955] systemd[1]: Running in initial RAM disk.
[    0.458496] systemd[1]: Set hostname to <badhostname.example.com>.
[    0.475394] systemd[1]: Expecting device dev-mapper-vgroot\x2dlvroot.device...

An der Eingabeaufforderung wird ein "vorübergehender" Hostname festgelegt:

# hostnamectl status
Transient hostname: badhostname.mydomain.com
...

Es kann sein, dass es nicht so ist systemd: Ich bekomme sogar dieses Problem bei der Verwendung init=/bin/bash, aber systemd wird im initrd-Image ausgeführt.

  • Es ist nicht in Maden oder so gesetzt.
  • Es wird nicht von DHCP festgelegt, da das Netzwerk beim Booten deaktiviert ist.
  • Es ist nirgendwo im Dateisystem:

    # find / \( -path /sys -prune -o -path /proc -prune -o -path /run -prune \) -o -type f -exec grep -ilrF "${HOSTNAME}" {} +
    <some .git files>
    <history files of non-root user>
    

Irgendwie bestimmt der Kernel oder das System den alten Hostnamen und verwendet ihn als Transienten, und ich weiß nicht, wie! . Ich habe eine find ... -exec grepohne Ergebnisse gemacht, außer /var/log/dmesg. Ich sage dir, systemd hat meinen Gastgeber verfolgt!

EDIT 2: Das einzige Mal, dass ich es nicht bekomme, ist, wenn ich die bereitgestellten Rettungsinitramfs boote. Anscheinend birgt das generierte Initramfs schmutzige Geheimnisse!

Otheus
quelle
Ich habe es auf drei Möglichkeiten eingegrenzt: (1) das initrd-Image, (2) auch wenn es sich nicht im Netzwerkmodus befindet, verwendet es DHCP, um den Hostnamen zu erhalten - möglicherweise innerhalb von initrd, (3) schwarze Magie.
Otheus
1
Nebenbei, nette Verwendung des Wortes "woher". ;)
Wildcard

Antworten:

6

Dank der Erkenntnisse von Don Crissti und des Eliminierungsprozesses wird der Schluss gezogen, dass der Schuldige das Bild des Initramfs ist. Irgendwie dracutentscheidet sich das Image beim Erstellen dafür, eine zwischengespeicherte Version des Hostnamens (!?!) Einzuschließen.

Die Neuerstellung von initrd / initram fs wird hier behandelt, aber kurz gesagt (da Sie, lieber Leser, möglicherweise keinen Zugriff haben)

dracut -f -v
Otheus
quelle