MBR转换为基于GPT的系统,如何启动Linux和Windows

MBR转换为基于GPT的系统,如何启动Linux和Windows

如何将基于 GPT 的系统启动到 Linux 和 Windows?这不是从新的基于 GPT 的系统开始的问题,而是从 MBR 转换为基于 GPT 的系统开始的问题。

我的华硕笔记本电脑初始设置,

  • 我禁用了安全启动控制,并且
  • 我启用了[Launch CSM](兼容性支持模块)
  • 我使用 MBR 对 HD 进行分区
  • 我的华硕笔记本电脑上的所有系统都是从这种 BIOS/MBR/CSM 模式启动的,包括 Win8 和我所有的 Linux

然而,我发现我的 USB 仅以 EFI 方式启动和 Windows 10拒绝安装当我的 USB 以 EFI 方式启动时,到我的 BIOS/MBR/CSM 模式系统。

所以我将我的 MBR 磁盘转换为 GPT当然,正如克鲁纳尔警告的那样,这种做法毁了我的系统启动,我需要让所有东西再次启动。

好吧,现在是我的问题了。

  • 在 BIOS/MBR/CSM 模式下,我有一个活动的 MBR 分区,我的所有系统都从它启动(使用extlinux),包括 Win8 和我所有的 Linux。
  • 然而,在 GPT 模式下,这就是我的问题开始的地方。

所以我基本上不知道该走哪条路,也不想进一步搞乱我已经一团糟且无法启动的系统。

我当前的分区模式(我认为它不相关,但因为有人要求它):

Disk /dev/sda: 698.65 GiB, 750156374016 bytes, 1465149168 sectors
Disk model: HGST HTS541075A9
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: AA9AB709-8A5D-468D-990E-155BA6A2FBB3

Device         Start        End   Sectors   Size Type
/dev/sda1       2048  129026047 129024000  61.5G Microsoft basic data
/dev/sda2  129026048  169986047  40960000  19.5G EFI System
/dev/sda3  169988096  186372095  16384000   7.8G Linux filesystem
/dev/sda4  186374144  200710143  14336000   6.9G Linux filesystem
/dev/sda5  200712192  215046143  14333952   6.9G Linux filesystem
/dev/sda6  215048192  231432191  16384000   7.8G Linux filesystem
/dev/sda7  231434240  247818239  16384000   7.8G Linux filesystem
/dev/sda8  247820288  264204287  16384000   7.8G Linux filesystem
/dev/sda9  264206336  276494335  12288000   5.9G Linux filesystem
/dev/sda10 276496384  288784383  12288000   5.9G Linux filesystem
/dev/sda11 288786432  329746431  40960000  19.5G Linux filesystem
/dev/sda12 329748480  452628479 122880000  58.6G Microsoft basic data
/dev/sda13 452630528  493590527  40960000  19.5G Linux swap
/dev/sda14 493592576  903192575 409600000 195.3G Linux filesystem
/dev/sda15 903194624 1465147391 561952768   268G Linux filesystem

非常感谢有关如何从此类环境启动 Linux(和 Windows)的清晰说明。谢谢。

更新/结论:

/dev/sda2之前是我的活动 MBR 分区,如上所述,我将其类型从 更改Linux filesystemEFI System.但它是ext4格式化的,因此不能用作 EFI 系统。

因此,我需要解决上述问题的是:

  • sda2将 的类型恢复为Linux filesystem,
  • sda13从我的19.5G Linux 交换分区中分离出一个 FAT32 分区作为 ESP 分区,
  • 将固件从 CSM 更改为本机 EFI 模式
  • 然后遵循@telcoM 的以下建议

答案1

据我所知,一旦转换完成,Windows 不会将这种转换后的系统磁盘作为特殊情况处理,因此应该将其与“新”基于 GPT 的系统中的磁盘完全相同地对待。

特别是,Windows 施加了限制,即 GPT 分区的系统磁盘必须始终以 UEFI 本机样式启动 Windows:即不允许在 GPT 分区的磁盘上使用 BIOS 样式的启动过程。

首先,了解 MBR 和 GPT 分区之间的差异:

  • 在GPT中,没有像MBR分区那样划分主/扩展/逻辑分区。所有 GPT 分区都只是分区。
  • 虽然GPT分区表中有一个“legacy BIOS可启动”分区属性位,以 UEFI 风格启动时根本不使用它
  • MBR 分区磁盘通常在块 #0(实际的主引导记录)和第一个分区的开头之间有一个未使用的磁盘块间隙。在现代系统上,第一个分区通常与磁盘开头正好 1 MiB 对齐,因此如果使用常见的 512 字节块,第一个分区将从块 #2048 开始。 MBR 和第一个分区之间的间隙由 GRUB 等引导加载程序使用。在GPT分区的磁盘上,该区域被实际的GPT分区表占用,无法使用。
  • 在 MBR 分区磁盘上,分区类型由单个字节标识。在 GPT 分区磁盘上,每个分区的类型由 UUID 标识。
  • MBR 分区磁盘具有 32 位磁盘签名; GPT 分区磁盘具有用于相同目的的 128 位 UUID。每个 GPT 分区在分区表中还有一个唯一的 UUID:即使该分区中使用的文件系统未知,它也可用于唯一标识该分区。 Linux 将其显示为PARTUUID;对于 MBR 分区磁盘,使用 MBR 磁盘签名和分区号的组合来代替真实的分区 UUID。
  • MBR分区表存在于块#0中;如果使用扩展分区,则每个逻辑分区的开头都有一个附加分区表。 GPT分区表从块#1开始,占用多个块;还有一个备份GPT分区表在磁盘的最末端。如果您习惯于仅通过将磁盘开头的多个块清零来擦除磁盘分区,这通常会引起您的意外。

