处理Alibaba Cloud Linux 3实例主机名修改不生效问题

更新时间:
复制为 MD 格式

问题现象

使用 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 的调试信息。

    image

问题原因

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能正确应用云平台下发的配置。

  1. 使用 sed 命令直接修改配置文件(将 true 改为 false):

    sed -i 's/preserve_hostname: true/preserve_hostname: false/g' /etc/cloud/cloud.cfg
  2. 再次验证修改结果:

    grep "preserve_hostname" /etc/cloud/cloud.cfg
    # 预期输出:preserve_hostname: false
  3. 应用修改

    • 针对当前运行中的实例:修改配置后,Cloud-init 不会立即自动重置主机名。您需要手动执行 hostnamectl set-hostname <新主机名> 修正当前主机名,或者重启实例

    • 针对自定义镜像:如果您是基于当前实例制作自定义镜像,请在执行完上述修改后,再进行镜像创建。使用新镜像创建的实例将能正常响应控制台的主机名设置。