我正在研究如何将各种操作系统安装到无盘服务器上,并通过 iSCSI 运行。服务器没有用于此目的的特殊硬件(没有 iSCSI HBA 等)。
我曾短暂地使用过 Windows 部署服务,但它似乎与我想要的完全相反:我可能错了,但它似乎设计用于在系统上进行基于网络的 Windows 安装,然后从本地磁盘启动,而我希望安装 Windows 以便它从 iSCSI 磁盘运行,我不在乎是否必须本地插入安装介质。因此,我目前的方法不使用 WDS。
本次测试针对的是 Windows Server 2012,但可能也适用于之前的版本。
简而言之,我正在设置一个空白的 iSCSI 目标(我尝试过几个软件供应商,虽然我目前使用的是 StarWind,但似乎没有太大区别),并使用 PXE 链接到 gPXE 或 iPXE 来执行 iSCSI 启动(我尝试过两者,结果相似,但我发现 gPXE 更容易使用。)
当然,如果没有操作系统,启动就会失败,但它会通过 BIOS 磁盘接口将 LU 挂接起来,这样当启动本地 DVD-ROM 时,安装程序就会看到要安装的卷。
我通过进入 gPXE 提示符并输入以下命令来完成启动(除了接口号外,与 iPXE 中的命令相同):
dhcp net1
set keep-san 1
sanboot iscsi:#.#.#.#::::iqn.xxxxxxxxxxxxxxxxxxx
exit
Windows Server 2012 似乎已安装完毕,并在某个时刻重新启动。iPXE 开始从 iSCSI 启动,并出现“Metro”徽标 - 因此至少在 LU 上安装了一些东西。但是,屏幕随后变为浅蓝色,一条消息以大文本短暂闪烁,内容是有关“PC”(它实际上是机架服务器,但无论如何)遇到问题的消息,但我无法在它消失并且计算机重新启动之前阅读所有内容。
最终我看到一个文本屏幕,标题Windows Boot Manager
为:
Windows failed to start. A recent hardware or software change might be the
cause. To fix the problem:
1. Insert your Windows installation disc and restart your computer.
2. Choose your language settings, and then click "Next."
3. Click "Repair your computer."
If you do not have this disc, contact your system administrator or computer
manufacturer for assistance.
File: \Windows\system32\ntoskrnl.exe
Status: 0xc00000e9
Info: The operating system couldn't be loaded because the kernel is
missing or contains errors
那些仔细观察的人会发现这些说明很难有效遵循,尤其是在物理硬件上。(顺便说一句,我尝试过在物理机和虚拟机上安装,结果都差不多。)
我猜测这里发生的事情是,Windows 2012 之所以能达到这样的程度是因为 iPXE 已经挂接了中断 13h(BIOS 磁盘服务),但是一旦系统启动到足以切换到保护模式驱动程序,启动就会被粗鲁地中断,因为没有硬盘可以读取和/或 Windows 的 iSCSI 启动器发生故障。
我尝试的 iPXE 是 1.0.0+ (3fcb),而我尝试的 gPXE 是 1.0.1。
是否可以让 Server 2012 在没有硬件 HBA 的情况下通过 iSCSI 运行,如果可以,我可能做错了什么?
答案1
(我最初的回答为时过早。正如承诺的那样,在一切正常后我重写了它。)
首先,我发现一般来说,支持 iSCSI 启动的软件都是半生不熟的,所涉及的不同系统互操作性很差。出于这个原因如果可能的话,我建议采用基于硬件的解决方案,例如 iSCSI HBA。 话虽如此,我会在这里讲述我的经历,希望它能对任何人有所帮助。
总结一下我的发现(我假设您已经为 PXE 和 iSCSI 目标设置了 DHCP 和 TFTP,并且已经链接到 gPXE 或 iPXE):
gPXE 和 iPXE绝不将多个 NIC 写入 iBFT(iSCSI 启动固件表),这可能会影响 Windows Server。我在另一个问题中详细讨论了这个问题这里。
除了上述设计限制之外,gPXE 还有一个实际的错误,同样会影响具有多个网络端口的系统。我将在下面解释。为了避免这个错误,我使用了 gPXE 的“仅 UNDI”版本。这可以防止 gPXE 直接访问 NIC,而是让它使用 NIC 的 PXE 加载程序提供的 API。这会让 gPXE 认为只有一个网络端口(它加载的那个端口),从而避免了错误。我不确定这个错误是否存在于较新的 iPXE 版本中。
keep-san
我最初对gPXE/iPXE 中的选项感到困惑。该keep-san
标志会影响 gPXE 的行为仅当启动失败时。因此,仅在安装开始时第一次启动时才需要此选项。Windows Server(至少 2012 版,其他版本可能也如此)显然不允许将提供系统磁盘的 iSCSI 启动器从一个网络端口移动到另一个网络端口。如果 Windows 从与安装 Windows 时所在的网络端口不同的启动器启动,则在启动过程中,在移交给 MS 启动器时,Windows 会崩溃(BSOD 和/或重启)。
Windows Server(2003 及更高版本)中有一个公认的功能/问题,即它将使用网关(如果指定了网关)来访问目标,即使目标位于本地子网中。如果网关不可用或未路由回同一端口,则启动将在移交给 MS 启动器时失败。 如果不需要网关设置,请确保 DHCP 没有给出网关设置。
我上面提到的 gPXE 错误涉及 iBFT(iSCSI 启动固件表)。这是一个由预启动系统放入内存的对象,其中包含有关 NIC、iSCSI 启动器和用作系统磁盘的 iSCSI 目标的信息。操作系统在切换到保护模式后使用此信息继续启动。格式指定这里。
我怀疑 gPXE 放入 iBFT 的信息存在问题,因此我编写了一个引导扇区,将 iBFT 的内容转储到屏幕上。通过这个,我发现 gPXE 写入的数据在某些情况下是错误的。
如上所述,gPXE 仅将一个 NIC 记录写入 iBFT,但在某些情况下,写入该 NIC 记录的信息会混乱。MAC 地址和 PCI 地址将对应于一个 NIC,但本地 IP 和网关地址将对应于另一个 NIC。如果 SAN 不在第一个 NIC 上,则最有可能发生这种情况。
更令人困惑的是,如果 gPXE 自动启动,则会写入错误的 iBFT 信息,但从 gPXE 的命令提示符启动时,根据输入的命令的确切顺序,可能会写入正确的信息。考虑到如果 Windows 的 NIC 已更改(即使给出了正确的 iBFT),Windows 会出现与此错误导致的症状相同的症状,您就会明白为什么我会抓狂。
顺便说一句,在我最初的问题中,我认为它适用于 Server 2008 R2,但不适用于 Server 2012。(我将其删除,因为它有误导性。)我怀疑它们的基本行为实际上没有区别,而不同的结果归因于上述问题的细微差别以及我的测试中的细微变化。