如何调整 EFI 系统分区的大小?

如何调整 EFI 系统分区的大小?

我想将 EFI 系统分区的大小增加到 750MiB,这样我就可以与 Windows 10 一起安装 Arch Linux,因为 Windows 给我的 EFI 系统分区只有 100MiB,太小了。Arch Linux 建议您将 ESP 安装在/boot而不是/boot/efi,而 100MiB 对于来说太小了/boot。我不想碰恢复分区。

答案1

这个问题是 Google 上“如何调整 EFI 系统分区大小”搜索结果中的热门之一(这并不奇怪,因为这就是问题标题),然而,尽管此处的当前答案包含针对 OP 情况的良好建议和一般有用的信息,但实际上并没有尝试回答该问题。我之前相当简洁(现已删除)的回答尝试被否决了,因此这里有一个更全面的答案。

您之所以读到这篇文章,很可能是因为您尝试过显而易见的方法(使用 gparted),并收到错误“GNU Parted 无法将此分区调整为该大小。我们正在努力解决!”。您可能还尝试过在 Windows 内部执行此操作(使用磁盘管理),结果却发现 Windows 根本不愿意对 ESP 执行任何操作。

好吧,除了实际调整分区大小之外,最好的办法就是重新创建它。以下是执行此操作的详细步骤:

  1. 如果您要调整启动磁盘的 ESP 大小,请确保手头有一些可启动的应急媒体,以便在出现问题时修复系统。在执行任何磁盘分区操作之前备份数据通常是一个好主意。

  2. 如果您要扩大 ESP,请使用您最喜欢的分区工具(例如 gparted)通过移动或调整其后面的任何分区的大小来腾出空间。

  3. 安装 ESP(如果尚未安装,例如在/boot或上/boot/efi):

     # mount /dev/sdx1 /mnt # replace sdx1 with ESP
    
  4. 备份其内容:

     # mkdir ~/esp
     # rsync -av /mnt/ ~/esp/
    
  5. 卸载 ESP:

     # umount /mnt
    
  6. 删除并重新创建 ESP:

     # gdisk /dev/sdx # replace sdx with disk containing ESP
     p (list partitions)
     (ensure the ESP is the first partition)
     d (delete partition)
     1 (select first partition)
     n (create partition)
     Enter (use default partition number, should be 1)
     Enter (use default first sector, should be 2048)
     Enter (use default last sector, should be all available space)
     EF00 (hex code for EFI system partition)
     w (write changes to disk and exit)
    
  7. 格式化 ESP:

     # partprobe /dev/sdx
     # mkfs.fat -F32 /dev/sdx1
    
  8. 恢复 ESP 的内容:

     # mount /dev/sdx1 /mnt
     # rsync -av ~/esp/ /mnt
    
  9. 更新 /etc/fstab 中的 EFI 条目

     # blkid | grep EFI
     # nano /etc/fstab
     UUID=XXXX-XXXX /boot vfat umask=0077 0 2 # Replace with UUID from blkid
    
  10. 如果您使用 GRUB,您可能需要更新或重新生成其配置文件(/boot/grub/grub.cfg),例如通过运行update-grub

这应该就是全部了。我已成功使用上述过程调整了 Windows 安装的 ESP 大小,该安装的 ESP 太小(50 MB),无法让 Windows 升级到秋季创意者更新(在调整 ESP 大小之前,Windows 更新失败,错误代码为 0x8E5E03FB,更新助手出现错误代码 0xc1900200)。

答案2

Arch 社区已经采取了Freedesktop.org 引导加载程序规范铭记在心。据我所知,Arch 及其衍生产品是唯一这样做的发行版,即使在 Arch 中,这也不是必需的。Boot Loader 规范建议使用共享 FAT 分区(例如 ESP)作为存储 Linux 内核的位置,以及一个系统来在此分区上将一个发行版的内核与另一个发行版的内核隔离,并管理内核的引导加载程序配置。

