我们的团队使用适用于嵌入式设备的定制准系统 Linux 发行版,它使用 systemd。
该系统过去依赖 SystemV 初始化脚本,直到内容迁移到 systemd(包括网络服务)。
我们注意到,在重新引导或启动时,systemd 会忽略 /etc/hostname 中的静态主机名,而是设置一个等于“localhost”的临时主机名。
这是我们在启动时看到的。
[ 2.662439] systemd[1]: No hostname configured.
[ 2.667050] systemd[1]: Set hostname to <localhost>.
但是 /etc/hostname 设置正确,我们可以使用 hostnamectl 设置主机名(永久或临时),没有问题。
仅当系统重新启动时,systemd 才会忽略 /etc/hostname 并将临时主机名设置为 localhost。
根据systemd/主机名文档,systemd 应该读取静态主机名:
systemd(1) 和相关工具将通过以下方式获取主机名:
- 如果内核命令行参数 systemd.hostname= 指定了一个有效的主机名,systemd(1) 将使用它在
早期启动期间设置主机名,请参阅 kernel-command-line(7),- 否则,将使用如上所述由 /etc/hostname 指定的“静态”主机名。
- 否则,可以在运行时设置临时主机名,例如基于 DHCP 租约中的信息,请参阅
systemd-hostnamed.service(8)。 NetworkManager 和
systemd-networkd.service(8) 都允许这样做。请注意,
systemd-hostnamed.service(8) 为静态主机名提供更高的优先级,因此只有在 未配置
静态主机名的情况下才会使用临时主机名。- 否则,将使用在编译时配置的后备主机名(“localhost”)。
但是,它会回退到编译时配置的主机名(“localhost”)。
任何想法为什么会发生这种情况,以及去哪里寻找?
临时主机名是在所有其他服务发挥作用之前设置的。
谢谢。
答案1
回答我自己的问题。正如 @Marcus-Müller 指出的那样,systemd 正在被 initrd 解雇,或者更确切地说 initramfs 和 /etc/ 尚未安装。
这就是我们案例中发生的情况。