第二个NIC在无盘Server 2012上“工作不正常”

我已经(经过相当大的争论)通过MSE软件iSCSI启动器通过从PXE链接的gPXE引导的无盘Server 2012运行。

但是,现在它正在启动,我有另一个问题(iSCSI HBA越来越吸引人的每一个头发)。 服务器有一个双网卡,Windows只接受连接到SAN的网卡,而没有连接到networking。

设备pipe理器显示两个网卡,但局域网有一个感叹号,属性指出“此设备工作不正常,因为Windows无法加载该设备所需的驱动程序(代码31)”

Windows显然确实有正确的驱动程序,因为两个端口是相同的,另一个正在工作; 此外,如果我将相同的操作系统安装到同一个硬件上,但安装在本地硬盘上,那么在网卡上没有问题。 如果我告诉它寻找一个更好的司机,它只是转过身来,说司机是好的,毫不奇怪。

我很确定我知道这里发生了什么事,这要感谢这次冒险的前一章。

预引导程序(在这种情况下是gPXE)必须将iBFT(iSCSI引导固件表)写入内存,然后由操作系统(本例中为Windows)提取。 该表格提供了NIC的列表。 它们分别指定PCI总线和设备#,MAC地址和IP信息。

我从检查它的源代码(以及我开发的用于转储iBFT的一个小工具)知道,尽pipe标准允许大约240个NIC,但是devise/懒惰的gPXE只写一个NIC到iBFT。 即使它编写了多个网卡,我仍然处在同一条船上,因为其他gPXE / iPXE问题迫使我使用UNDI-only版本,这意味着它甚至不知道其他网卡。

我认为这里发生的事情是,Windows正在查看iBFT,即使知道其他设备pipe理系统中存在其他网卡,也正在认定它不能被使用,因为它不在iBFT中。 我不知道为什么会这样做。

有没有什么方法可以让Windows使用另一个NIC,即使它不在iBFT中? 或者,有一些iSCSI预启动程序,实际上是正确的? 还是有一个完全不同的解释?

我终于到了这个底部,并设法让它工作。 但是在这个过程中,我得出的结论是,Windows中的iSCSI启动function,gPXE和iPXE都是不完整的。 我将分享为我工作的方法,以防别人帮助,但请注意一些注意事项:

  • 这是一个糟糕的解决scheme。 基于硬件的解决scheme(例如iSCSI HBA)将提供更好的性能和可靠性,而且设置起来要容易得多。

  • 此解决scheme不能很好地扩展到大型部署,主要是因为它需要每个无盘服务器设置过多的手工劳动。

  • 这个解决scheme不是那么简单。 可能有一个更简单的解决scheme(除了明显的,使用iSCSI HBA)。如果你知道一个,请添加它,我会标记你的答案,如果我可以复制它。

  • 这个解决scheme是一个丑陋,丑陋的黑客攻击。 请自担风险!

在我继续之前,我想澄清的是,无论何时我说“NIC”,我指的是Windows认为是单个“设备”,但实际上它们可能只是实际NIC上的几个端口之一。 这个术语与iBFT标准本身和iPXE / gPXE一致。

Windows在其iSCSI启动器上启动时,对于iBFT(在启动Windows引导加载程序(告诉它如何访问iSCSI LU)之前的'iSCSI启动解决scheme'表写入内存')有一些非常挑剔的要求。 我已经能够拼凑一些“疑难杂症”规则(可能会或可能不会适用于您的特定情况):

  • 如果NIC不在iBFT中,Windows将无法使用它。 它将显示问题中给出的症状。

  • iBFT中的NIC列表必须按特定顺序sorting。 我没有完整的详细信息,因为我在testing服务器中只有两个NIC端口,在同一个NIC上。 一个是PCI 08:04.0 ,另一个是PCI 08:04.1 。 如果iBFT在08:04.0之前的08:04.1之前列出了NIC,那么Windows就会发疯。 (请注意,标准中没有要求给定的顺序。)

  • iSCSI目标必须可以从iBFT中列出的第一个 NIC访问。 由于上述规则,这可能需要您切换SAN和LAN端口。

  • 如果iBFT中的第一个NIC与第一次安装Windows时不同,它将会崩溃并重新启动。 如果您的初始设置不正确,可能需要重新安装Windows。 (我不是正面的“相同”,但是同一个NIC上的不同端口肯定不是“相同的”。)

  • NIC部分必须以与控制部分中列出的顺序相同的顺序出现在内存中,否则Windows会发火。 (请注意,这些标准并没有规定sorting必须匹配 – 再次,这只是Windows懒惰。)

第一条规则是蹭。 即使在有多个NIC知道的情况下,gPXE 1.0.0和2013年1月31日的inheritance者iPXE都不会将多个NIC写入iBFT。 我已经通过检查他们的源代码来validation这一点。

我的hacky解决scheme是获得iPXE源代码树,并修改程序,使其写入第二个NIC部分到iBFT,对应于我的服务器中的另一个NIC(我没有启动的NIC)。我只是硬连线MAC地址和PCI地址。 我发现没有必要把IP的东西放到网卡的部分 – 只需要把它全部归零,Windows就会在启动的时候分配它。 (请注意,IP的东西确实需要写入SAN NIC,但是iPXE已经被编码了。)

通过使用#define ,实际的地址可以被input到一个方便的地方,而不是每次你想改变源代码。

如果您进行此更改,请注意NIC部分的标题中有一个索引字节。 iPXE代码不会触及这些(虽然它在struct给出),因为它永远不会写多个NIC,但是如果你编写第二个NIC,则需要将其索引字节设置为1,否则Windows将不开心。

这个解决scheme的一个明显的缺点是,你必须为每台服务器重新编译iPXE,在TFTP服务器上保留这些独立版本的iPXE,并configurationPXE服务器为每个服务器分配不同的引导程序。

一些C编程知识需要做一些初步的改变,以及一个Linux发行版和GNU开发工具。 这里指定了 iBFT格式。

我希望我可以在这里发布我的更改,但实际上我最终更改了ipxe.org网站欺骗我下载的一个非常旧的版本。 (显然,他们从来没有标记稳定的版本,我从那以后就知道master分支上的所有版本都是稳定的。)我宁愿不鼓励任何人使用这样的旧版本。

最新的版本仍然有相同的限制。 我会把这个转发到他们的开发清单,希望能够得到解决。