重命名服务器或配置新机器时,保持主机名在日志、监控仪表板和网络记录中一致可以避免混乱。在基于 systemd 的 Linux 系统上,hostnamectl 是从命令行读取和设置主机名的标准工具,无需手动编辑 /etc/hostname。

本指南介绍如何使用 hostnamectl 查看和更改主机名及相关系统元数据。

语法

hostnamectl [OPTIONS] COMMAND

不带命令调用时,hostnamectl 会显示当前系统状态,等同于运行 hostnamectl status。

检查当前主机名

不带任何参数运行 hostnamectl 可显示完整的主机名状态:

hostnamectl
 Static hostname: ubuntu-server
       Icon name: computer-vm
         Chassis: vm
      Machine ID: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4
         Boot ID: f7e8d9c0b1a2f7e8d9c0b1a2f7e8d9c0
  Virtualization: kvm
Operating System: Ubuntu 26.04 LTS
          Kernel: Linux 6.14.0-14-generic
    Architecture: x86-64
 Hardware Vendor: QEMU
  Hardware Model: Standard PC (Q35 + ICH9, 2009)

输出显示了静态主机名、机箱类型、机器 ID 和启动 ID、虚拟化平台、操作系统以及内核版本。

要仅打印当前系统主机名,请使用 hostname 命令:

hostnamectl hostname

你也可以选择特定的主机名类型:

hostnamectl --static
hostnamectl --transient
hostnamectl --pretty

设置静态主机名

静态主机名是管理员配置的名称,存储在 /etc/hostname 中。它会在重启后保持不变。要仅更改此主机名,请运行:

sudo hostnamectl --static hostname web-server-01

系统主机名会立即更改,但现有的 shell 提示符可能仍会显示旧名称。打开一个新的终端会话以刷新提示符。

验证静态主机名:

hostnamectl --static
web-server-01

静态和瞬态主机名可以是单个 DNS 标签,例如 web-server-01,也可以是有效的完全限定域名,例如 web-server-01.example.com。Linux 内核将其限制为 64 个字符。

要同时设置静态、瞬态和美观主机名,请省略类型选项:

sudo hostnamectl hostname web-server-01

当前的 systemd 版本使用上面显示的 hostname 命令。较旧的版本和许多现有指南使用等效的 set-hostname 形式:

sudo hostnamectl set-hostname web-server-01

如果你使用的是较旧的发行版,请检查 hostnamectl --help。

设置美观主机名

美观主机名是一个自由格式、人类可读的标签,可以包含空格和大小写混合。它存储在 /etc/machine-info 中,供桌面环境和某些管理工具使用,而不是由内核或网络使用:

sudo hostnamectl --pretty hostname "Web Server 01"

静态主机名和美观主机名是独立的。你可以将它们设置为不同的值:

sudo hostnamectl --static hostname web-server-01
sudo hostnamectl --pretty hostname "Web Server 01 (production)"

了解主机名类型

hostnamectl 管理三种不同的主机名类型:

  • 静态:管理员配置的主机名,存储在 /etc/hostname 中。它会在重启后保持不变。
  • 瞬态:运行时回退名称,可能来自网络配置。当未设置有效的静态主机名时使用。
  • 美观:存储在 /etc/machine-info 中的自由格式标签。供桌面 shell 和某些管理工具使用。不用于网络通信。

仅设置瞬态主机名:

sudo hostnamectl --transient hostname temporary-node

设置机箱类型

机箱类型告诉系统工具和桌面环境这台机器是什么类型的硬件。要设置它:

sudo hostnamectl chassis server

有效的机箱类型有:desktop、laptop、convertible、server、tablet、handset、watch、embedded、vm 和 container。虚拟机使用 vm,容器环境使用 container。

机箱类型与美观主机名一起存储在 /etc/machine-info 中。

设置部署环境和位置

另外两个字段有助于在较大环境中标识机器:

sudo hostnamectl deployment production
sudo hostnamectl location "rack-3 / datacenter-ams"

两者都存储在 /etc/machine-info 中,并会出现在 hostnamectl 输出中。它们对系统行为没有影响,但对于读取机器元数据的库存和监控工具很有用。

管理远程主机或容器

-H 选项通过 SSH 对远程机器运行 hostnamectl。例如,以 admin 用户身份查询服务器:

hostnamectl -H admin@server.example.com status

使用 -M 操作本地 systemd 机器或容器:

hostnamectl -M web-container status

你的账户仍然需要连接目标并执行请求操作的权限。

主机名与网络配置

更改主机名不会创建或更新 DNS 记录。如果其他系统必须通过新名称访问该机器,请单独更新相关的 DNS 记录。

当 /etc/hosts 包含旧主机名的条目时,你可能还需要更新它。这可以避免期望系统主机名能够解析的工具出现本地名称解析错误。

在云实例上,cloud-init 或提供商元数据可能会在启动期间恢复之前的主机名。如果你的更改无法持久保留,请检查提供商设置以及 /etc/cloud/cloud.cfg 中的 preserve_hostname 选项。

故障排除

hostnamectl: command not found
该命令在基于 systemd 的发行版上可用。在使用其他 init 系统的系统上,请改用 hostname 命令并编辑平台的主机名配置文件。

Could not set property: Access denied
更改主机名或机器元数据需要管理权限。使用 sudo 运行命令,并确认你的账户被允许执行特权操作。

重启后旧主机名恢复
Cloud-init、DHCP 或其他配置服务可能正在重置它。请检查系统的云和网络配置,而不是反复更改主机名。

快速参考

任务命令
显示系统主机名详情hostnamectl
打印当前主机名hostnamectl hostname
打印静态主机名hostnamectl --static
仅设置静态主机名sudo hostnamectl --static hostname web-server-01
设置所有主机名类型sudo hostnamectl hostname web-server-01
设置美观主机名sudo hostnamectl --pretty hostname "Web Server 01"
设置瞬态主机名sudo hostnamectl --transient hostname temporary-node
设置机箱类型sudo hostnamectl chassis server
设置部署环境sudo hostnamectl deployment production
查询远程主机hostnamectl -H user@host status