由于分区类型的UUID不方便人类使用,因此不同的分区程序使用了各种方法来缩短它们。gdisk将使用四位类型代码; Gparted 通过各种标志表示不同的分区类型 UUID(在我看来,这是一个不幸的选择)。

本机 UEFI 式引导过程也与经典 BIOS 式引导过程有很大不同:

  • BIOS 式引导过程首先(通常)将 BIOS 设备 ID 0x80(=第一个 BIOS 硬盘)分配给 BIOS 设置当前选择作为引导驱动器的设备。当以 UEFI 方式启动时,固件设置(UEFI 系统中的“BIOS 设置”)定义了启动路径:它可以采用多种形式,但对于已安装的操作系统来说,最常见的形式将指定一个分区UUID和一个引导文件路径名
  • 当以 BIOS 方式引导时,固件会检查所选引导磁盘的块 #0 末尾的 2 字节引导签名,然后仅执行 MBR 块中大约 440 字节的机器代码以及实际分区表。当启动 UEFI 风格时,固件具有内置功能来理解某些类型的文件系统:UEFI 规范表示兼容的 UEFI 固件必须理解 FAT32,但它也可能理解其他文件系统类型。 UEFI“可启动磁盘”必须包含具有特殊类型 UUID 的分区:这称为 EFI 系统分区,简称 ESP。固件将查找其唯一 UUID 与引导路径指定的匹配的 ESP 分区,然后尝试从该分区加载指定的引导文件。
  • 从可移动介质或之前未配置固件设置的磁盘以 UEFI 方式启动时,固件会查找包含固件可读取的文件系统的 ESP 分区以及具有特定路径名的文件。对于 64 位 x86 硬件,此UEFI 后备/可移动媒体启动路径\EFI\boot\bootx64.efi当以 Windows 风格或<ESP mount point>/EFI/boot/bootx64.efiLinux 风格表达时。

ESP 分区具有标准结构:每个已安装的操作系统必须设置一个子目录\EFI\<vendor or distribution name>\,并且仅将其引导加载程序文件放置在其中。该\EFI\boot\子目录是为后备/可移动媒体引导加载程序保留的,它遵循汉兰达规则:只可以有一个人(对于每个系统架构)。


通过在非 ESP 分区上设置 GParted“引导标志”,您实际上将该分区的类型 UUID 更改为 ESP 类型 UUID。这是一个错误:现在磁盘有两个 ESP 类型的分区。您应该将更改后的分区类型更改回原来的类型。在 GParted 中,这意味着删除“boot”和“esp”标志;在 中gdisk,这可能意味着将类型代码设置为8300(“Linux 文件系统”)或8304(“Linux x86-64 root”)。

由于同一磁盘上也有 Windows,因此不建议尝试使用 BIOS 启动分区(gdisk类型代码ef02):这通常会迫使您每次想要在操作系统之间切换时都进入固件设置并启用/禁用 CSM 。相反,您可能希望使用实时 Linux 引导介质将磁盘安装安装到例如/mnt,然后对其进行 chroot,以将当前的 BIOS 样式引导加载程序(通常是具有i386-pc架构类型的 GRUB)替换为本机 UEFI 引导加载程序(例如具有架构类型的 GRUB x86_64-efi)。基本上(以下所有命令均为root):

mount <your root filesystem device> /mnt
mount -o rbind /dev /mnt/dev
mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
chroot /mnt /bin/bash

现在您的会话将使用已安装的 Linux 操作系统的环境,并且您应该能够像往常一样使用包管理器和任何其他工具(警告:如果您有标准系统的一部分,例如/var单独的分区,请立即安装它们也!)

第一步应该是为 ESP 添加安装点并安装它。首先运行lsblk -o +UUID查找你的ESP分区的UUID;由于其文件系统类型很可能是 FAT32,因此其形式应为xxxx-yyyy.将<ESP UUID>以下命令替换为实际的 UUID:

mount UUID=<ESP UUID> /boot/efi
echo "UUID=<ESP UUID> /boot/efi vfat umask=0077,shortname=winnt,flush 0 2" >>/etc/fstab 

下一步是切换引导加载程序类型。

不幸的是,您没有提及您正在使用哪个 Linux 发行版。如果是 Debian、Ubuntu 或从这些衍生的某些发行版,则需要使用标准包管理工具删除grub-pcgrub-pc-bin包并安装grub-efi-amd64grub-efi-amd64-bin代替它们,然后运行grub-install /dev/sda(或包含 ESP 分区的任何磁盘),最后运行update-grub重建 GRUB 配置。

此时,您可以退出 chroot,撤消挂载并查看系统现在是否可以启动。

(if you had to mount any extra partitions, unmount them now)
exit
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys
umount /mnt
reboot

您可能还想安装该efibootmgr实用程序,因为它允许您在 Linux 运行时查看、备份和修改固件启动设置。 (Windows 可以用它的命令做同样的事情bcdedit,但在我看来,命令比 更难使用efibootmgr。)

相关内容