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 分区。以下步骤是根据记忆进行的;可能包含拼写错误或其他错误。去做这个:
- 选择其中一个分区。
- 备份您要缩小的分区上的所有重要数据。
- 缩小所选分区。如果缩小 Ubuntu 分区,您可能会使用 GParted。上次我检查时,这需要启动紧急磁盘,但这可能已经改变。如果缩小 Windows 分区,GParted应该能够做到这一点,但使用 Windows 工具可能会更安全。
- 在释放的空间中创建一个新的 ESP。如果您使用 GParted,请创建一个 FAT 分区并确保在其上设置“esp”(又名“boot”)标志。创建分区后,您可能需要重新启动。事实上,我强烈建议您这样做,因为分区号可能会更改,而且您也不想犯错并意外损坏一个分区而误以为它是另一个分区。
- 将旧 ESP 的数据复制到新 ESP。这可以通过将新 ESP 挂载到某处并使用
cp
、、tar
GUI 文件管理器或其他工具将文件从/boot/efi
临时挂载点复制到临时挂载点来完成。请确保复制整个目录树(例如,cp -r
而不仅仅是cp
)。 - 创建新的 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"
- 输入
sudo efibootmgr
并记下BootOrder
变量。每个条目都标识后面的一个Boot####
条目。新顺序应该将您的新ubuntu 2
选项放在列表的第一位。 - 输入
sudo blkid /dev/nvme0n1p1
并记下 UUID 值。 - 类型
sudo blkid /dev/sda3
(或新 ESP 的设备类型)并识别其 UUID 值。 - 编辑
/etc/fstab
。找到安装的选项/boot/efi
;它应该具有您为当前 ESP 确定的 UUID 值。将该 UUID 值更改为与您为新 ESP 找到的 UUID 值匹配。 - 重新启动。如果您所做的一切都完全正确,计算机应该会从新的 ESP 启动,并在 处安装新的 ESP
/boot/efi
。- 键入
df /boot/efi
以检查新的 ESP 是否安装在那里。 - 输入
efibootmgr
并检查BootCurrent
变量。它应该与ubuntu 2
您创建的新条目匹配。
- 键入
- 输入
sudo update-grub
。这将更新您的 GRUB 配置,并使其检测新 ESP 上的 Windows 引导加载程序。 - 再次重新启动并验证您是否可以启动 Windows。
- 使用 Windows 或 Ubuntu 工具删除旧 ESP。其空间可能不值得回收。
- 再次重新启动并验证您仍然可以启动 Ubuntu 和 Windows。
- 安装系统更新;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 。