![从 SeaBIOS 中基于固件的 PCI RAID 控制器启动](https://linux22.com/image/705356/%E4%BB%8E%20SeaBIOS%20%E4%B8%AD%E5%9F%BA%E4%BA%8E%E5%9B%BA%E4%BB%B6%E7%9A%84%20PCI%20RAID%20%E6%8E%A7%E5%88%B6%E5%99%A8%E5%90%AF%E5%8A%A8.png)
我有一台运行 Windows 2003 的服务器,它位于 Promise FastTrak SX4100 形成的 RAID5 阵列上,我以为它是基于硬件的,因为它有专用的处理器和缓冲内存,并且能够启动 DOS 和 Windows。然而,事实证明,该控制器只是硬件控制器。协助,由运行在主机处理器上的 x86 固件执行更高级别的逻辑。现在老旧的主板(或处理器?)已经坏了,我试图迁移到更现代的面向 UEFI 的硬件,RAID 控制器即使在传统(BIOS)模式下也无法初始化 - 它在扫描磁盘时挂起,即其固件从 UEFI/BIOS 接收控制并在屏幕上打印欢迎消息,但在识别连接的 SATA 驱动器方面没有任何进展。
因此,我认为在虚拟机中通过 PCI 卡运行 Windows 可能会更成功,因为 NT 5.2 不太可能与现代芯片组兼容,而 Qemu 在经典 BIOS 模式下提供了完全舒适的模拟环境。然而,问题是SeaBIOS 未将 RAID 控制器列为可启动设备,尽管能够成功与其通信。
那是:
- 控制器固件做接收控制并能够初始化 RAID 阵列前启动菜单由 SeaBIOS 显示,但是该菜单没有提及阵列磁盘。
- 在 POST 过程中可以调用的阵列配置实用程序清楚地显示阵列运行状况良好。
- 当 Windows 安装程序运行并加载 RAID 驱动程序时,它还会清楚地显示磁盘内容,证明其可用性。
换句话说, 阵列似乎在 VM 环境中完全可操作,但有时 SeaBIOS 无法将其识别为可启动设备,尽管后来做支持 PCI 设备的 Boot ROM 选项,这一点从 SeaBIOS 内置的 iPXE 网络启动 ROM 就可以看出。
我还认为 GRUB 可能在这里有所帮助,即从 SeaBIOS 启动到 GRUB(在一个单独的小磁盘上),然后链式加载到 Windows。但是,我配置它不是很成功,因为 Linux 环境由于缺少驱动程序而看不到阵列,因此无法帮助创建菜单,而 GRUB 本身也不太友好或冗长——我甚至无法理解它是否真的将阵列视为磁盘驱动器,或者需要事先加载一些驱动程序,或者任何其他先决条件。RescaTux 或 PartedMagic 等救援工具包也没什么用,因为它们专注于修复现有的 GRUB 安装——而不是设置新的安装。
作为参考,我尝试使用上游 Qemu 2.6.2 和 SeaBIOS 1.9.1 运行 Xen 4.7.2,并在 openSUSE 42.2 和 Linux 4.4.62 上运行。论坛和邮件列表表明,从 PCI RAID 启动在更老的版本中已经是可能的,已经有十多年了,所以我认为这是我的特定设置的问题。但我不明白,SeaBIOS 确实能够从我的 RAID 控制器启动吗?
最终目标是通过任何可用的方式让服务器恢复,包括购买另一个兼容的旧硬件。但我对这项特定技术感到好奇,因为虚拟机似乎是延长遗留系统寿命的更通用且面向未来的方法。
答案1
是的,SeaBIOS 支持加载和运行 PCI 选项 rom。这显然确实有效,因为您可以看到 raid 控制器启动消息。然后 PCI rom 必须注册任何可启动磁盘,而这里没有发生这种情况。可能是配置问题。每当您可以在那里配置启动卷时,请检查阵列配置实用程序。也可能是一些错误或不兼容...
如果这不起作用,您可以尝试完全不同的方法:将磁盘连接到某些 Linux 支持的 SATA 控制器,然后检查 dmraid 是否能够解码 raid 卷。如果可行,您可以将其作为简单磁盘附加到您的 win2k3 虚拟机。
答案2
那么你只有一个办法:
- 您必须找到带有
PCI V2.2
扩展槽的旧主板并尝试从 raid 控制器启动。 - 然后为 KVM 所有虚拟硬件安装特殊驱动程序(见下文)。
- 进行备份。然后从 Linux Live CD 启动(以来自的示例为例)系统救援光盘) 并通过程序减少分区大小而不改变启动和根分区(通常是 Windows 的磁盘
C:
)的起始位置GParted
。逻辑 RAID 驱动器上必须有更多 8Gb+RAM 的可用未分区大小。确保您可以在此之后启动。 - 通过命令将逻辑磁盘复制
dd
到备份驱动器上的文件。然后将磁盘连接到新主板,在软件 RAID1 上安装 Linux
例如:您在 RAID5 中有 4 个 120Gb 磁盘和一个逻辑驱动器/dev/sda
。您只有一个分区/dev/sda1
,即 Windows 磁盘C:
。它在减少后大小为 300Gb GParted
。您使用命令安装另一个备份驱动器:mount /dev/sdb1 /mnt
。然后使用命令将 RAID 磁盘的前 301Gb 复制到备份驱动器dd if=/dev/sda of=/mnt/disk-c.img bs=4M count=77056
。复制完成后执行umount /mnt
。
- 在空闲空间上创建软 RAID5。在其上创建 LVM 组和大小大于镜像文件的 LVM 卷。
- 将数据从映像文件复制到 LVM 卷。将此卷作为 RAW 磁盘附加到虚拟机。
例如:通过命令创建逻辑卷lvcreate -L 302G -n win_disk vg0
。挂载备份驱动器并将数据复制到卷中dd of=/dev/vg0/win_disk if=/mnt/disk-c.img bs=4M count=77056
。
将您的 RAID 控制器放入回收站。
附言:
当我创建 Windows 2000 虚拟机时,我分配了下一个虚拟硬件:
- CPU - 虚拟机管理程序默认值
- 磁盘 - IDE 原始
- NIC - 设备型号 rtl8139
- 鼠标和键盘 - PS/2
- 视频 - Cirrus
驱动程序: