无盘服务器:为什么我的服务脚本在网络设置后运行?

无盘服务器:为什么我的服务脚本在网络设置后运行?

背景:我正在构建一个由一个主节点和多个计算节点组成的 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,并且它适用于我的简单测试系统。我们希望当有多个设备时它也能工作,并且它只会配置物理连接的那个。

相关内容