如何在 /boot/efi/ 中腾出空间

如何在 /boot/efi/ 中腾出空间

Ubuntu 通知我,我的 Dell Optiplex 7070 系统有一个固件升级,但是当我尝试安装它时,出现错误消息,提示空间不足:

/boot/efi does not have sufficient space, required 33.6 MB, got 30.9 MB

根据描述,这是一个“解决安全漏洞”的更新,所以如果可能的话,我想安装这个更新。

我在这个论坛上看到过一个非常类似的问题(如何在不调整分区大小的情况下在 /boot/efi 中腾出空间?),但那里的答案建议要么在终端中运行更新(这也是我首先所做的,也是导致上述错误的原因),要么移动或删除文件和/或目录,而我对此并不完全满意。

我的 PC 具有双启动功能,Windows 预装在主硬盘上,Ubuntu 22.04 安装在单独的 SSD 上。@PonJar 对上述问题的一条评论表明了以下内容:

有点牵强。这台机器上有多少个 HDD/SDD/等?我有一台带有两个存储设备的台式机。两者都有一个 EFI 分区。一个自最初安装 Windows 以来一直未动过。另一个有启动 Linux 的东西和启动 Windows 的东西的副本。这个设备首先启动,我可以选择 Linux,家人可以选择 Windows。除了 Windows 文件夹的简单副本外,我从未碰过原始 EFI。因此,如果您有第二台设备,您可以创建更大的 EFI 并且从不碰原始 EFI。可能不适合您的场景,但我想以防万一提到它。

这看起来可能对我有用,但我不确定如何做到这一点。所以我的问题是:如何创建更大的 EFI?或者,有没有一种安全的方法可以在我现有的 EFI 上腾出空间?

为了完整起见,这是我的 EFI 中目前的内容:

163K    /boot/efi/EFI/Microsoft/Boot/bg-BG
207K    /boot/efi/EFI/Microsoft/Boot/cs-CZ
205K    /boot/efi/EFI/Microsoft/Boot/da-DK
213K    /boot/efi/EFI/Microsoft/Boot/de-DE
216K    /boot/efi/EFI/Microsoft/Boot/el-GR
155K    /boot/efi/EFI/Microsoft/Boot/en-GB
200K    /boot/efi/EFI/Microsoft/Boot/en-US
209K    /boot/efi/EFI/Microsoft/Boot/es-ES
163K    /boot/efi/EFI/Microsoft/Boot/es-MX
157K    /boot/efi/EFI/Microsoft/Boot/et-EE
207K    /boot/efi/EFI/Microsoft/Boot/fi-FI
167K    /boot/efi/EFI/Microsoft/Boot/fr-CA
213K    /boot/efi/EFI/Microsoft/Boot/fr-FR
161K    /boot/efi/EFI/Microsoft/Boot/hr-HR
213K    /boot/efi/EFI/Microsoft/Boot/hu-HU
207K    /boot/efi/EFI/Microsoft/Boot/it-IT
182K    /boot/efi/EFI/Microsoft/Boot/ja-JP
182K    /boot/efi/EFI/Microsoft/Boot/ko-KR
159K    /boot/efi/EFI/Microsoft/Boot/lt-LT
159K    /boot/efi/EFI/Microsoft/Boot/lv-LV
203K    /boot/efi/EFI/Microsoft/Boot/nb-NO
209K    /boot/efi/EFI/Microsoft/Boot/nl-NL
209K    /boot/efi/EFI/Microsoft/Boot/pl-PL
207K    /boot/efi/EFI/Microsoft/Boot/pt-BR
207K    /boot/efi/EFI/Microsoft/Boot/pt-PT
55K /boot/efi/EFI/Microsoft/Boot/qps-ploc
159K    /boot/efi/EFI/Microsoft/Boot/ro-RO
206K    /boot/efi/EFI/Microsoft/Boot/ru-RU
161K    /boot/efi/EFI/Microsoft/Boot/sk-SK
159K    /boot/efi/EFI/Microsoft/Boot/sl-SI
161K    /boot/efi/EFI/Microsoft/Boot/sr-Latn-RS
204K    /boot/efi/EFI/Microsoft/Boot/sv-SE
205K    /boot/efi/EFI/Microsoft/Boot/tr-TR
161K    /boot/efi/EFI/Microsoft/Boot/uk-UA
174K    /boot/efi/EFI/Microsoft/Boot/zh-CN
174K    /boot/efi/EFI/Microsoft/Boot/zh-TW
14M /boot/efi/EFI/Microsoft/Boot/Fonts
15K /boot/efi/EFI/Microsoft/Boot/Resources/en-US
182K    /boot/efi/EFI/Microsoft/Boot/Resources
54K /boot/efi/EFI/Microsoft/Boot/CIPolicies/Active
55K /boot/efi/EFI/Microsoft/Boot/CIPolicies
29M /boot/efi/EFI/Microsoft/Boot
57K /boot/efi/EFI/Microsoft/Recovery
29M /boot/efi/EFI/Microsoft
1.9M    /boot/efi/EFI/Boot
1.0K    /boot/efi/EFI/ubuntu/fw
4.3M    /boot/efi/EFI/ubuntu
32M /boot/efi/EFI/Dell/Bios/Recovery
32M /boot/efi/EFI/Dell/Bios
35K /boot/efi/EFI/Dell/logs
32M /boot/efi/EFI/Dell
67M /boot/efi/EFI
1.0K    /boot/efi/System Volume Information/ClientRecoveryPasswordRotation
1.0K    /boot/efi/System Volume Information/AadRecoveryPasswordDelete
16K /boot/efi/System Volume Information
67M /boot/efi

