web-dev-qa-db-ja.com

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...

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

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

systemdではない可能性があります。init=/bin/bashを使用するとこの問題が発生しますが、systemdはinitrdイメージ内で実行されています。

  • それはグラブや何かで設定されていません。
  • 起動時にネットワークが無効になるため、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は汚い秘密を保持しています!

7
Otheus

Don Crisstiの洞察と消去のプロセスのおかげで、犯人はinitramfsイメージであると結論付けられました。何とかdracutがイメージをビルドするときに、キャッシュされたバージョンのホスト名(!?!)を含めることにしました。

Initrd/initram fsの再構築はカバーされています here ですが、要するに(親愛なる読者がアクセスできない可能性があるため)、

dracut -f -v
6
Otheus