systemd-hostnamed 是 Linux 系统中 systemd 组件套件的一部分,它是一个系统守护进程(Daemon)。它的主要职责是管理系统的主机名(Hostname)以及相关的机器元数据。它提供了一个 D-Bus 接口,允许其他程序查询或修改主机名,而用户通常通过命令行工具 hostnamectl 与之交互。
核心功能:三种主机名
systemd-hostnamed 的一个重要特性是它区分了三种不同类型的主机名,以适应不同的使用场景:
-
静态主机名 (Static hostname):
- 存储位置:
/etc/hostname
- 用途: 系统启动时初始化的主机名,由系统管理员配置。它是最
传统的主机名,通常用于内核网络配置。
- 限制: 必须符合互联网域名标准(只能包含小写字母、数字、短划线
-,且不能包含空格)。
-
瞬态主机名 (Transient hostname):
- 来源: 通常由网络配置(如 DHCP 或 mDNS 服务器)动态分配。
- 用途: 如果静态主机名未设置或无效(如
localhost),或者网络环境要求特定的主机名,系统会使用这个名字。
- 特点: 它是临时的,重启后可能会丢失。
-
宜读主机名 (Pretty hostname):
- 存储位置:
/etc/machine-info
- 用途: 专门为了在用户界面(UI)中展示而设计。
- 特点: 不受严格的字符限制。你可以使用大写字母、空格、特殊符号甚至 UTF-8 字符(例如:
张三的 MacBook Pro)。这让桌面环境展示更友好的设备名称。
管理机器元数据 (Machine Info)
除了主机名,systemd-hostnamed 还管理 /etc/machine-info 文件中的其他元数据,帮助应用程序了解系统运行在什么样的硬件上:
- Chassis (机箱类型): 描述设备的物理形态,如
desktop (台式机), laptop (笔记本), server (服务器), tablet (平板), vm (虚拟机), container (容器) 等。
- Deployment (部署环境): 如
development (开发), integration (集成), production (生产)。
- Location (位置): 设备的物理位置描述。
- Icon Name: 用于图形界面显示的图标名称。
hostname 约定
- Linux 主机名长度限制是
63 个字符
- 该限制是由
Internet Assigned Numbers Authority (IANA) 定义的,它规定主机名需满足:
小写字母、数字、连字符(-)的组合
- 且以
小写字母或数字开头,以小写字母、数字或连字符结尾
- 支持大写字母,但不推荐
- 如果主机名是通过域名系统 (DNS) 解析的,它的长度还受到 DNS 协议的限制(一般为 255 个字符)
如何使用 (hostnamectl)
虽然 systemd-hostnamed 是后台服务,但用户主要通过 hostnamectl 命令来控制它。
查看状态:
输出示例:
# 查看主机名信息,等价于 hostnamectl status
$ hostnamectl
Static hostname: cn-xiexianbin
Icon name: computer-vm
Chassis: vm
Machine ID: 62a45cd2213b47fe9d63b63df55297dd
Boot ID: 415fb68e374045a09bc9815f4bf46e0a
Virtualization: vmware
Operating System: Ubuntu 20.04.5 LTS
Kernel: Linux 5.15.0-82-generic
Architecture: x86-64
# 瞬态的主机名
hostnamectl status --transient
# 静态的主机名
hostnamectl status --static
# 易读的主机名
hostnamectl status --pretty
设置主机名:
# 同时设置静态、瞬态和宜读主机名(如果名字符合标准),会写入 /etc/hostname
sudo hostnamectl set-hostname cn-xiexianbin
# 单独设置宜读主机名(支持空格和特殊字符)
sudo hostnamectl set-hostname --pretty "My Awesome Laptop"
设置机箱类型:
sudo hostnamectl set-chassis laptop
工作机制与 D-Bus
- 按需启动:
systemd-hostnamed 不是一直运行的。它是 D-Bus 激活的。当你输入 hostnamectl 命令时,系统会通过 D-Bus 唤醒该服务;当操作完成且一段时间无活动后,它会自动停止以节省资源。
- 权限控制: 修改主机名是特权操作。该服务利用 Polkit (PolicyKit) 来验证用户权限。这就是为什么在非 root 用户下执行修改操作时,系统会弹窗或提示输入密码。
- 同步更新: 当你通过它修改静态主机名时,它会自动更新
/etc/hostname 文件,并调用内核系统调用(sethostname)立即应用更改,无需重启。
文件关联
该服务主要读写以下文件:
/etc/hostname: 存放静态主机名。
/etc/machine-info: 存放宜读主机名和机器元数据(如 ICON_NAME, CHASSIS 等)。
总结
systemd-hostnamed 是现代 Linux 发行版(如 Ubuntu, CentOS 7+, Fedora, Debian 8+)中标准化的主机名管理方案。它解决了传统 Linux 中主机名修改混乱(需要手动改文件、重启才生效)的问题,并为图形化桌面环境提供了更丰富的设备描述能力。