编辑:感谢@oldfred提供的这些命令,输出是

NAME        FSTYPE   SIZE FSUSED LABEL PARTLABEL                    MOUNTPOINT
sda                232.9G                                           
├─sda1      swap    15.3G                                           [SWAP]
└─sda2      ext4   217.6G  95.4G                                    /
nvme0n1            238.5G                                           
├─nvme0n1p1 vfat     100M  66.6M       EFI system partition         /boot/efi
├─nvme0n1p2           16M              Microsoft reserved partition 
├─nvme0n1p3 ntfs   237.8G              Basic data partition         
└─nvme0n1p4 ntfs     565M                                           

不确定驱动器上是否有未分配的空间,因此,为了确保万无一失,以下是输出sudo fdisk -lu

Disk /dev/loop0: 4 KiB, 4096 bytes, 8 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop1: 116.7 MiB, 122363904 bytes, 238992 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop2: 116.79 MiB, 122458112 bytes, 239176 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop3: 55.61 MiB, 58310656 bytes, 113888 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop4: 55.61 MiB, 58310656 bytes, 113888 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop5: 63.27 MiB, 66347008 bytes, 129584 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop6: 63.28 MiB, 66355200 bytes, 129600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop7: 72.91 MiB, 76447744 bytes, 149312 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/nvme0n1: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: BC501 NVMe SK hynix 256GB               
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 5B252C4C-013E-4AFF-9F85-B7FEC562A83E

Device             Start       End   Sectors   Size Type
/dev/nvme0n1p1      2048    206847    204800   100M EFI System
/dev/nvme0n1p2    206848    239615     32768    16M Microsoft reserved
/dev/nvme0n1p3    239616 498954356 498714741 237.8G Microsoft basic data
/dev/nvme0n1p4 498956288 500113407   1157120   565M Windows recovery environment


    Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors
    Disk model: Samsung SSD 860 
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: gpt
    Disk identifier: 8F38827F-BAAA-4005-8821-47DE99EED3BB
    
    Device        Start       End   Sectors   Size Type
    /dev/sda1      2048  31999999  31997952  15.3G Linux swap
    /dev/sda2  32000000 488396799 456396800 217.6G Linux filesystem
    
    
    Disk /dev/loop8: 72.91 MiB, 76447744 bytes, 149312 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop9: 12.98 MiB, 13611008 bytes, 26584 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop10: 7 MiB, 7335936 bytes, 14328 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop11: 239.12 MiB, 250732544 bytes, 489712 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop12: 240.61 MiB, 252301312 bytes, 492776 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop13: 162.87 MiB, 170778624 bytes, 333552 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop14: 164.76 MiB, 172761088 bytes, 337424 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop15: 346.3 MiB, 363118592 bytes, 709216 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop16: 346.33 MiB, 363151360 bytes, 709280 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop17: 81.26 MiB, 85209088 bytes, 166424 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop18: 91.69 MiB, 96141312 bytes, 187776 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop19: 329.64 MiB, 345653248 bytes, 675104 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop20: 329.5 MiB, 345509888 bytes, 674824 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop21: 424.17 MiB, 444772352 bytes, 868696 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop22: 45.93 MiB, 48156672 bytes, 94056 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop23: 45.93 MiB, 48160768 bytes, 94064 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop24: 49.83 MiB, 52248576 bytes, 102048 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop25: 49.84 MiB, 52260864 bytes, 102072 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop26: 304 KiB, 311296 bytes, 608 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/loop27: 428 KiB, 438272 bytes, 856 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes

答案1

您的 EFI 系统分区 (ESP;安装在 上的分区/boot/efi) 大小只有 100 MiB,很小。如果我没记错的话,微软曾经创建过这种大小的 ESP,但几年前他们提高了默认大小,因为他们意识到它太小了。因此,在我看来,您正在寻找一种调整 ESP 大小或创建更大 ESP 的方法是正确的。不幸的是,这不是一件容易的事。

调整 ESP 的大小是可能的,但需要移动以下分区(即大概 /dev/nvme0n1p2-- 您不想调整大小的 Microsoft 保留分区)并调整其后的分区(可能/dev/nvme0n1p3是 Windows 分区)的大小开始分区的大小。从头开始调整分区大小既费时又危险,因此除非您想删除此计算机上的 Windows,否则我不建议使用此方法。另一方面,如果您有良好的备份和足够的时间,那么它可能比我将要描述的方法更简单。

