问题描述
重启使用 Linux 系统的云主机后发现 /etc/hosts 文件被全部重写或被添加了主机名和回环地址(例:127.0.0.1、127.0.1.1)的解析,导致域名解析不符合预期或出现问题。
问题原因
云平台 Linux 镜像中的一个核心组件是 cloud-init。作为开源的云初始化程序,cloud-init 主要用于对主机名、初始密码等一些自定义信息进行初始化配置。若 cloud-init 配置中存在对 manage_etc_hosts 的配置,则 cloud-init 会根据具体配置值决定如何调整 /etc/hosts 文件。公共镜像默认不启用 cloud-init 对 /etc/hosts 的修改功能,即 manage_etc_hosts 不做配置或配置为 false(默认值)。若您使用了公共镜像并修改了 cloud-init 配置或使用了私有镜像,则可参考此指导来尝试解决问题。
问题排查思路
/etc/hosts 文件被全部重写可能是因为 cloud-init 配置中将 manage_etc_hosts 配置成了true(若您安装的 cloud-init 版本低于22.3,则还可能是配置成了 template)。此时,cloud-init 会根据/etc/cloud/templates/hosts.tmpl 来重写 /etc/hosts 文件。
而 /etc/hosts 文件被添加主机名解析可能是因为 cloud-init 配置中将 manage_etc_hosts 配置成了 localhost。
解决步骤
-
Cloud-init 配置文件是 /etc/cloud/cloud.cfg,您可能还将自定义配置放于 /etc/cloud/cloud.cfg.d/ 目录下。搜索包含 manage_etc_hosts 配置的文件可使用以下命令:
grep -rn ‘manage_etc_hosts’ /etc/cloud/*
返回结果示例:
-
以上述返回结果为例,可以看到在/etc/cloud/cloud.cfg 文件中的第20 行将 manage_etc_hosts 配置成了 localhost,此时您需要修改 cloud.cfg 中的 manage_etc_hosts 配置,即:
原文:
manage_etc_hosts: localhost
修改后:
# manage_etc_hosts: localhost
或者也可:
manage_etc_hosts: false
-
按您的业务需求修改 /etc/hosts。