hostnamectl set-hostname 是 CentOS 7 推荐方式,直接写入 /etc/hostname 并同步内核状态,无需重启;需同步更新 /etc/hosts,确保 FQDN 解析正常,并检查 systemd-hostnamed 服务状态。
这是 CentOS 7 推荐且最稳妥的方式,直接写入 /etc/hostname 并同步内核状态,无需重启系统即可对多数服务生效。
执行命令:sudo hostnamectl set-hostname myserver.example.com(注意:不支持下划线、空格、中文;建议用小写字母、数字、短横线和点)
hostname 和 hostnamectl --static 都能返回新值/etc/hostname 文件,无需手动编辑--transient 或 --pretty,其他服务可能仍读取静态名,应避免单独设置node1.cluster.local),而非单纯 node1
仅改主机名不改 /etc/hosts,会导致 java.net.UnknownHostException: master1ha 这类错误,尤其在 Hadoop、Spark、MySQL 等服务启动时频繁出现。
打开文件:sudo vi /etc/hosts,找到含原主机名的那一行(通常是 127.0.0.1 localhost.localdomain localhost),在该行末尾追加新主机名和可选的 FQDN:
127.0.0.1 localhost.localdomain localhost myserver.example.com myserver
localhost 条目,否则本地回环解析可能异常127.0.0.1 的内网 IP(如 192.168.10.5),需对应写入,用于集群节点间直连解析hostnamectl 依赖 systemd-hostnamed 服务维持 transient 主机名与 static 的同步。如果该服务未运行,hostname 命令可能返回旧值,而 hostnamectl --static 正确 —— 这种不一致容易误判修改失败。
systemctl is-active systemd-hostnamed,应返回 active
inactive,执行:sudo systemctl start systemd-hostnamed 并启用开机自启:sudo systemctl enable systemd-hostnamed
sysctl kernel.hostname=xxx 单独设 transient 名——它绕过 systemd 管理,易与 static 名冲突在 Hadoop/YARN/ZooKeeper/Kubernetes 节点上改主机名,不只是改名字的事。配置文件、证书 CN、SSH known_hosts、服务注册中心里的节点标识全得跟着动。
hdfs、yarn、zookeeper 全部进程core-site.xml 的 fs.defaultFS、yarn-site.xml 的 yarn.resourcemanager.hostname
~/.ssh/known_hosts 会因主机名变更报错,需手动清理对应行或用 ssh-keygen -R myserver.example.com
真正麻烦的不是改名动作本身,而是改完之后那些没显式声明、却隐式依赖主机名的服务和配置——它们往往在你认为“已经搞定”的时候突然报错。