我有一些服务器,可以在启动时反复重试搜索启动设备(本地 SATA 磁盘、USB 驱动器、网络启动),直到有一个可用的设备。
我也有一个使用 iPXE 的网络启动设置。默认情况下,它会检查机器 mac 地址的自定义启动脚本并执行该脚本。如果没有,它会退出。
一段时间内,这个方法运行良好。但大约 5 分钟后,我开始收到“NBP 太大,无法放入可用基本内存”,并且它不执行自定义脚本。相反,我认为它无法启动 iPXE“网络引导程序”。
这些系统有 64GB 以上的内存。因此系统内存不会用完。但可能卡上或卡本身的内存可用空间非常小,每次尝试启动时都必须使用新内存。
我觉得这像是 NIC 固件中的内存泄漏。
我希望在启动过程中,当 NIC 的 OPROM 屏幕上显示“正在初始化”时,NIC 完全初始化。我希望当无法通过 NIC 启动时,该 NIC 使用的所有内存都会被释放。
如何阻止此 NBP 错误发生?ipxe 中是否有命令可以释放此内存或强制完全重新初始化 nic?
答案1
内存不足。我假设您在这里使用的是旧版 pcbios,因为一切都指向这一点。在这个旧时代,我们实际上只有 640KB 的基本内存可用于初始程序。
现在用完的原因是在旧的 pcbios UNDI 堆栈中,实际上没有干净的方法来退出和清理所有内容。
解决此问题最简单的方法是重新启动机器。也许有些事情可以改进,但为了提供进一步的帮助,最好提供更详细的输出日志,以及您正在使用的 iPXE 二进制文件,以及您从 iPXE 获得的完整错误消息(如果有)(它将包含 ipxe.org 网址 - 也请阅读该页面)
我记得曾经讨论过类似的问题(可能是在 iPXE 论坛中),但那是很多年前的事了,记不太清楚了。(错误消息可能会有所帮助)
编辑:以下是一些有助于您延年益寿的想法:
- 如果您打算使用 iPXE,请尝试使用较小版本的 iPXE(可以禁用许多功能),这样当实际需要时,它可以在较少内存的情况下成功运行。(这并不能解决问题,但确实会使它在失败前尝试更长时间)
- 始终链接到 iPXE,然后有一个循环的嵌入式脚本,类似于:
#!ipxe
:retry
autoboot || goto :retry
这将在 iPXE 内部永远重试,而无需在每次尝试时进行初始化(和占用内存)。
答案2
将 BIOS 中的启动模式更改为 UEFI 即可解决此问题。旧版可能没有足够的资源。