systemd 从哪里确定临时主机名?

Oth*_*eus 7 boot systemd

在 RHEL 7.2 中,systemd启动并确定主机的主机名。如果/etc/hostname不可用(即,已删除)/etc/machine-info且不可用,并且内核未配置该信息(即sysctl's kernel.hostname),则为systemd主机分配一个“临时”主机名。问题是:它从哪里确定这一点?

主机最初是这样命名的。然后我克隆了主机(它是一个 VM)并清除了对该名称的所有引用。但是在启动过程中,很早就被设置成这样。

如果我启动,rescuemode我可以看到它很早就设置了主机名:

[    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...
Run Code Online (Sandbox Code Playgroud)

在命令提示符下,它被设置为“临时”主机名:

# hostnamectl status
Transient hostname: badhostname.mydomain.com
...
Run Code Online (Sandbox Code Playgroud)

可能不是这样systemd:我什至在使用时遇到这个问题init=/bin/bash,但 systemd 正在 initrd 映像中运行。

  • 它没有设置在 grub 或任何东西中。
  • 它不是由 DHCP 设置的,因为网络在启动时被禁用。
  • 它不在文件系统中的任何地方:

    # 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>
    
    Run Code Online (Sandbox Code Playgroud)

不知何故,内核或 systemd 正在确定旧主机名并将其用作瞬态,我完全不知道如何!. 我做了一个find ... -exec grep除了/var/log/dmesg. 我告诉你,systemd 一直困扰着我的主机!

编辑 2:唯一一次我没有得到它是如果我启动到提供的救援 initramfs。显然,生成的 initramfs 包含肮脏的秘密!

Oth*_*eus 8

感谢 Don Crissti 的洞察力和通过消除过程,得出的结论是罪魁祸首是 initramfs 映像。不知何故,dracut当它构建图像时决定包含主机名的缓存版本(!?!)。

重建 initrd/initram fs 已在此处介绍,但简而言之(因为您,亲爱的读者可能无法访问),请执行

dracut -f -v
Run Code Online (Sandbox Code Playgroud)