![systemd 从哪里确定临时主机名?](https://linux22.com/image/88800/systemd%20%E4%BB%8E%E5%93%AA%E9%87%8C%E7%A1%AE%E5%AE%9A%E4%B8%B4%E6%97%B6%E4%B8%BB%E6%9C%BA%E5%90%8D%EF%BC%9F.png)
在 RHEL 7.2 中,systemd
启动并确定主机的主机名。如果/etc/hostname
不可用(即,删除),并且/etc/machine-info
不可用,并且内核未配置该信息(即,sysctl
's kernel.hostname
),systemd
则为主机分配一个“临时”主机名。问题是:从哪里决定这一点?
主机最初是这样命名的。然后,我克隆了主机(它是一个虚拟机)并擦除了对该名称的所有引用。但在启动过程中,很早的时候,它就被这样设置了。
如果我启动,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...
在命令提示符下,它被设置为“临时”主机名:
# hostnamectl status
Transient hostname: badhostname.mydomain.com
...
可能不是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>
不知何故,内核或 systemd 正在确定旧主机名并将其用作瞬态,而我完全不知道如何! 。我做了一个find ... -exec grep
除了 之外没有任何结果/var/log/dmesg
。我告诉你,systemd 困扰着我的主机!
编辑2:唯一一次我没有得到它是如果我启动到提供的救援initramfs。显然,生成的 initramfs 包含肮脏的秘密!
答案1
感谢 Don Crissti 的见解并通过排除过程,得出的结论是罪魁祸首是 initramfs 映像。不知何故,dracut
当它构建映像时,它决定包含主机名的缓存版本(!?!)。
涵盖了重建 initrd/initram fs这里但简而言之(因为你,亲爱的读者可能没有访问权限),做
dracut -f -v