永久修改主机名需同步更新/etc/hostname、/etc/hosts及(旧版RHEL/CentOS)/etc/sysconfig/network三处;推荐用hostnamectl set-hostname(systemd系统),但需手动修正/etc/hosts映射,否则引发sudo解析失败等问题。

改主机名不是执行一条 hostname 就完事的——那只是临时改,重启就丢。真正要永久生效,必须同步更新至少三个地方:/etc/hostname、/etc/hosts,以及(对旧版 RHEL/CentOS)/etc/sysconfig/network。漏掉任何一个,都可能引发 sudo: unable to resolve host xxx、SSH 连接警告、服务启动失败等问题。
用 hostnamectl set-hostname 是最省事的方式(systemd 系统)
适用于 Ubuntu 16.04+、CentOS 7+、Debian 9+ 等所有基于 systemd 的发行版。它会自动写入 /etc/hostname 并通知内核,但不会碰 /etc/hosts ——这点必须手动补上。
- 执行命令:
sudo hostnamectl set-hostname web-prod-01 - 验证是否写入配置:
cat /etc/hostname应只输出web-prod-01(无空格、无换行) - 检查内核当前值:
hostnamectl status | grep "Static hostname",确认已更新 - ⚠️ 重点:
/etc/hosts仍需手动编辑,否则sudo和很多服务会报解析失败
/etc/hosts 不同步,sudo 就会报错
系统依赖 gethostname() 获取名称后,再查 /etc/hosts 做本地解析。如果里面还留着旧主机名,或新主机名没映射到 127.0.1.1(Debian/Ubuntu)或 127.0.0.1(RHEL/CentOS),就会出问题。
- 打开文件:
sudo nano /etc/hosts - 找到类似这行:
127.0.1.1 old-hostname或127.0.0.1 old-hostname - 把
old-hostname替换成你设的新名,例如:127.0.1.1 web-prod-01 - 保留原始的
127.0.0.1 localhost行不变 - Debian/Ubuntu 系统优先用
127.0.1.1映射主机名;RHEL/CentOS 通常用127.0.0.1,但两者都接受
旧版 CentOS 6 或 SysVinit 系统必须改 /etc/sysconfig/network
这类系统不走 systemd,hostnamectl 命令不存在,/etc/hostname 虽然存在但不会被网络脚本读取——真正起作用的是 /etc/sysconfig/network 中的 HOSTNAME= 行。
- 编辑该文件:
sudo nano /etc/sysconfig/network - 确保有且仅有一行:
HOSTNAME=web-prod-01(等号前后不能有空格) - 没有这行?直接添加;有旧值?覆盖掉
- 改完后建议运行:
sudo service network restart(部分版本需此步才生效) - 别忘了同样要同步
/etc/hostname和/etc/hosts,三者缺一不可
最容易被忽略的其实是 /etc/hosts 里的映射细节:比如用了 127.0.0.1 却在 Debian 上部署,或者新主机名里混进了下划线(_)——Linux 主机名只允许字母、数字和连字符(-),其他字符会导致 DNS 解析异常或服务拒绝启动。


















