当有多个网络接口时,linux 使用 pxe 会冻结

当有多个网络接口时,linux 使用 pxe 会冻结

我已经使用 virtualbox 设置了 2 个虚拟机:

  1. 第一个(此后命名为服务器)充当 dhcp(isc-dhcp-server)和 tftp(atftpd)服务器
  2. 另一台(此后称为“客户端”)是无盘计算机。

客户端的启动过程从 syslinux 开始,它加载一个 Linux 内核并向其传递参数initrd=ram_test.img nfsroot=10.0.0.1:/srv/nfsroot/stretch,rw ip=dhcp rw

计算机被定义为 64 位计算机,服务器在 Debian 稳定版上启动,并且客户端也提供 Debian 稳定版来启动。

当客户端只有 1 个网络接口(内部网络,“intel pro/100MT Desktop (8254OEM)”卡类型)时没有任何问题,但是当我添加另一个相同类型、具有不同 MAC 地址的接口时,一切正常,直到 linux 尝试获取 DHCP 地址。

此时,系统在“随机:快速初始化完成”这句话上冻结。在此之前我能看到的其他东西,可能更有趣的是:

e1000: enp0s8 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
IPv6: ADDRCONF(NETDEV_CHANGE): enp0s8: link becomes ready
IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready
IP-Config: no response after 2 secs - giving up
IP-Config: enp0s3 hardware address 08:00:27:2a:1a:3b mtu 1500 DHCP
IP-Config: enp0s8 hardware address 08:00:27:5f:de:30 mtu 1500 DHCP

冻结后,323 秒后,只剩下“随机:crng init done”。

这是 dhcpd.conf:

allow booting;
allow bootp;
subnet 10.0.0.0 netmask 255.255.255.0 {
  #range: 10.0.0.0xC0/26
  range 10.0.0.192 10.0.0.250;
  option broadcast-address 10.0.0.255;
  option routers 10.0.0.1;
  filename "tftp://10.0.0.1/pxelinux.0";
}

为了使它正常工作(至少只有 1 个界面),我必须修改文件/srv/nfsroot/stretch/etc/initramfs-tools/initramfs.conf使其看起来像这样(删除注释和空行):

MODULES=netboot
BUSYBOX=auto
KEYMAP=fr
COMPRESS=gzip
DEVICE=eth0
NFSROOT=auto
BOOT=nfs

我认为问题出在 syslinux 配置中提供给内核的参数,或者initramfs.conf但我找不到失败的确切点,并且在网上搜索也没有成功。

DEVICE=eth0在写这一切的时候,我注意到了中的一行initramfs.conf,并认为可能是这个,但我只是试图改变 linux-kernel 参数来添加它,net.ifnames=0 biosdevname=0以便内核使用旧的 eth0/eth1 名称,但行为是相同的(当然,除了日志中的名称不再是 enpXsY 而是 ethZ)。

该虚拟机中拥有 2 个网络接口的意义在于,该系统旨在将系统(通过 cdebootstrap 和手动脚本,已在运行)部署在具有 2 个网络接口的硬件上。我没有机会在实际情况下尝试这一点,但我确信问题也会存在(为什么不呢?)所以我真的很想在这里发表一些意见。

谢谢,对于 WoT 深表歉意。

答案1

在 pxelinux cfg 文件的行后append添加选项:

ipappend 2

这将告诉启动内核使用 PXE 启动 NIC 执行 DHCP 事务

答案2

所以,这就是它的长处和短处...

启动 PXE 无盘客户端时,如果该客户端恰好有多个网络接口,则内核可能会崩溃,或者 IP-Config 将挂起。

发生这种情况的原因是 IP-Config 中有一个错误,但没有人真正关心修复它。本质上,IP-Config 过快且重复地访问 DHCP 服务器。因此,DHCP 在 IP-Config 第二次(或第三次)访问时没有响应。因此,IP-Config 无法解析 DHCP,如果没有 IP,就无法设置根目录,然后内核崩溃。

解决方法如下(如果您使用 iPXE):

kernel ${base-url}vmlinuz-4.4.0-43-generic boot=nfs netboot=nfs quiet splash panic=30 nfsroot=10.0.0.1/root network ksdevice=bootif BOOTIF=${netX/mac} ip=${ip}:192.168.1.1:192.168.1.1:255.255.255.0:::none
initrd ${base-url}initrd.img-4.4.0-43-generic

如果您使用常规 PXE:

KERNEL vmlinuz-4.4.0-43-generic 
IPAPPEND 2 
APPEND vga=794 boot=nfs root=/dev/nfs initrd=initrd.img-4.4.0-43-generic quiet splash panic=30 -- nfsroot=192.168.1.1:/root ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:::none

我并不期望你的条目看起来与此完全一样。这些只是例子。因此,请相应地编辑您的内容。

1) 您需要直接在内核参数(或附加参数)中设置静态 IP 地址。如果不这样做,IP-Config 将尝试运行 DHCP 并你不想这样

2) 您想强制 PXE 仅从一个 NIC 接口查询,而不是从所有接口查询。要强制它仅使用一个接口,您可以在 iPXE 中使用“network ksdevice=bootif BOOTIF=${netX/mac}”,在常规 PXE 中使用“IPAPPEND 2”。完全按照上面所示进行编写。

就这样!只需两个简单的步骤,您就可以开始了。

BOOTIF 强制 PXE 仅使用加载 PXE 的主接口。它将忽略所有其他接口。IPAPPEND 的作用完全相同。

相关内容