如何将Ubuntu的MBR驱动器更改/转换为GPT,并使Ubuntu从EFI引导?

我最近升级了我的电脑,我的新主板(ASUS M5A99X EVO)使用UEFI而不是常规的MBR选项。
我有一个Ubuntu 11.10安装,当我拥有我的先前硬件(MSI MS 7267)时进行了安装,Ubuntu单独引导正常,Windows 7也是如此,但是Windows 7正在使用UEFI(GPT)引导,而Ubuntu正在使用MBR。
我将我的操作系统安装在单独的驱动器中,以便GRUB2不会被Windows Bootloader替换,反之亦然,正如我所说,两个操作系统都可以单独引导,但是为了做到这一点,我必须断开其中一个驱动器,即Ubuntu驱动器,因为它会阻止Windows加载。
现在我的问题是,我如何更改/转换Ubuntu的驱动器,使其不使用MBR而使用GPT,并允许Windows引导?。
最好不要重新安装整个系统或丢失任何数据。
如果我要清除驱动器,我该如何以GPT、UEFI或其他模式安装Ubuntu?。
我已经使用gdisk将MBR转换为GPT,但现在Ubuntu无法引导,似乎grub根本没有启动。
我重新安装了操作系统,现在默认的驱动器是GPT,但仍然使用grup-pc而不是grub-efi
我该如何让Ubuntu从EFI引导?

希望这个链接对你有所帮助:http://www.rodsbooks.com/gdisk/booting.html。 - One Zero
4个回答

目录:

  1. 术语
  2. 转换
  3. 配置(+双启动)

术语

BIOS = 基本输入/输出系统

(U)EFI = (统一)可扩展固件接口

MBR = 主引导记录

GPT = GUID分区表

UEFI / EFI / BIOS = 固件接口

MBR / GPT = 计算机如何知道(每个硬盘)有哪些分区以及如何从中引导。

UEFI / BIOS

固件接口是固件(设备内部软件)和操作系统互动的方式。它初始化硬件,然后运行操作系统,并确保操作系统驱动程序可以操作硬件。

BIOS通常用作固件接口。UEFI是一种较新的界面,具有多个功能,例如更快速、带有GUI并且能够启动网络卡并获取IP地址。UEFI替换了EFI。 (开发EFI的人看到有其他人在做类似的事情,因此加入他们,并将EFI的想法带入其中。这就成为了UEFI)。

BIOS要求引导加载程序位于磁盘的开头,但UEFI使用一个分区来存储引导程序,并可以选择使用多个引导加载程序。

MBR / GPT + GRUB

MBR是磁盘起始处的一段代码,包含了引导加载程序(用于BIOS),分区映射和唯一的磁盘标识符。

要在具有MBR的磁盘上安装GRUB,GRUB会将一个小程序放入MBR中,从磁盘的其他部分加载GRUB的其余部分。(这样做是因为MBR太小,无法容纳所有的GRUB)。所选择的空间是MBR和第一个分区之间的空间,通常是存在的。

GPT是指定分区的标准。它确实有一个“保护性”MBR,但这仅用于允许基于BIOS的计算机引导,并阻止只知道MBR的工具试图破坏GPT。它可以有

(如何处理GPT取决于它是使用BIOS(或UEFI系统以BIOS仿真模式)还是UEFI进行引导。我将重点介绍与问题相关的UEFI)。

操作系统的引导加载程序存储在称为EFI系统分区的分区中,该分区通常使用FAT32格式化。这就是GRUB安装的位置。

转换

首先...
我们正在处理分区表,所以无法保证绝对安全。这是一个有风险的操作。然而,这种方法不应该丢失数据。
其他人遇到这个问题时:不要在苹果电脑上使用。 现在...
您需要在一张光盘(或者另一个已经安装了Linux的磁盘)上进行此操作。
处理GPT磁盘时,我们需要使用一个支持GPT的程序。'GPT fdisk'是一个很好的工具,我将使用它。它可以被称为gptfdisk或者gdisk,具体取决于发行版(Ubuntu称其为gdisk)。Parted(和Gparted)也支持GPT,因此可以“安全地”用于GPT磁盘。
要进行转换,您需要:
  1. 调整分区大小以适应GPT数据和EFI系统分区。
  2. 转换磁盘并添加分区。
  3. 将GRUB安装到EFI系统分区。

1) 调整分区大小

使用parted(命令行)或gparted(图形界面)来调整第一个和最后一个分区的大小。第一个分区应该在前面有大约200MiB的空间,而最后一个分区应该在末尾减去1MiB到2MiB的空间(任何一个都可以)。

2) 转换磁盘

运行

gdisk /dev/sdx

更改您要转换的设备是/dev/sdx
它应该告诉您它将转换分区表。
GPT fdisk (gdisk) version 0.6.14

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format.
THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by typing 'q' if
you don't want to convert your MBR partitions to GPT format!
***************************************************************