引导加载程序规范旨在解决多启动计算机上 Linux 发行版共存的一些实际问题;但是,由于它只被一个主要发行版采用,即使存在了几年,它也没有提供任何实际好处。此外,引导加载程序规范与 systemd-boot 启动管理器紧密相关,除了 Arch 社区外,后者并不受欢迎。尽管 systemd-boot 有一些优势,但除非你对该领域足够熟悉,能够理解这些优势并知道你需要它们,否则你可能不想以奇怪的方式开始设置(例如在 上安装 ESP /boot)只是为了启用 systemd-boot 的使用。此外,systemd-boot 有一个巨大的缺点:它只能从启动它的分区启动后续引导程序(包括 Linux 内核)。这反过来意味着,如果您使用 systemd-boot,您几乎必须将 systemd-boot、Linux 内核和其他操作系统(如 Windows)的引导加载程序存储在一个分区 —— ESP 上。这符合引导加载程序规范的愿景,但它也带来了自己的问题。

话虽如此,如果你想扩大 ESP,你可以用各种工具来实现;但是,这意味着你需要从其起点缩小下一个分区。这比从其末尾缩小分区更危险,更耗时,所以我强烈建议备份以下分区。此外,在 Windows 计算机上,ESP 后面的分区很可能是 Microsoft 保留分区,它基本上只是 Windows 用作临时空间的空分区。它通常没有文件系统,因此大多数分区工具不允许您缩小它 - 并且 Windows 希望它具有特定大小(100 MiB 或 128 MiB,IIRC)。您可能需要缩小 Microsoft 保留分区后面的分区,删除 Microsoft 保留分区,然后创建一个新的分区。这非常麻烦,并且大大增加了安装新操作系统的风险。

相反,你可能想创建一个新的ESP 位于磁盘的其他位置。为 Arch Linux 腾出空间后,您可以为 Arch Linux 创建新的 ESP 和其他分区。根据您使用的启动管理器,您可以简单地拥有单独的 Arch 和 Windows ESP;或者您可以将 Windows 引导加载程序文件移动到新的 ESP 并删除或重新利用原始 ESP。请注意,由于 systemd-boot 无法启动驻留在其自身以外的分区上的引导加载程序,如果您安装 ESP 的原因是/boot想要使用 systemd-boot,则必须将 Windows 引导加载程序移动到新的 ESP,如果您希望从 systemd-boot 启动它。此外,上次我检查时(使用的是 Windows 7,因此可能不再如此),如果 Windows 安装程序在磁盘上看到两个 ESP,它会变得非常混乱和故障,从而无法在这样的磁盘上安装 Windows。因此,如果您使用两个 ESP 进行设置,您可能会遇到问题。通过临时更改非 Windows ESP 的分区类型代码可以轻松克服此类问题,但您必须了解这种解决方法。

总之,虽然我认识到 Arch 社区喜欢挂载 ESP/boot并用它来存储(通常)通过 systemd-boot 启动的 Linux 内核,但这种方法会带来麻烦,而且几乎没有显著的好处。总的来说,你最好使用 GRUB 2 或我自己的rEFInd,两者都适合你的小型 ESP 并启动存储在其他地方的内核。我的Linux 的 EFI 引导加载程序页面更详细地描述了 Linux 引导加载程序和引导管理器选项。

答案3

为了补充 Vladimir Panteleev 的回答,您可以重新创建具有相同分区 UUID 和卷 ID 的 efi 分区,而不是将 fstab 更新为新的 UUID。具体做法如下:

  • 用来blkid记录旧的UUIDPARTUUID
  • 创建分区后,运行sgdisk -u 1:OLD_PARTUUID /dev/sdx
  • 创建文件系统时,使用mkfs.fat -i OLD_UUID -F32 /dev/sdx1

答案4

双启动操作系统涉及一些内容。

我首先要建议的是不要使用现有的 EFI 系统分区。那是用来启动 Windows 的。不要弄乱它。

相反,打开磁盘管理,将 Windows 分区(主分区)缩小一定量(无论您想在 Arch Linux 中使用多少)。通常,对于可以缩小的量总是有一个设定的限制,即使磁盘上似乎有足够的空间。这个“问题”在其他地方已经解决,所以我不会在这里解释。只要记住哪个是哪个就行。例如,大分区有窗口,小分区是空的等等。

不要忘记禁用 Windows 中的快速启动 - 这实际上是让您的 PC 休眠而不是关闭它,以实现“快速启动”。如果您改为启动 Linux,则可能会丢失 Windows 系统中的数据。

启动 Linux 安装环境(从 USB 或其他设备),然后设置您在 Windows 中创建的可用空间,并将其设置为 Linux 系统分区。只需记住哪个分区是哪个即可。例如,不要意外重新格式化 Windows 分区 - 使用您上面记录的分区大小进行仔细检查。

相关内容