背景:我正在构建一个由一个主节点和多个计算节点组成的 slurm 集群,所有节点都通过 PXE 启动。它们最初没有主机名,并且由于它们可能在不同的硬件上运行,因此 NIC 的名称可能无法预测,因此它们没有被配置,例如在/etc/network/interfaces
.
我在启动过程中设置主机名,如下所示:
root@zorn:/lib/systemd/system# cat /lib/systemd/system/sethostname.service
[Unit]
Wants=network-pre.target
Before=network-pre.target
After=local-fs.target
DefaultDependencies=false
[Service]
Type=oneshot
ExecStart=/usr/bin/sethostname
RemainAfterExit=yes
[Install]
WantedBy=network.target
使用 /usr/bin/sethostname:
root@zorn:/lib/systemd/system# cat /usr/bin/sethostname
#!/usr/bin/bash
hnm=node$(/usr/bin/cat /sys/class/net/*/address | /usr/bin/head -1 | /usr/bin/sed 's/://g')
echo $hnm > /proc/sys/kernel/hostname
echo $hnm > /etc/hostname
根文件系统通过 NFS 进行 R/O 挂载,/etc/hostname
本地磁盘上的文件的符号链接也是如此。
到目前为止,一切都很好;当我启动无盘节点时,主机名设置为如下所示node6c2408faee43
:
root@node080027aea419:~# hostnamectl
Static hostname: node080027aea419
Icon name: computer-vm
Chassis: vm
答案1
基本上,@AB 在评论中已经回答了这个问题,但我会将其添加为答案,以便可以将其标记为“已解决”。
这个问题实际上源于这样一个事实:系统启动时,内核通过 NFS 以只读方式挂载了根目录;为此,内核从 DHCP 服务器请求 IP 地址,如下所示(来自grub.cfg
):
menuentry 'Debian 12' {
set background_color=black
linux /debian12/boot/vmlinuz-6.1.0-9-amd64 console=tty0 console=ttyS0 ip=dhcp root=/dev/nfs ro nfsroot=192.168.50.111:/image/debian12,vers=3,nolock panic=60 ipv6.disable=1 rootwait
initrd /debian12/boot/initrd.img-6.1.0-9-amd64
}
内核命令行ip=dhcp
上的 意味着网络在启动之前就已经设置好了systemd
;这就是为什么设置主机名不向 DHCP 和 DDNS 注册的原因。
现在,要使系统在 DDNS 服务器上注册主机名,必须激活周围某处的接口network.target
,但由于这是一台无盘服务器,无法确切知道存在哪些网卡,因此尚未在其中设置接口/etc/network/interfaces
。解决这个问题的一种方法可能是:
root@zorn:/etc/network# cat /etc/network/interfaces
auto /enp*=eth
iface eth inet dhcp
这假设 NIC 的名称以 开头enp
,这似乎是常见的 ATM,并且它适用于我的简单测试系统。我们希望当有多个设备时它也能工作,并且它只会配置物理连接的那个。