---
title: EC2 上 CentOS 7 的 hostname 为何总被 cloud-init 改回去
date: '2015-04-21 11:14:06'
draft: false
summary: 很多看似是系统配置失效的问题，根子其实在云初始化层对主机名的接管和重写。
slug: ec2-centos7-cloud-init-preserve-hostname
syndication:
- platform: Weibo
  url: https://weibo.com/1648815335/Ceh7CbzqO
tags:
- ec2
- centos
- cloud-init
- devops
topics:
- software-engineering
type: post
---

在 `EC2` 上装 `CentOS 7` 时，我遇到过一个很烦人的问题：`hostname` 明明改好了，但一重启就又被改回去了。

这种问题第一反应通常会怀疑是网络配置、系统服务或者某个地方缓存了旧值。结果绕一圈后发现，真正捣鬼的并不是 `CentOS` 本身，而是 `cloud-init`。

`cloud-init` 的定位本来是实例初始化工具。它负责机器第一次启动时的一系列准备工作，比如：

- 系统用户初始化
- 网络和主机基础配置
- 与 `puppet` 等管理工具配合
- 云平台注入的元数据处理

所以从设计上讲，它天然就有权接管像 hostname 这样的系统级初始化参数。

这也是为什么你手动改了之后，如果没有把这层逻辑关掉，它下次启动时还是会按照云环境元数据或者默认流程把值重新写回去。

这个问题的修正方式其实不复杂：

- 修改 `/etc/cloud/cloud.cfg`
- 打开 `preserve_hostname`

一旦显式告诉 `cloud-init` 不要再覆盖主机名，系统层的修改才真正能保留下来。

我会觉得，这类问题挺典型地说明了云环境下排障的一个特点：很多你以为是“操作系统问题”的行为，实际都已经被云初始化层重新定义了。

所以在云主机上做系统配置时，不能只盯着传统 Linux 配置文件，还得先想清楚：这个行为到底是不是已经被 `cloud-init` 这类上层初始化机制接管。

否则你会不断修改一个表面现象，却碰不到真正生效的那一层。