更安全的选择是找到一个可以从末尾调整大小的分区,将其缩小一个合适的大小(我建议 550 MiB,但四舍五入到 1 GiB 也是合理的),然后在那里创建一个新的 ESP。您同时拥有/dev/sda/dev/nvme0n1驱动器,并且它们都有大分区,您可能可以承受适当的缩小量,因此两者都是选项。/dev/sda2是您的 217.6 GiB Ubuntu 根(/)分区,并且/dev/nvme0n1p3是 237.8 GiB Windows 分区。以下步骤是根据记忆进行的;可能包含拼写错误或其他错误。去做这个:

  1. 选择其中一个分区。
  2. 备份您要缩小的分区上的所有重要数据。
  3. 缩小所选分区。如果缩小 Ubuntu 分区,您可能会使用 GParted。上次我检查时,这需要启动紧急磁盘,但这可能已经改变。如果缩小 Windows 分区,GParted应该能够做到这一点,但使用 Windows 工具可能会更安全。
  4. 在释放的空间中创建一个新的 ESP。如果您使用 GParted,请创建一个 FAT 分区并确保在其上设置“esp”(又名“boot”)标志。创建分区后,您可能需要重新启动。事实上,我强烈建议您这样做,因为分区号可能会更改,而且您也不想犯错并意外损坏一个分区而误以为它是另一个分区。
  5. 将旧 ESP 的数据复制到新 ESP。这可以通过将新 ESP 挂载到某处并使用cp、、tarGUI 文件管理器或其他工具将文件从/boot/efi临时挂载点复制到临时挂载点来完成。请确保复制整个目录树(例如,cp -r而不仅仅是cp)。
  6. 创建新的 EFI 启动管理器条目以指向 GRUB 2(或用于启动 Ubuntu 的任何程序)和新 ESP 上的 Microsoft 启动加载程序。这将涉及输入两个命令,每个启动程序一个。细节会有所不同,但命令看起来大致如下(选项-d指向所有的磁盘并-p指定磁盘上的分区号)。 请确保按以下顺序输入它们:
    • sudo efibootmgr -c -d /dev/sda -p 3 -l /EFI/Microsoft/boot/bootmgfw.efi -L "Windows boot loader"
    • sudo efibootmgr -c -d /dev/sda -p 3 -l /EFI/ubuntu/shimx64.efi -L "ubuntu 2"
  7. 输入sudo efibootmgr并记下BootOrder变量。每个条目都标识后面的一个Boot####条目。新顺序应该将您的新ubuntu 2选项放在列表的第一位。
  8. 输入sudo blkid /dev/nvme0n1p1并记下 UUID 值。
  9. 类型sudo blkid /dev/sda3(或新 ESP 的设备类型)并识别其 UUID 值。
  10. 编辑/etc/fstab。找到安装的选项/boot/efi;它应该具有您为当前 ESP 确定的 UUID 值。将该 UUID 值更改为与您为新 ESP 找到的 UUID 值匹配。
  11. 重新启动。如果您所做的一切都完全正确,计算机应该会从新的 ESP 启动,并在 处安装新的 ESP /boot/efi
    • 键入df /boot/efi以检查新的 ESP 是否安装在那里。
    • 输入efibootmgr并检查BootCurrent变量。它应该与ubuntu 2您创建的新条目匹配。
  12. 输入sudo update-grub。这将更新您的 GRUB 配置,并使其检测新 ESP 上的 Windows 引导加载程序。
  13. 再次重新启动并验证您是否可以启动 Windows。
  14. 使用 Windows 或 Ubuntu 工具删除旧 ESP。其空间可能不值得回收。
  15. 再次重新启动并验证您仍然可以启动 Ubuntu 和 Windows。
  16. 安装系统更新;ESP 上的空间应该没有问题。

很有可能在某个地方出现问题,特别是如果我输入错误或您跳过某个步骤或自己输入错误。因此,您可能需要进行故障排除。不过,在删除旧 ESP 之前,即使出现问题,计算机也应该可以启动。(但是,如果您调整大小的分区已损坏,则无法启动它;这就是我明确说要备份它的原因。)

一个可以节省一点时间并且可能更安全的方法是保留两个 ESP,保留原来的 100 MiB ESP 用于 Windows,只将 GRUB 2 移动到新的 ESP。要做到这一点,您需要遵循前面的步骤;但是:

  • 在步骤#5中,您可以从复制中省略Windows文件(来自/boot/efi/EFI/Microsoft),或者在复制后从目标中删除它们。
  • 在步骤#6中,您将省略为 Windows 创建新的 EFI 启动管理器条目;只需为 Ubuntu 创建一个。
  • 步骤#12可能没有必要。
  • EFI/ubuntu在步骤#14中,您可以将其安装到某处并删除其包含的目录,而不是删除旧的 ESP 。

相关内容