Command (? for help): 

现在添加一个新的分区,将其设置为“EFI系统”类型。它应该在开头找到空闲空间(我建议使用一些低扇区号,比如34),并自动使用所有的空闲空间。 示例中使用了一个4GB的USB闪存驱动器,已经有一个分区,并按照上述方式调整大小。
Command (? for help): n
Partition number (2-128, default 2): 2
First sector (34-7831518, default = 34) or {+-}size{KMGTP}: 
Information: Moved requested sector from 34 to 2048 in
order to align on 2048-sector boundaries.
Use 'l' on the experts' menu to adjust alignment
Last sector (2048-421887, default = 421887) or {+-}size{KMGTP}: 
Current type is 'Linux/Windows data'
Hex code or GUID (L to show codes, Enter = 0700): L
0700 Linux/Windows data    0c01 Microsoft reserved    2700 Windows RE          
4200 Windows LDM data      4201 Windows LDM metadata  7501 IBM GPFS            
7f00 ChromeOS kernel       7f01 ChromeOS root         7f02 ChromeOS reserved   
8200 Linux swap            8301 Linux reserved        8e00 Linux LVM           
a500 FreeBSD disklabel     a501 FreeBSD boot          a502 FreeBSD swap        
a503 FreeBSD UFS           a504 FreeBSD ZFS           a505 FreeBSD Vinum/RAID  
a800 Apple UFS             a901 NetBSD swap           a902 NetBSD FFS          
a903 NetBSD LFS            a904 NetBSD concatenated   a905 NetBSD encrypted    
a906 NetBSD RAID           ab00 Apple boot            af00 Apple HFS/HFS+      
af01 Apple RAID            af02 Apple RAID offline    af03 Apple label         
af04 AppleTV recovery      be00 Solaris boot          bf00 Solaris root        
bf01 Solaris /usr & Mac Z  bf02 Solaris swap          bf03 Solaris backup      
bf04 Solaris /var          bf05 Solaris /home         bf06 Solaris alternate se
bf07 Solaris Reserved 1    bf08 Solaris Reserved 2    bf09 Solaris Reserved 3  
bf0a Solaris Reserved 4    bf0b Solaris Reserved 5    c001 HP-UX data          
c002 HP-UX service         ef00 EFI System            ef01 MBR partition scheme
ef02 BIOS boot partition   fd00 Linux RAID            
Hex code or GUID (L to show codes, Enter = 0700): ef00
Changed type of partition to 'EFI System'

你现在应该有了EFI分区。
Command (? for help): p
Disk /dev/sdd: 7831552 sectors, 3.7 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 669247F2-37F7-4797-98F9-9CE56F7EA8C8
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 7831518
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1          421888         7829503   3.5 GiB     0700  Linux/Windows data
   2            2048          421887   205.0 MiB   EF00  EFI System

然后退出 gdisk
Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed, possibly destroying your data? (Y/N): y
OK; writing new GUID partition table (GPT).
The operation has completed successfully.

现在使用Gparted(或命令行mkfs.vfat -F 32 /dev/partition)将分区格式化为FAT32。

3)安装GRUB

这部分的保证比之前的少,因为我自己没有尝试过。

我不确定这一步,所以我会根据RAOF的说明猜测:

要切换到grub-efi,您需要:

  1. 找到您的EFI分区;将其挂载到/boot/efi中。将此添加到/etc/fstab¹
  2. 安装grub-efi软件包
  3. 将BIOS启动优先级从UEFI和Legacy切换为仅UEFI(或类似选项)

您应该确定要安装哪个版本的grub-efi

ioreg -l -p IODeviceTree | grep firmware-abi

如果显示为EFI32,则安装grub-efi-ia32软件包;如果显示为EFI64,则安装grub-efi-amd64软件包。您可以使用以下命令安装软件包:
sudo apt-get install <package name>

这可能只在EFI模式下起作用。
如果不起作用,你可以尝试一下这些逐步说明(在“在(U)EFI系统中安装GRUB2”下),一旦安装了grub-efi
配置(+双启动)
如果RAOK的说明有效,你应该能够将以下行添加到/etc/grub.d/40_custom文件中。
menuentry "Windows 7" {
        set root='(hd0,gpt1)'
        chainloader /EFI/microsoft/bootmgfw.efi
}

它假定Windows被GRUB识别为hd0。为了使其正常工作,可能需要更改为hd1
现在运行。
update-grub

更新配置文件。

参考资料和进一步阅读

我使用了几个来源。


