RHEL 7.2에서는 systemd
호스트의 호스트 이름을 시작하고 결정합니다. /etc/hostname
을(를) 사용할 수 없고(즉, 제거) /etc/machine-info
사용할 수 없으며 커널이 해당 정보(예: sysctl
' 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 이미지 내에서 실행되고 있습니다.
- 그것은 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