今天碰到一个 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 | 只有在系统重启后才有效 |