裸金属装机一直卡在 iscsistart,根因是 ethX 网卡乱序,iSCSI 连接建在了错误的网卡上。在 PXELINUX 配置里加 IPAPPEND 2,让引导程序自动把引导网卡的 MAC 追加给内核,即可解决。

现象

创建裸金属时,网卡乱序导致 iSCSI 镜像加载不了,装机一直卡在 iscsistart。

排查

看 PXELINUX 配置:

/pxelinux.cfg# cat 01-8c-96-a5-2d-fb-70
DEFAULT linux
LABEL linux
menu default
menu label Linux
KERNEL vmlinuz
APPEND initrd=initrd.img ip=10.0.0.64:10.0.0.185::255.255.255.0:bm-example:eth0:off ISCSI_TARGET_NAME=iqn.2012-04.example.com:bm-example-boot.img ISCSI_TARGET_IP=10.0.0.185 ISCSI_TARGET_PORT=3260 root=UUID=4a99650e-84e7-4c6a-83f9-1b1c964f39de rw net.ifnames=0 biosdevname=0

这里 APPEND 里有个重要参数:eth0,就是通过 eth0 建立 iSCSI 连接,切换 rootfs。

根因

问题就在这里:ethX 天生就有乱序问题。

我们期望网卡 1 是 eth0,物理链路上和 iSCSI 在一个网络上。 但是因为乱序问题,网卡 2 名称是 eth1,这样 iSCSI 就不通了,因为物理链路就不通。

这个时候 BM 装机就一直卡在 iscsistart。

解决办法

在 PXELINUX 配置中加上 IPAPPEND 2。

添加 IPAPPEND 2 后,PXELINUX 引导程序在加载内核时,会自动把刚才成功下载到 PXE 文件的那个网卡的 MAC 地址以 BOOTIF=01-8c-96-a5-2d-fb-70 的形式动态追加到 APPEND 末尾。内核根据 BOOTIF 准确地把 IP 赋给这张网卡,完全不需要在配置文件里手动写死 MAC 或 eth0。

/pxelinux.cfg# cat 01-8c-96-a5-2d-fb-70
DEFAULT linux
LABEL linux
menu default
menu label Linux
KERNEL vmlinuz
IPAPPEND 2     # 新加参数
APPEND initrd=initrd.img ip=10.0.0.64:10.0.0.185::255.255.255.0:bm-example::off ISCSI_TARGET_NAME=iqn.2012-04.example.com:bm-example-boot.img ISCSI_TARGET_IP=10.0.0.185 ISCSI_TARGET_PORT=3260 root=UUID=4a99650e-84e7-4c6a-83f9-1b1c964f39de rw net.ifnames=0 biosdevname=0

APPEND 中去掉 eth0(ethX)。

小结

  • ethX 网卡命名天生有乱序问题,不能依赖 eth0 来建立 iSCSI 连接;
  • IPAPPEND 2 让 PXELINUX 自动把引导网卡的 MAC 以 BOOTIF 形式追加给内核;
  • 内核根据 BOOTIF 准确绑定网卡,彻底解决乱序问题;
  • 配置里不要写死 MAC 或 eth0,交给 PXELINUX 动态处理。