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

Uri*_*era 80 grub2 uefi grub-efi gpt

我最近升级了我的 PC,我的新主板 (ASUS M5A99X EVO) 使用 UEFi 而不是常规 MBR 选项。

我有一个 Ubuntu 11.10 安装,当我有我以前的硬件 (MSI MS 7267) 时,Ubuntu 单独启动很好,Windows 7 也是如此,但是 Windows 7 使用 UEFI (GPT) 启动,而 Ubuntu 使用 MBR。

我的操作系统位于不同的驱动器中,因此 GRUB2 不会被 Windows 引导加载程序替换,反之亦然,正如我所说的,两个操作系统都可以自行正常启动,但要做到这一点,我必须断开一个驱动器,在这种情况下,Ubuntu 驱动器作为它会阻止 Windows 加载。

现在我的问题是,如何更改/转换 Ubuntu 的驱动器,以便它使用 GPT 而不是使用 MBR 并允许 Windows 启动?。

最好不要重新安装整个系统或丢失任何数据。

如果我要擦除驱动器,如何在 GPT、UEFI 中安装 Ubuntu,无论它是什么模式?。

我已经使用 gdisk 从 MBR 转换为 GPT,但现在 Ubuntu 无法启动,好像 grub 无法启动。

我已经重新安装了操作系统,默认情况下驱动器现在是 GPT,但grup-pc仍在使用而不是grub-efi.

如何让 Ubuntu 从 EFI 启动?

Por*_*jim 133

目录:

  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)的磁盘,以及分区映射和唯一的盘标识符的开始的代码段。

要将 GRUB 安装到带有 MBR 的磁盘上,GRUB 会在 MBR 中放置一个小程序,以便从磁盘的另一部分加载 GRUB 的其余部分。(这样做是因为 MBR 太小而无法包含所有 GRUB)。选择的空间是MBR和第一个分区之间的空间,通常存在。

GPT 是如何指定分区的标准。它确实有一个“保护性”的 MBR,但这只是为了允许基于 BIOS 的计算机启动和停止只知道 MBR 的工具试图破坏 GPT。它可以有

(如何处理 GPT 取决于它是使用 BIOS(或处于 BIOS 模拟模式的 UEFI 系统)还是 UEFI 引导。我将重点关注与问题相关的 UEFI)。

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

转换

第一的...

我们正在使用分区表,因此无法保证安全。这是一个有风险的操作。但是,该方法不应丢失数据。

其他人遇到此问题:请勿在 Apple Mac 上使用。

现在...

您需要在 Live CD(或安装到不同磁盘的其他 linux 安装)上执行此操作。

在处理 GPT 磁盘时,我们需要使用 GPT 感知程序。'GPT fdisk' 是一个很好的工具,我将使用它。它可以被调用gptfdiskgdisk取决于发行版(Ubuntu称之为gdisk)。Parted(和 Gparted)也支持 GPT,因此可以“安全地”与 GPT 磁盘一起使用。

要转换,您需要:

  1. 调整分区大小以适合 GPT 数据和 EFI 系统分区。
  2. 转换磁盘并添加分区
  3. 将 GRUB 安装到 EFI 系统分区。

1) 调整分区大小

使用parted(命令行)或gparted(GUI)调整第一个和最后一个分区的大小。第一个分区之前应该有大约 200MiB,最后一个分区应该有 1MiB 到 2MiB(两者都可以)。

2) 转换磁盘

gdisk /dev/sdx
Run Code Online (Sandbox Code Playgroud)

更改要转换的设备是/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): 
Run Code Online (Sandbox Code Playgroud)

现在添加一个新分区,使其类型为“EFI 系统”。它应该在开始时找到可用空间(我建议使用一些低扇区号,例如 34)并自动使用所有可用空间。这些示例使用一个 4GB USB 闪存驱动器,其中已经有 1 个分区,按上述调整大小。

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'
Run Code Online (Sandbox Code Playgroud)

您现在应该拥有 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
Run Code Online (Sandbox Code Playgroud)

然后退出 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.
Run Code Online (Sandbox Code Playgroud)

现在使用 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 only(或类似选项)

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

ioreg -l -p IODeviceTree | grep firmware-abi
Run Code Online (Sandbox Code Playgroud)

如果它说EFI32安装grub-efi-ia32包,如果它说EFI64 安装grub-efi-amd64包。您可以使用以下命令安装软件包

sudo apt-get install <package name>
Run Code Online (Sandbox Code Playgroud)

这可能只有在您以 EFI 模式启动时才有效。

如果它不起作用,您可以在安装后尝试这些分步说明(在“在 (U)EFI 系统中安装 GRUB2”下)grub-efi

配置(+双启动)

如果 RAOK 的说明有效,您应该能够将以下行添加到 /etc/grub.d/40_custom

menuentry "Windows 7" {
        set root='(hd0,gpt1)'
        chainloader /EFI/microsoft/bootmgfw.efi
}
Run Code Online (Sandbox Code Playgroud)

它假定 Windows 被hd0GRUB识别。它可能需要更改为hd1才能工作。

现在运行

update-grub
Run Code Online (Sandbox Code Playgroud)

更新配置文件。

参考资料和进一步阅读

我使用了几个来源。

  • 为了安装 GRUB,我只是启动了一个实时 USB 并使用了引导修复。https://askubuntu.com/questions/226061/how-to-install-the-boot-repair-tool-in-an-ubuntu-live-disc 感谢这篇文章! (2认同)

RAO*_*AOF 9

这个答案是不完整的;我没有测试过任何这些。它不太可能吃掉您的任何数据,但您已被警告!

我猜这里发生的事情是您的 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 and LegacyUEFI only(或类似的选项)

应该让您拥有 UEFI 引导的 Ubuntu 安装。如果没有,请启动您可信赖的 LiveCD(或 Ubuntu Alternate 安装 CD - “修复损坏的系统”选项是您所追求的?),chroot 进入您的系统,然后grub-pc再次安装。


¹:此步骤的更多详细信息:您需要找到 Linux 内核对您的 EFI 系统分区的调用。这将是这样的/dev/sda2/dev/sdb3或such²。然后,您需要创建/boot/efi目录,并在/etc/fstab. 如果您的 EFI 分区是/dev/sdb3,那么您将添加以下行:

/dev/sdb3    /boot/efi    vfat    defaults    0    1
Run Code Online (Sandbox Code Playgroud)

运行后,sudo mount /boot/efi您应该会发现其中/boot/efi包含一个EFI目录,其中包含一个用于 Windows 7 的子目录。


²:由于您有多个硬盘驱动器,因此找出分区的 UUID 可能是个好主意,因为在添加/删除硬盘驱动器的情况下它会很稳定,但/dev/sda2不能保证名称不会改变。不过,这可以在您完成其他所有设置后完成。

您可以通过查看来找到 UUID /dev/disk/by-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
Run Code Online (Sandbox Code Playgroud)

就我而言,我知道/dev/sda1是我的 EFI 系统分区,所以我有

UUID=4405-64C8  /boot/efi       vfat    defaults        0       1
Run Code Online (Sandbox Code Playgroud)

在我的/etc/fstab.