问题现象
使用 Alibaba Cloud Linux 3 (Alinux3) 自定义镜像创建 ECS 实例(包括裸金属实例)时,如果在创建过程中通过控制台或 API 指定了主机名(Hostname),实例启动后发现主机名未生效,仍保持为镜像内的默认值(通常为 localhost)。
具体表现如下:
主机名不一致:在 ECS 控制台或通过 API 查询实例详情,显示的主机名是预期的名称(例如
web-server-01)。但在实例内部执行hostname命令,返回的却是localhost或其他旧名称。Cloud-init 日志提示:查看 Cloud-init 的日志文件
/var/log/cloud-init.log,发现包含preserve_hostname的调试信息。
问题原因
Cloud-init配置文件中启用了保留主机名选项。
Alibaba Cloud Linux 3 使用 Cloud-init 进行实例初始化配置。在 /etc/cloud/cloud.cfg 配置文件中,参数 preserve_hostname 控制着 Cloud-init 是否应该修改系统的主机名。
当
preserve_hostname: true时:Cloud-init 会认为镜像中现有的主机名是刻意保留的,因此忽略云平台(ECS 控制台/API)下发的主机名配置,不进行修改。此配置常见于用户在制作自定义镜像前,未清理或错误配置了 Cloud-init 设置。
解决方案
检查系统中的 Cloud-init 配置文件,确认为该参数导致的问题后,将其修改为false。
步骤一:检查Cloud-init配置,确认preserve_hostname参数
使用Workbench登录Linux实例,执行以下命令查看配置:
grep "preserve_hostname" /etc/cloud/cloud.cfg若输出
preserve_hostname: true,则确认为此原因导致主机名无法修改。若输出
preserve_hostname: false,则说明原因不在于此,需排查其他系统配置。
步骤二:修改配置并修复
此步骤将关闭保留主机名功能,确保Cloud-init能正确应用云平台下发的配置。
使用
sed命令直接修改配置文件(将true改为false):sed -i 's/preserve_hostname: true/preserve_hostname: false/g' /etc/cloud/cloud.cfg再次验证修改结果:
grep "preserve_hostname" /etc/cloud/cloud.cfg # 预期输出:preserve_hostname: false应用修改: