将 Windows 7 从 BIOS-MBR 迁移到 BIOS+GPT

将 Windows 7 从 BIOS-MBR 迁移到 BIOS+GPT

我有一个基于 BIOS 的系统,在 MBR 分区的 1TB HDD 上运行 Windows 7。此 HDD 的分区如下:

  • P0:60 GB NTFS 用于 Windows 和程序文件
  • P1:940 GB NTFS 用于数据

由于此磁盘即将填满,我的目的是将现有安装迁移到新的 3TB HDD,并具有以下分区:

  • P0:60 GB NTFS 与 1B/P0 相同
  • P1:2940 GB NTFS,内容为 1TB/P1,另外还有更多可用空间

由于此分区大于 2TB,MBR 无法处理它们,因此我将 3TB HDD 分区表切换为 GPT但:

  • Windows 7 无法从 BIOS+GPT 系统启动

所以我调查了这里并且似乎 GRUB 能够使用一个技巧从 GPT 磁盘启动 Windows 7:一个格式化为 MBR 的虚拟 HDD 文件 (VHD),其中包含 Windows 启动文件,一旦加载,就会从 GPT 分区加载 Windows。

所以我做了以下事情:

  • P0:用于 GPT 系统的特殊 GRUB 1MiB 分区(请参阅这里,通过 grub-install 从实时 Linux 映像安装)
  • P1:120MiB ext2 分区,用于托管 GRUB 文件(grub.cfg fe)和 bootmgr.vhd 文件
  • P3:60 GB NTFS 分区,我将所有 1TB/分区 0 文件复制到该分区
  • P4:2940 GB(或更少一点)NTFS 分区,我将所有 1TB/分区 1 文件复制到该分区

VHD 中有一个 MBR NTFS 分区,其中有使用命令生成的 Windows 启动文件:

bootsect /nt60 b: /mbr
bcdboot c:\Windows /s b: (NOT with /mbr flag as it's a GPT disk)

其中 B 是 VHD 文件,C 是在 VM 上运行的 Windows 7 x64 安装。VHD 分区设置为主分区和活动分区。

为了避免其他问题,我还在新的 3TB/P3 中生成了启动文件:

bootsect /nt60 e:
bcdboot c:\Windows /s e:

其中 E 是 3TB/P3 分区。

我尝试使用这个手动编辑的 grub.cfg 来启动 grub:

menuentry "Win7 root+chain" {
    set root=(hd0,gpt3)
    chainloader +1
}

menuentry "Win7 vhd+chain" {
    loopback loop (hd0,gpt2)/boot/bootmgr.vhd
    chainloader +1
}

第一个给我一个 Windows 启动管理器消息:

"Error 0xc000000e File:\Boot\BCD Message: An error occoured while attempting to read the boot configuration data"

第二条似乎是 Grub 消息

"Invalid signature"

你能帮帮我吗?我的 Grub 出了问题?

答案1

这个回答比较有序地总结了帖子里的评论。

虽然没有收到关于如何让 Grub 在这种情况下工作的答案,但我确实发现有问题的主板 MOPNV10J 的 BIOS 确实支持 UEFI,正如回答的那样(关联) 的作者是英特尔的一名员工丹。

有了 UEFI 支持,3TB 磁盘可以格式化为 GPT,然后整个磁盘就可以寻址。

由于发帖者的 BIOS 不支持 UEFI,现在的问题是如何将其更新到最新版本版本 0542

事实证明,更新到该版本需要分两步完成:

  1. 将 BIOS 更新至版本 0400
  2. 将 BIOS 更新至版本 0542

开始之前,请先确保您拥有当前 BIOS 版本的安装介质,在发行说明中称为“恢复 BIOS 更新”。否则,错误的 BIOS 更新可能会损坏计算机。

答案2

您在 grub 上尝试过这个吗?

menuentry "Win7 vhd+chain" {
    loopback loop (hd0,gpt2)/boot/bootmgr.vhd
    set root=(loop)
    chainloader +1
}

或者

menuentry "Win7 vhd+chain" {
    loopback loop (hd0,gpt2)/boot/bootmgr.vhd
    chainloader (loop)+1
}

顺便问一下,/boot 是 ext2 分区内的文件夹吗?还是 ext2 分区本身?也可以尝试在回送中不使用 /boot:

menuentry "Win7 vhd+chain" {
    loopback loop (hd0,gpt2)/bootmgr.vhd
    chainloader (loop)+1
}

希望有所帮助。

很久以前我做过类似的事情:使用 VHD 技巧、memdisk 和 Grub4DOS 在 GPT 结构的单磁盘系统上启动 XP、Vista、7、8.1 和 10……但不记得具体怎么做了。

答案3

您实际上不需要迁移到 GPT。MBR 将分区的起始偏移量和大小存储为无符号的 32 位整数,因此实际限制是 2 33 - 2 个扇区。这意味着,只要最后一个分区开始,就可以拥有一个 4TB 的 MBR 磁盘(扇区为 512 字节)或一个 16 TB 的 MBR 磁盘(扇区为 4 KB)2 32标记并覆盖整个剩余空间。因此,例如,您可以拥有一个 4 TB 的 HDD,其中1 TB隔断,一个1 TB 减 1 MB分区和一个2 TB分割

根据您的情况,您可以设置 P0:60 GB、P1:1 TB、P2:剩余空间,或 P0:1.5 TB、P1:1.5 TB。或者更改为任何其他组合,只要最后一个分区大小小于 2 TB 且在 2 TB 之前开始即可

更多详细信息请阅读使用 MBR 将 3TB 硬盘显示为两个 (2TiB+750GiB)

尽管如此,迁移到 GPT 更安全,因为 GPT 有校验和以及备份表,可以在发生故障时恢复

相关内容