老实说,修改Linux主机名用到的命令本身不算复杂,真正容易踩坑的地方在于修改完成后系统是否识别、重启之后配置能否保留,还有你当前账号是否具备对应的操作权限。使用免费Linux主机时很多人第一步就卡住,这类免费环境大多不会开放root权限,或者本身属于容器实例,主机名并不由使用者管控。
先不要直接执行修改操作,打开终端查看当前状态。输入hostname,输出内容就是当前主机名。再执行hostnamectl,如果系统版本是CentOS 7、Ubuntu 16.04及更新版本,一般可以查看静态主机名、瞬态主机名这类信息。没有hostnamectl工具不代表无法修改,只能说明系统版本老旧,或是精简容器环境。顺带执行cat /etc/hostname读取文件内容,很多场景下命令输出的名称和文件内记录并不一致。

如果只是临时调整,仅当前会话生效,比如为了方便测试脚本,避免旧主机名带来干扰,直接执行sudo hostname 新名字即可。这个改动会立刻生效,但系统重启之后配置就会丢失。部分服务启动阶段会读取原有主机名,临时修改之后可能造成服务异常,不能把临时修改当作永久方案。
想要永久修改,现代Linux系统基本依靠hostnamectl工具。执行sudo hostnamectl set-hostname 新名字,系统会自动将新名称写入/etc/hostname。但这里有个很容易忽略的后续操作,需要进入/etc/hosts文件替换旧主机名。Debian和Ubuntu系统通常存在一行127.0.1.1 旧名字记录,要把旧名称替换成新名称,至少保证新主机名可以完成本地解析。不然后续执行sudo命令会长时间卡顿,弹出unable to resolve host提示,出现这个提示本质就是hosts文件没有同步更新。老旧的CentOS 6或者部分定制系统,需要修改/etc/sysconfig/network内的HOSTNAME=参数,修改完成重启系统才能生效。还有部分系统可以运行hostname -F /etc/hostname,直接从配置文件重载主机名。
免费Linux主机需要单独区分场景。如果你使用共享虚拟主机,大多只有面板权限,能够修改的一般只是站点名称、账户展示名称,并不是系统层面的主机名。cPanel、DirectAdmin这类面板里的主机名选项,通常只能由服务商后台调整。免费VPS或者免费容器虽然开放SSH访问,但要确认虚拟化类型。OpenVZ这类容器环境执行hostnamectl可能直接报错,主机名由宿主机内核统一管理。Docker容器可以临时执行hostname 新名字修改,但容器重启就恢复原始名称,正确做法是启动容器时在docker run命令添加--hostname参数,或者在compose配置文件填写hostname字段。Kubernetes环境下的Pod更为特殊,主机名默认跟随Pod名称,想要修改要在spec配置段声明。
cloud-init也是一个常见坑点。不少云主机首次启动会根据元数据自动配置主机名,手动修改完毕重启,主机名又被重置。遇到该情况,可以查看/etc/cloud/cloud.cfg配置,检查preserve_hostname参数,将它设置为true,也可以新建/etc/cloud/cloud.cfg.d/99_preserve_hostname.cfg文件写入对应配置。不过并不是所有免费云平台都支持这个配置,部分平台强制重置主机名,这种情况只能去控制台查找主机名设置项,或者接受现状。
修改主机名不只是更改一个显示文本。主机名尽量只用字母、数字和连字符,不要使用下划线,长度不宜过长,需要的话填写FQDN格式会更加规范。修改完成之后,邮件服务、数据库主从、监控系统、SSL证书、集群节点发现这些组件,都有可能因为主机名变更出现异常。稳妥的校验方式,先用hostname查看当前主机名,hostnamectl status查看静态主机名,cat /etc/hostname和cat /etc/hosts核对文件内容,接着重启系统再次确认。免费主机没有权限修改时,不要强行改动系统文件,优先查阅服务商文档或者提交工单咨询,很多时候不是技术层面问题,而是套餐本身没有开放这项权限。