hostname 文件中配置的主机名被 DHCP 主机名选项覆盖
如果 Cumulus Linux 交换机收到包含 hostname 选项的 DHCP 租约,则收到的 DHCP 主机名将覆盖在 `/etc/hostname` 中应用的任何主机名。
问题
在 Cumulus Linux 中通过 `/etc/hostname` 更改系统主机名在以下情况下无效:存在包含主机名选项的活动 DHCP 租约,或者活动 DHCP 服务器继续在分配的租约中提供主机名选项。
环境
- Cumulus Linux 2.5.x 及更高版本
- 活动 DHCP 租约包含主机名选项,缓存在 `/var/lib/dhcp/dhclient.eth0.leases` 中,和/或 DHCP 服务器提供包含主机名选项的租约
- `/etc/dhcp/dhclient.conf` 中的 DHCP 客户端配置包含默认参数 `send host-name` 和 `request host-name`
原因
当运行 Cumulus Linux 的交换机在管理端口 eth0 上获得 DHCP 租约,并且您尝试通过编辑 `/etc/hostname` 更改主机名时,可能会发生这种情况。
如果您尝试重启交换机以更改为在 `/etc/hostname` 中配置的新主机名,而之前的 DHCP 租约仍然有效,则缓存在交换机本地 `/var/lib/dhcp/dhclient.eth0.leases` 中的 DHCP 主机名选项和/或从活动 DHCP 服务器接收的主机名选项将覆盖在 `/etc/hostname` 中手动配置的名称。
请注意,即使 DHCP 服务器未显式配置为提供包含主机名选项的租约,它也可能继续发送在 `/etc/hostname` 中配置的交换机主机名的先前版本,因为 Cumulus Linux 默认在 `/etc/dhcp/dhclient.conf` 中启用了 `send-hostname` 选项。这会导致交换机在 DHCP Discover 和 Request 消息中发送本地配置的主机名。DHCP 服务器可能会缓存此值,并在后续 DHCP 租约中继续将其提供回交换机,只要原始租约处于活动状态,这就会覆盖对交换机上的 `/etc/hostname` 所做的任何新更改。
解决方案
您有两种方法可以解决此问题。您可以配置 `dhclient.conf` 以
- 覆盖从 DHCP 收到的主机名选项
- 不在 DHCP Discover 和 Request 数据包中请求主机名选项
覆盖主机名选项
在 `/etc/hostname` 中配置所需的主机名后,将以下行添加到 `/etc/dhcp/dhclient.conf` 中,以使用在 `/etc/hostname` 中配置的所需主机名覆盖从 DHCP 收到的任何主机名选项
supersede host-name "configured-hostname";
不请求主机名选项
如果需要,您可以配置 `/etc/dhcp/dhclient.conf` 以不在 DHCP Discover 和 Request 数据包的参数请求列表 [选项 55] 中请求主机名选项。
为此,请编辑 `/etc/dhcp/dhclient.conf` 并从 Request 选项列表中删除 `host-name`,如此处突出显示
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search, host-name,
dhcp6.name-servers, dhcp6.domain-search,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers, cumulus-provision-url;