启动 – 无盘服务器2012上的第二个NIC“无法正常工作”

通过MS软件iSCSI启动器运行的无盘服务器2012(通过从NIC的PXE链接的gPXE启动)后,我(经过相当大的争夺).

但是,既然它正在正常启动,我还有另外一个问题(iSCSI HBA在每次拔毛时变得越来越有吸引力).服务器有一个双网卡,Windows只接受连接到SAN的网卡,让我没有局域网连接!

设备管理器显示两个NIC,但LAN的一个有感叹号,属性指示“此设备无法正常工作,因为Windows无法加载此设备所需的驱动程序.(代码31)”

Windows显然确实有正确的驱动程序,因为两个端口是相同的,另一个是工作的;此外,如果我将相同的操作系统安装到相同的硬件上但安装到本地硬盘驱动器上,则它对NIC没有任何问题.如果我告诉它寻找一个更好的驱动程序,它只是转过来说驱动程序是好的,这并不奇怪.

我非常肯定我知道这里发生了什么,这要归功于这次冒险中的前一章.

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

我知道从检查它的源代码(以及我开发的用于转储iBFT的一个小工具)gPXE by design / laziness只会将一个NIC写入iBFT,即使该标准允许其中大约240个.即使它确实编写了多个NIC,我仍然会在同一条船上,因为其他gPXE / iPXE问题迫使我使用仅限UNDI的版本,这意味着它甚至不知道其他的NIC.

我想这里发生的事情是,Windows正在查看iBFT,并且 – 即使它知道其他设备管理系统中存在的NIC – 正在决定它不能被使用,因为它不在iBFT中.我不知道为什么会这样做.

是否有某种方法可以诱使Windows使用其他NIC,即使它不在iBFT中?或者,是否有一些iSCSI预引导程序实际上正常工作?还是有完全不同的解释?

我终于到底了,并设法让它运作起来.但是,在此过程中,我得出结论,Windows,gPXE和iPXE中的iSCSI启动功能都是半生不熟的.我将分享对我有用的方法,以防它帮助其他人,但请注意一些警告:

>这是一个糟糕的解决方案.基于硬件的解决方案(例如iSCSI HBA)将提供更好的性能和稳健性,并且设置起来将更加容易.
>此解决方案无法很好地扩展到大型部署,主要是因为每个无盘服务器需要设置过多的手动劳动力.
>这个解决方案并不那么简单.可能有一个更简单的解决方案(除了显而易见的,使用iSCSI HBA.)如果你知道一个,请添加它,如果我可以复制它,我会给你的答案.
>这个解决方案是一个丑陋,丑陋的黑客.使用风险自负!!

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

Windows在其iSCSI启动器上启动时,对iBFT有一些非常挑剔的要求(‘iSCSI启动解决方案’在调用Windows启动加载程序之前写入内存的表,它告诉它如何访问iSCSI LU).我已经能够拼凑出一些“陷阱”规则(在您的特定情况下可能会或可能不会):

>如果iBFT中没有NIC,Windows将无法使用它.它将表现出问题中给出的症状.
> iBFT中的NIC列表必须按特定顺序排序.我没有完整的详细信息,因为我在同一个NIC上的测试服务器中只有两个NIC端口.一个是PCI 08:04.0,另一个是PCI 08:04.1.如果iBFT在08:04.1之前的08:04.1列出了网卡,那么Windows就会生气. (请注意,标准中没有任何要求给定订单的内容.)
>必须可以从iBFT中列出的第一个NIC访问iSCSI目标.由于上述规则,这可能需要您切换SAN和LAN端口.
>如果iBFT中的第一个NIC与首次安装Windows时的第一个NIC不同,它将崩溃并重新启动.如果您的设置最初不正确,则可能需要重新安装Windows. (我不肯定是什么构成“相同”,但同一个网卡上的不同端口肯定不是“相同”.)
> NIC部分必须按照它们在控制部分中列出的顺序在内存中出现,否则Windows会生气. (请注意,标准没有规定排序必须匹配 – 再次,这只是Windows懒惰.)

第一条规则就是擦. gPXE 1.0.0和2013年1月31日的继承者iPXE都没有向iBFT写入多个网卡,即使他们知道有多个网卡也是如此.我通过检查他们的源代码验证了这一点.

我的hacky解决方案是获取iPXE源代码树,并修改程序,使其将第二个NIC部分写入iBFT,对应于我服务器中的另一个NIC(我没有启动的NIC.)我刚刚硬连接了MAC地址和PCI地址.我发现没有必要将IP内容放入NIC的部分 – 只需将其全部归零,Windows将在稍后的启动时分配它. (请注意,需要为SAN NIC编写IP内容,但iPXE已编码为执行此操作.)

通过使用#define,可以将实际地址输入到一些方便的位置,而不必在每次想要更改源代码时进行挖掘.

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

此解决方案的明显缺点是您必须为每个服务器重新编译iPXE,在TFTP服务器上保留这些单独版本的iPXE,并配置PXE服务器以向每个服务器发出不同的引导程序.

需要一些C编程知识来进行初始更改,以及Linux发行版和GNU开发工具. iBFT格式指定为here.

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

最新版本仍然具有相同的限制.我将把它转发到他们的开发列表中,希望它能得到修复.

相关文章

windows无法连接到wifi怎么办
文章浏览阅读2.2k次,点赞6次,收藏20次。在我们平时办公工作...
文章浏览阅读1k次。解决 Windows make command not found 和...
文章浏览阅读3.2k次,点赞2次,收藏6次。2、鼠标依次点击“计...
文章浏览阅读1.3w次。蓝光版属于高清版的一种。BD英文全名是...
文章浏览阅读974次,点赞7次,收藏8次。提供了更强大的功能,...