hostname命令仅临时修改主机名,重启失效;永久生效需改/etc/hostname并运行hostnamectl set-hostname,同时同步更新/etc/hosts中127.0.1.1对应行。

hostname 命令只能临时改名,重启就失效
直接运行 hostname newname 确实能立刻看到主机名变化,但这是在内核的 UTS namespace 里改的,不写入任何配置文件。只要系统重启、或者某些服务(比如 systemd-hostnamed)重载,就会读回旧值。这不是 bug,是设计如此——hostname 本身定位就是运行时调试工具。
常见错误现象:hostname 输出已变,但 ssh user@oldname 还能连,或 ps aux | grep oldname 仍匹配到进程,说明很多程序启动时已缓存了原始主机名,不会自动刷新。
/etc/hostname 文件控制 systemd 系统的永久主机名
现代 Linux(systemd 系统)以 /etc/hostname 为准。它只存一行纯文本,不能带空格或点号以外的特殊字符(如 my-host_1 合法,my host 非法)。
- 用
sudo tee /etc/hostname <<< "myserver"写入(比echo >更安全,避免权限失败) - 改完后必须运行
sudo systemctl restart systemd-hostnamed或sudo hostnamectl set-hostname myserver(后者会自动同步写文件+通知服务) - 验证是否生效:
hostnamectl status查看 “Static hostname” 字段,不是hostname命令输出
/etc/hosts 里那行必须同步更新,否则 SSH 和本地解析会出问题
/etc/hosts 不决定主机名,但很多程序(如 OpenSSH、Python 的 socket.gethostname())在获取 FQDN 时会查它。如果里面还写着 127.0.1.1 oldname,即使 /etc/hostname 已改,ssh user@localhost 可能仍解析成旧名,curl http://localhost 也可能被某些代理拦截。
操作建议:
- 找到形如
127.0.1.1.*oldname的行(注意不是127.0.0.1那行) - 把它改成
127.0.1.1 myserver.local myserver(推荐加 .local 后缀,避免和公网域名冲突) - 改完不用重启,但建议执行
getent hosts myserver确认解析正确
hostnamectl 是唯一推荐的交互方式,别手写多个文件
手动编辑 /etc/hostname 和 /etc/hosts 容易漏掉一个,或格式出错(比如多空格、没换行)。hostnamectl 会原子化处理:写文件 + 通知内核 + 刷新 DNS 缓存(部分发行版)。
典型流程:
-
sudo hostnamectl set-hostname --static myserver(--static 是默认模式,可省略) -
sudo hostnamectl set-hostname --transient myserver-temp(仅当前会话,调试用) - 若需设 FQDN,用
sudo hostnamectl set-hostname myserver.example.com,然后确保 DNS 或/etc/hosts能解析该域名
注意:hostnamectl 不动 /etc/hosts —— 它只管主机名逻辑层,FQDN 解析仍得你手动配。这点最容易被忽略,导致改完名却连不上本地服务。


















