需求:

       主机商提供的产品存储超过2TB容量,且仅支持bios方式启动服务器或者计算机电脑。Linux系统能在 bios + gpt 的环境中正常安装和运行,但 Windows 系统要求 bios + mbr 或  uefi + gpt 的组合,不支持 bios + gpt 的场景。

需求分析:

       Windows的启动管理bootmgr.exe不认gpt分区,所以启动不了。解决方法是创建一个包含启动代码和文件的虚拟磁盘文件来启动Windows。

解决方案:

       1. 创建一个vhd固定大小的虚拟磁盘,如 20 GB,名称为win.vhd
       2. 该vhd虚拟磁盘至少有三个分区,第一个是BIOS Partition,这个特别的分区是grub2必需的,可通过Linux系统里的cfdisk程序来创建。如下边的分区例子:

 Device                                Start                   End               Sectors               Size Type
   /dev/sdb1                            2048                 32767                 30720                15M BIOS boot
   /dev/sdb2                           32768                647167                614400               300M EFI System
   /dev/sdb3                          647168              38262784              38909952              19.7G Microsoft basic data

       3. 创建第二个vhd固定大小的虚拟磁盘,本例的容量为64MB,名称为bootmgr.vhd。磁盘用MBR分区,创建一个主分区,且设置为活动分区
       4. 在Windows系统里附加两个vhd虚拟磁盘,假如本例中,第一个大的虚拟磁盘的NTFS分区盘符是M:,ESP分区盘符是L:;第二个虚拟磁盘的分区的分区盘符是B:
       5. 将已经安装好的Windows映像释放到NTFS分区中,如本例中的第3个分区M:,执行 bcdboot.exe M:\Windows /s L: /v /f uefi 将创建uefi相关的启动文件到 L: 分区 ;执行 bcdboot.exe M:\Windows /s B: /v /f bios 将创建bois相关的启动文件到 B: 分区;执行 bootsect /nt60 B: /mbr 将在B:上创建启动代码
       6. 分离第二个虚拟磁盘
       7. 将bootmgr.vhd的虚拟磁盘文件放到第一个vhd虚拟磁盘中的esp分区中L:
       8. 分离第一个虚拟磁盘
       9. 将win.vhd磁盘挂到一个debian系统的虚拟机里,挂载后,esp分区/dev/sdb2路径为/mnt/1,用grub-install将grub2安装到vhd磁盘。如例:grub-install --target=i386-pc /dev/sdb --boot-directory=/mnt/1;复制/usr/lib/syslinux/memdisk 文件 到esp分区/mnt/1
       10. 复制或创建一个grub的配置文件,放在grub目录里,配置文件需有bootmgr.vhd的启动项内容,如本例的部分内容

 menuentry "bootmgr.vhd" {
    insmod part_msdos
    insmod part_gpt
    insmod fat
    insmod ntfs
    linux16 /memdisk raw
    initrd16 /bootmgr.vhd
}

       11.正常的情况下,该包含有grub2,bootmgr.vhd和Windows的gpt vhd虚拟磁盘,能在VirtualBox的bios或efi虚拟机里启动

问题:

因为Windows是已经安装的,所以如将这个win.vhd复制使用,Windows的SID、计算机名称等是一样的。微软建议用sysprep来生成新的SID,避免在线更新Windows时遇到问题。

参考:

  • http://bbs.wuyou.net/forum.php?mod=viewthread&tid=429265

  • http://bbs.wuyou.net/forum.php?mod=viewthread&tid=417545

  • https://wzyboy.im/post/1049.html

  • https://docs.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/windows-setup-installing-using-the-mbr-or-gpt-partition-style?view=windows-11

  • https://wiki.archlinux.org/title/GRUB_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

  • https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/bcdboot-command-line-options-techref-di?view=windows-11

  • https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/bootsect-command-line-options?view=windows-11

  • http://reboot.pro/index.php?showtopic=19516

  • http://reboot.pro/index.php?showtopic=22474

  • https://wiki.syslinux.org/wiki/index.php?title=MEMDISK

  • https://techcommunity.microsoft.com/t5/windows-blog-archive/the-machine-sid-duplication-myth-and-why-sysprep-matters/ba-p/723859

  • http://grub4dos.chenall.net/