hostnamectl

systemd的 hostnamectl 工具提供了服务器主机名的管理修订功能,并且提供了对主机常用信息的清晰提取

基本使用

  • 不带任何参数执行 hostnamectl 可以输出主机的关键信息:

Fedora 35 执行hostnamectl输出信息
 Static hostname: z-dev
       Icon name: computer-vm
         Chassis: vm
      Machine ID: 784e41a278df4e3e804b451ac3bb4c3e
         Boot ID: 9a0f2544a26843e99c23bc75217602ad
  Virtualization: kvm
Operating System: Fedora Linux 35 (Server Edition)
     CPE OS Name: cpe:/o:fedoraproject:fedora:35
          Kernel: Linux 6.0.5-100.fc35.x86_64
    Architecture: x86-64
 Hardware Vendor: QEMU
  Hardware Model: Standard PC _Q35 + ICH9, 2009_

可以看到 hostnamectl 输出信息包括了:

  • 主机是物理主机还是虚拟机,虚拟化技术类型( KVM Atlas )

  • 硬件架构( x86_64 )以及硬件厂商信息(对于虚拟机也会提供相应信息)

对于物理主机,例如在 HPE ProLiant DL360 Gen9服务器 上运行的 Ubuntu Linux 执行 hostnamectl 输出案例:

Ubuntu 22.04 hostnamectl 执行输出信息
 Static hostname: zcloud
       Icon name: computer-server
         Chassis: server
      Machine ID: 63189bc6f6c149598d5bef3afa0cbf40
         Boot ID: 583e2aa549dd403b877a5e434d5b7640
Operating System: Ubuntu 22.04.1 LTS
          Kernel: Linux 5.15.0-52-generic
    Architecture: x86-64
 Hardware Vendor: HP
  Hardware Model: ProLiant DL360 Gen9

持久化设置

  • 对于主机名配置的持久化设置(也就是重启服务器不变的配置),需要使用 --static 参数来执行 set-hostname 命令:

    hostnamectl --static set-hostname zcloud.staging.huatai.me
    
  • 显示当前静态主机名:

    hostnamectl --static
    

则显示:

zcloud.staging.huatai.me

此时检查 /etc/hostname 可以看到内容被替换成:

zcloud.staging.huatai.me

附加信息(Supplementary settings)

上述 hostnamectl 输出的主机基本信息是操作系统安装默认生成的一些配置信息。此外, Systemd进程管理器 还在 hostnamectl 标准化配置上提供了一些对于主机管理有用的信息记录位于 /etc/machine-id 。不过, machine-id 不是默认生成的,需要通过一些指令来修改(直接生成也行),可以帮助系统管理员管理大量的数据中心服务器,来构建CMDB(配置管理)

  • 设置 pretty hostname:

    hotnamectl --pretty set-hostname "Priv Cloud Infra - ZCloud"
    

装饰主机名(pretty hostname)可以为主机名添加有用的附加信息,此时 cat /etc/machine-info 可以看到:

PRETTY_HOSTNAME="Priv Cloud Infra - ZCloud"
  • 设置主机图标(icon-name):

    hostnamectl set-icon-name linux-vm
    

对于物理主机,可以设置:

hostnamectl set-icon-name computer-server
  • 设置主机底盘(chassis):

    hostnamectl set-chassis vm
    

对于物理主机,可以设置:

hostnamectl set-chassis server
  • 设置主机部署(development, staging, production),这里设置为 staging 环境:

    hostnamectl set-deployment staging
    

也就是在 /etc/machine-info 中添加了:

DEPLOYMENT=staging
  • 设置主机安装位置(可以设置为机房,机架,机位信息):

    # 这里我杜撰一个机位信息,实际可以根据公司机房机位命名规则设置这个信息,方便程序解析
    hostnamectl set-location "R00.C1-1.SH"
    
  • 最终完成检查,可以 cat /etc/machine-info 看到类似如下信息:

    PRETTY_HOSTNAME="Priv Cloud Infra - ZCloud"
    DEPLOYMENT=staging
    LOCATION=R00.C1-1.SH
    

machine-id

在使用 hostnamectl 输出主机信息的时候,你可能会注意到有一个 machine-id 类似:

Machine ID: 63189bc6f6c149598d5bef3afa0cbf40

这是 /etc/machine-id 文件的内容,是安装或引导期间设置的本地系统的唯一机器ID(以换行符结尾的十六进制32个字符的小写ID)

Systemd进程管理器 和 dbus 都使用这个 machine-id 来跟踪机器ID,并且历史原因 /var/lib/dbus/machine-id 是软连接到 /etc/machine-id 上(实际文件是 /etc/machine-id )

machine-id 的目的是为主机(或者更准确说是操作系统安装)提供唯一标识符,在网络中每个主机都应该有唯一的 machine-id : 如果多台主机的 machine-id 相同,会出现非常奇怪的现象。

machine-id 的用途:

  • 创建 DHCP 主机标识符(可能导致多台机器争夺 DHCP 服务器上的同一 IP 地址)

  • systemd-boot EFI 引导加载程序将操作系统安装的内核存储在以机器 ID 命名的目录中,以防止冲突

  • clone系统时会生成新的 machine-id

chroot和容器通常没有systemd和sysvinit,但是建议为其配置 machine-id 以做区分

参考