hostnamectl set-hostname 是 systemd 系统唯一推荐的永久改名方式,但必须同步更新 /etc/hosts 中对应条目(如 127.0.1.1 或 127.0.0.1 new-hostname),否则 sudo、ssh 等会因解析失败报错;旧系统(如 centos 6)还需修改 /etc/sysconfig/network 并重启。

hostnamectl set-hostname 是现代 Linux(systemd 系统)唯一推荐的永久修改方式,它会自动写入 /etc/hostname 并刷新内核静态主机名。只运行这条命令不改其他文件,重启后仍可能出问题——常见报错如 sudo: unable to resolve host new-hostname 或 SSH 登录警告,根源几乎全是 /etc/hosts 没同步。
为什么 hostnamectl set-hostname 之后还要手动改 /etc/hosts
因为 hostnamectl 不碰 /etc/hosts。而 sudo、ssh、systemd 服务启动时会调用 gethostname(),再通过 libc 查找本地解析,若 /etc/hosts 中没有对应条目,就会 fallback 到 DNS 或直接失败。
典型错误现象:
• 执行 sudo 时提示 unable to resolve host new-hostname
• ssh localhost 报 Could not resolve hostname new-hostname
• journalctl 日志里反复出现解析失败记录
必须确保 /etc/hosts 中至少有一行把新主机名映射到本地地址(通常是 127.0.1.1 或 127.0.0.1),且不能和 localhost 冲突。
/etc/hosts 里该改哪一行?Debian/Ubuntu 和 RHEL/CentOS 的区别
不同发行版默认写法不同,不能一概替换:
- Debian/Ubuntu 系统通常在安装时生成
127.0.1.1 old-hostname行,这是专为非网络接口主机名设计的,应只改这一行中的主机名部分,保留127.0.1.1不变 - RHEL/CentOS 7+ 默认不写
127.0.1.1,而是依赖127.0.0.1 localhost,但很多服务(如zabbix-agent)仍会尝试解析全名,所以建议显式加一行:127.0.0.1 new-hostname - 无论哪种系统,都必须保留原始的
127.0.0.1 localhost行,删掉会导致localhost解析失败 - 不要添加重复 IP 映射(例如同一 IP 同时指向多个主机名),glibc 解析行为不稳定
旧系统(CentOS 6、SysVinit)必须改 /etc/sysconfig/network
systemd 出现前,RHEL/CentOS 6 及更早版本完全依赖 /etc/sysconfig/network 中的 HOSTNAME= 变量。仅改 /etc/hostname 或用 hostname 命令,重启后一定还原。
- 编辑该文件:
sudo nano /etc/sysconfig/network - 确认存在且启用:
NETWORKING=yes - 设置或修改:
HOSTNAME=new-hostname(等号前后无空格) - 保存后立即生效需配合:
sudo hostname -F /etc/sysconfig/network(注意:这不是标准用法,实际应先读取变量再设,稳妥做法是改完后 reboot)
验证三处是否一致,缺一不可
改完别急着关终端,立刻检查这三项是否全部匹配新主机名:
- 当前内核名:
hostname输出应为新名 - 持久化配置:
cat /etc/hostname应只有一行、无空格、无换行 - 本地解析:
grep "$(hostname)" /etc/hosts必须有输出,且 IP 部分是127.0.0.1或127.0.1.1
任意一项不一致,就说明某处漏了。最常被跳过的其实是 /etc/hosts —— 它不报错、不阻断命令执行,但会在后台持续引发权限、日志、服务通信类隐性故障。











