systemd はどこから一時的なホスト名を決定するのでしょうか?

systemd はどこから一時的なホスト名を決定するのでしょうか?

RHEL 7.2 では、systemdが起動し、ホストのホスト名を決定します。/etc/hostnameが使用不可 (つまり、削除されている)/etc/machine-infoかつ が使用不可で、カーネルがその情報で構成されていない場合 (つまり、sysctlkernel.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...

コマンド プロンプトでは、「一時的な」ホスト名として設定されます。

# 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

関連情報