哇,谢谢!但是我还在安装 grub-efi 到驱动器的过程中遇到了困难。我已经重新安装了操作系统并将驱动器设置为 GPT,但它仍然使用的是 grub-pc 而不是 grub-efi。 - Uri Herrera
如果你有选择的话(因为我没有任何UEFI设备,所以无法提供帮助),你需要以UEFI模式而不是BIOS/MBR模式启动Live CD。 - Portablejim
在 live cd 中(在安装之前),移除 grub-pc 并安装 grub-efi 如何? - Portablejim
我在Windows下使用Unetbootin制作了一个LiveUSB,里面有一个EFI文件夹,这是因为Windows的原因,所以我想这应该不会造成问题,可能我现在已经有grub-efi了,而我甚至都没有注意到,我现在接受你的答案。 - Uri Herrera
1哇,这个完美无缺地运行了,谢谢!我刚刚将Fedora 25和Windows 10的并行安装从MBR+BIOS迁移到了GPT+UEFI,而不需要重新安装任何东西。我在使用UEFI引导的Fedora 25 Live USB启动盘上执行了步骤1和2。对于第3步,我使用chroot方法从Live系统访问我的现有系统,具体操作可参考https://wiki.ubuntuusers.de/GRUB_2/Reparatur/#chroot-Methode 。我卸载了grub2,安装了grub2-efi和grub2-efi-modules,并明确重新安装了shim(如果不重新安装shim,Grub菜单将不会出现)。最后... - Philipp Hartwig
我不得不从我的Windows 10安装介质启动并进行启动修复。之后,Grub再次能够检测到我的Windows 10分区,现在从Grub菜单中两个系统都可以正常启动了。 - Philipp Hartwig
太长不看,但是我按照指令操作了,还真的成功了,哈哈。 - xdevs23
这个步骤在Ubuntu 16.04上无效: $ ioreg -l -p IODeviceTree | grep firmware-abi ioreg: command not found - Étienne
这些步骤如何适应在由Ubuntu安装程序自动设置的加密LVM/MBR驱动器上工作? - warsong
这太酷了。我完全不知道你实际上可以在两者之间转换。现在我需要理解GPT不区分主分区、扩展分区和逻辑分区的概念。 - SeligkeitIstInGott
2安装GRUB,我只是启动了一个Live USB并使用了boot-repair。https://askubuntu.com/questions/226061/how-to-install-the-boot-repair-tool-in-an-ubuntu-live-disc 感谢这篇帖子! - jbrock
为什么我们需要将EFI分区格式化为FAT32?(我正在将我的磁盘从MBR转换为GPT,它有两个分区(带有数据),我想在这个磁盘上安装Windows,所以我想将其转换为GPT。) - Rishabh Agrahari
为了安装grub,我启动了一个live CD,进入了chroot环境,并按照这里的说明使用install-grub命令 https://askubuntu.com/questions/235362/trying-to-reinstall-grub-2-cannot-find-a-device-for-boot-is-dev-mounted - wakjah
简化回答,不包括UEFI部分:https://superuser.com/a/1490384/79709 - steampowered
请勿在苹果Mac上使用。这样做的原因是什么呢?特别是,我有一个通常连接到我的MacBook上的外部磁盘,我想将其从MBR转换为GPT,以便创建一些可引导的MacOS分区。请勿在苹果Mac上使用。 为什么不应该在MacBook上这样做呢?尤其是,我有一个通常连接到我的MacBook上的外部磁盘,我想将其从MBR转换为GPT,以便创建一些可引导的MacOS分区。 - Kubuntuer82

这个答案不完整;我没有测试任何内容。它不太可能吃掉你的数据,但已经提醒你了!
我猜这里发生的事情是,你的BIOS优先从传统的MBR引导,所以可怜的UEFI Windows 7被忽视了。
UEFI的一个好处是,你应该不再需要担心Windows覆盖GRUB;它们应该都可以很好地共存于EFI分区上。因此,一种选择是切换到grub-efi注意:我不确定grub-efi是否理解MSDOS样式的分区;我认为它可以。如果不能,它将无法启动,你需要一个LiveCD来恢复。实际上,无论如何,都要准备一个LiveCD!
要切换到grub-efi,你需要:
  1. 找到你的EFI分区,将其挂载在/boot/efi。将此添加到/etc/fstab¹。
  2. 安装grub-efi软件包。
  3. 将BIOS启动优先级从UEFI和Legacy切换为仅UEFI(或类似选项)。

这样应该可以让你拥有一个UEFI引导的Ubuntu安装。如果没有成功,请启动你可靠的LiveCD(或Ubuntu备用安装CD - 选择“修复损坏的系统”选项 ☺),进入你的系统,并再次安装grub-pc


¹:这一步需要更详细的说明:您需要找到Linux内核所称之为EFI系统分区的位置。它可能是类似于/dev/sda2/dev/sdb3等等的路径。然后,您需要创建/boot/efi目录,并在/etc/fstab文件中添加一行内容。如果您的EFI分区是/dev/sdb3,那么您需要添加以下这行:

