关于 Linux 中的 hostname

今天碰到一个 gitlab-ci 构建出来的 rpm 包无法通过校验的问题,显示构建出 rpm 包的机器非法。

在我登录 gitlab-runner 机器后,发现 /etc/hostname 中是合法的,诡异的是,通过 rpm -qp --qf "%{BUILDHOST}" $file 查询后发现 rpm 中的 buildhost 跟构建的 runner 机器的确不一致。

经过查询后,发现原来 linux 中的 hostname 也有一些门道,特地记录下来。

1. 背景

hostname 是 Linux 主机名,用于在网络中标识机器。在登陆 Linux 系统后,在提示符前面会有类似 [root@izm5e9z5o9dc8yjs3vh5mhz ~] 的字符串,其中 @ 后面的就是 hostname,我们也可以通过 hostname 来判断登陆的机器。

hostname 有下面三类(来源 man hostname):

  • static hostname:日常所称的主机名(traditional hostname)。最多为64个字符,仅可包含“.”、“_”、“-”、“a-z”、“A-Z”和“0-9”这些字符,并且不能以“.”打头和结尾,也不能两个“.”连续。
  • transient hostname:内核维护的动态主机名,初始化为“static”主机名,默认为 localhost。也为 hadoop 要求的主机名,它的约束规则同“static”主机名。如果存在“static”主机名,且不是“localhost”,那么将忽略“transient”主机名。“transient”主机名可被 DHCP 和 mDNS 修改。
  • pretty hostname:UTF8格式的主机名,这个仅供阅读,长度无限制。

系统的 hostname 我们可以通过 hostnamectl status 查看,当三种类型一致时,只显示 static hostname。

[root@wanctl ~]# hostnamectl status
   Static hostname: wanctl
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 5bf107be284c4452ad4639767f658c9e
           Boot ID: 67a0c39b38f246ff857adbc0457ff04d
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.el7.x86_64
      Architecture: x86-64

2. 修改 pretty hostname

因为这个只影响显示,对系统无任何其它影响,可以用 hostnamectl 来修改。

[root@wanctl ~]# hostnamectl --pretty set-hostname test
[root@wanctl ~]# hostnamectl status
   Static hostname: wanctl
   Pretty hostname: test
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 5bf107be284c4452ad4639767f658c9e
           Boot ID: 67a0c39b38f246ff857adbc0457ff04d
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.el7.x86_64
      Architecture: x86-64

3. 修改 transient hostname

我们一般都是用 hostname 命令来查看系统的主机名,其实查看的是 transient hostname。同样的,它也可以用来修改 transient hostname。

[root@wanctl ~]# hostname
wanctl
[root@wanctl ~]# hostname transient
[root@wanctl ~]# hostname
transient
[root@wanctl ~]# hostnamectl status
   Static hostname: wanctl
Transient hostname: transient
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 5bf107be284c4452ad4639767f658c9e
           Boot ID: 67a0c39b38f246ff857adbc0457ff04d
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.el7.x86_64
      Architecture: x86-64

4. 修改 static hostname

有两种方式,一种是修改 /etc/hostname。需要注意的是有些 Linux 发行版没有这个文件。

[root@wanctl ~]# hostnamectl status
   Static hostname: wanctl
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 5bf107be284c4452ad4639767f658c9e
           Boot ID: 67a0c39b38f246ff857adbc0457ff04d
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.el7.x86_64
      Architecture: x86-64
[root@wanctl ~]# cat /etc/hostname 
wanctl

另外一种就是通过 hostnamectl 修改。

[root@test ~]# hostnamectl set-hostname test
[root@test ~]# cat /etc/hostname 
test
[root@test ~]# hostnamectl status
   Static hostname: test
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 5bf107be284c4452ad4639767f658c9e
           Boot ID: 67a0c39b38f246ff857adbc0457ff04d
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.el7.x86_64
      Architecture: x86-64

这条命令会删除 /etc/hostname 文件中的主机名,然后替换为新的主机名。

5. 总结

上面我们尝试了几种修改 hostname 的方式,这些方式还是存在一些区别的,差异如下:

方法 效果
hostname 当次登录临时有效,新登录或重新登录后无效
hostnamectl 系统重启之前一直有效,重启后无效
/etc/hostname 只有在系统重启后才有效