/dev/sdb3    /boot/efi    vfat    defaults    0    1

一旦你运行sudo mount /boot/efi,你应该会发现/boot/efi目录下有一个EFI文件夹,里面包含着Windows 7的一个子文件夹。
²:由于您有多个硬盘,找出分区的UUID可能是一个好主意,因为在添加/移除硬盘时,它将保持稳定,而/dev/sda2名称不能保证不会改变。尽管如此,在完成其他设置后,您仍然可以进行此操作。
您可以通过查看/dev/disk/by-uuid来找到UUID。例如,我得到的是:
$ ls /dev/disk/by-uuid -lah
total 0
drwxr-xr-x 2 root root 100 Dec  5 09:12 .
drwxr-xr-x 6 root root 120 Dec  5 09:12 ..
lrwxrwxrwx 1 root root  10 Dec  5 09:12 27fae347-4c7f-45cb-92d6-5f3d410599a1 -> ../../sda3
lrwxrwxrwx 1 root root  10 Dec  5 09:12 4405-64C8 -> ../../sda1
lrwxrwxrwx 1 root root  10 Dec  5 09:12 5243e250-8da5-4fea-aa63-61466022661d -> ../../dm-0

在我的情况下,我知道/dev/sda1是我的EFI系统分区,所以我有
UUID=4405-64C8  /boot/efi       vfat    defaults        0       1

在我的/etc/fstab文件中。

如果 Windows 7 是从 EFI 启动的,那么它会将它的引导加载程序放在 EFI 分区中 - 因此你 必须 拥有一个 ☺。这在标准的 Ubuntu 文件系统中 不会 可见。你需要使用类似 磁盘实用工具 程序来找到它。在找到并挂载 EFI 分区之前,grub-efi 将无法工作 - 它需要将其引导加载程序放在 EFI 系统分区中。 - RAOF
仍然无法启动进入Ubuntu,我已经使用livecd添加了fstab中的行,并在/boot目录下创建了efi目录,但似乎没有任何效果。 - Uri Herrera
现在你已经挂载了EFI分区,你需要运行sudo grub-installsudo update-grub来实际安装和设置GRUB在EFI分区上。你需要在chroot进入你的安装后执行这些操作(因为它需要了解关于硬盘上的安装的信息)。如果你需要帮助执行这些操作,我可以在答案中添加详细说明。 - RAOF
是的,请添加如何进入我的安装并重新安装grub的chroot方法。 - Uri Herrera
我按照这里的说明进行操作,但在新的EFI分区上遇到了问题。当我尝试安装Windows 10预览版时,安装程序显示以下错误信息:“Windows检测到EFI系统分区已格式化为NTFS。请将EFI系统分区格式化为FAT32并重新启动安装。”我通过使用随Windows安装程序提供的diskpart工具解决了这个问题,方法是删除第一个EFI分区,并使用create partition efi命令创建另一个分区。有关diskpart的详细信息,请参阅https://technet.microsoft.com/en-us/library/cc766465%28WS.10%29.aspx - Pathogen

我将我的操作系统安装在不同的硬盘上,这样GRUB2就不会被Windows引导程序替换,反之亦然。
这是理想的情况,所以你可能在分区表中至少有一个主分区是空闲的。
现在我的问题是,我如何改变/转换Ubuntu的驱动器,使其不再使用MBR而是使用GPT,并允许Windows启动?
你不必将MBR转换为GPT来进行UEFI引导,只需创建一个主FAT分区,安装“grub-efi-amd64-bin”软件包,并按照Add an ESP to an existing installation with MBR中的说明进行操作,这应该适用于当前版本的Ubuntu。

1被低估的答案。Windows固执地要求GPT+UEFI或MBR+BIOS引导,但Linux允许混搭,grub可以链式加载另一个磁盘或直接引导Windows 7的bootmgr。 - Tim G
@timg 这可能是事后的真相,但不幸的是,如果你从头开始安装Windows 10,似乎安装程序会要求你使用GPT分区,如果你是通过EFI启动的话,否则无法继续安装。 - Merk
@Merk哦,我使用Windows安装程序的方式有所不同:按下Shift-F10可以打开命令行,然后你可以使用diskpartdism /apply-image,再加上bcdboot(当然这两个命令还有更多选项)来安装MBR或GPT,无论你是如何引导的。 - Tim G

为了补充Portablejim的回答(对于从MBR转换到GPT非常有帮助,谢谢!),你可以使用Boot-Repair重新安装grub。当我在完成第三步时失败,并且当Windows 10的安装导致Linux启动选项消失时,它像魔法一样修复了我的引导问题。

我有一张只有Ubuntu的光盘,使用Boot-Repair作为第三步非常顺利! - Rael Gugelmin Cunha