在现有的问题中,这看起来与我正在做的事情最相似,只是我尝试扩大我的分区,但我不知道为什么 /boot/ 和 /boot/efi 安装了不同的分区,以及如何继续而不用担心。
到目前为止,我创建了一个新分区,将其安装到/newBoot
并执行了操作sudo rsync -a /boot/ /newBoot/
,所以我假设我在新分区中拥有要切换的所有相关文件。
$ lsblk -e 7 -o name,fstype,size,fsused,label,partlabel,mountpoint,uuid,partuuid
NAME FSTYPE SIZE FSUSED LABEL PARTLABEL MOUNTPOINT UUID PARTUUID
sda 7.3T
└─sda1 crypto 7.3T 4dffc196-9926-43d9-a7c8-38898681f402 85b3a656-4886-4b37-b9c1-2acb0158587a
...
nvme0n1 931.5G
├─nvme0n1p1 vfat 512M 5.3M EFI System Partition
│ /boot/efi FD0E-EECA 587cf214-f068-4879-a833-9dffa5ec6e3d
├─nvme0n1p2 ext2 488M 313.7M /boot 606a1976-d1c2-4246-a256-a8afddb04f84 2e10e277-560f-4f5e-abce-1dce5187a7f0
...
└─nvme0n1p4 vfat 1.5G NEWBOOT newboot 530D-4828 ea886018-714f-46fb-8f21-785c74543891
$ efibootmgr -v
BootCurrent: 0004
Timeout: 1 seconds
BootOrder: 0004
Boot0004* ubuntu HD(1,GPT,587cf214-f068-4879-a833-9dffa5ec6e3d,0x800,0x100000)/File(\EFI\UBUNTU\SHIMX64.EFI)
$ sudo efibootmgr -c -L ubuntuNew -l \\EFI\\UBUNTU\\SHIMX64.EFI
$ efibootmgr -v
BootCurrent: 0004
Timeout: 1 seconds
BootOrder: 0000,0004
Boot0000* ubuntuNew HD(1,GPT,85b3a656-4886-4b37-b9c1-2acb0158587a,0xffff,0x3a3535ca9)/File(\EFI\UBUNTU\SHIMX64.EFI)
Boot0004* ubuntu HD(1,GPT,587cf214-f068-4879-a833-9dffa5ec6e3d,0x800,0x100000)/File(\EFI\UBUNTU\SHIMX64.EFI)
因此,虽然我不明白为什么当前文件夹涉及两个分区/boot
,但我认为一个也应该可以工作?至少这样阅读了上面链接的问题的选定答案,对吧?
现在还缺少什么?/etc/fstab
?
$ cat /etc/fstab
...
UUID=606a1976-d1c2-4246-a256-a8afddb04f84 /boot ext2 defaults 0 2
...
UUID=FD0E-EECA /boot/efi vfat umask=0077 0 1
...
现在根据lsblk
and efibootmgr -v
(感谢@oldfred),新的第一个启动选项将要使用sda1
and not nvme0n1p4
。sda1
是一个外部驱动器,我当然不想从中启动。怎么就默认了呢??
- 缺少什么更改,因此它从新分区启动?
- 重新启动之前是否必须更改fstab 中
UUID
的?/boot
- 我需要一个单独的分区吗
/boot/efi
?
答案1
将/boot
和都/boot/efi
作为单独的文件系统是多余的,但是:
- 基于 BIOS 的非常旧的系统可能需要单独的
/boot
分区以避免 BIOS 限制 - 任何以 UEFI 方式启动的系统都需要
/boot/efi
或等效的 ESP 分区,因为固件希望在其中找到引导加载程序文件。 - 拥有单独的未加密
/boot
将允许使用cryptsetup
根文件系统支持的任何加密方法,而不是 GRUB 理解的更有限的加密集。
现代 Debian/Ubuntu 的默认分区将两者作为单独的分区,因此默认配置可以覆盖尽可能广泛的系统。
正如 oldfred 在评论中提到的,UEFI 通过 GPT 分区表中分区唯一的 GUID 来标识要使用的 ESP 分区。该 GUID 在 Linux 中称为 PARTUUID。lsblk -o +partuuid
将显示它。
你的efibootmgr
命令几乎是正确的。要使用正确的磁盘创建 ubuntuNew 引导选项,您应该使用:
sudo efibootmgr -c -d /dev/nvme0n1 -L ubuntuNew -l \\EFI\\UBUNTU\\SHIMX64.EFI
efibootmgr
将自行查找 PARTUUID 并自动使用它来创建新的启动项。您只需指定磁盘(除非磁盘上有多个 EFI 系统分区)。
一旦shimx64.efi
加载grubx64.efi
,在配置 Debian/Ubuntu 风格的系统上,它将在grub.cfg
与grubx64.efi
.该文件仅包含几行,标识包含该目录的文件系统的文件系统 UUID /boot
(无论它是单独的分区还是根文件系统上的常规目录)。因此,Debian/Ubuntu 系统可以总是/boot/grub/grub.cfg
无论系统使用 BIOS 还是 UEFI,“主”GRUB 配置文件都位于。如果你有大量不同年代的系统,那就很方便了。
/boot/grub2/grub.cfg
作为参考,RedHat 7 和 8 在BIOS 式系统上以及/boot/efi/EFI/redhat/grub.cfg
UEFI 系统上具有实际的 GRUB 配置。
然而,如果要合并/boot
和/boot/efi
,有几点需要注意:
- 给定的引导加载程序路径
efibootmgr
基于 ESP 文件系统的根。最初该路径始于/boot/efi
,因此从 Linux 来看\\EFI\\UBUNTU\\SHIMX64.EFI
是指。/boot/efi/EFI/UBUNTU/SHIMX64.EFI
如果您只使用/boot
,那么您需要将 UBUNTU 目录上移一级,或者将引导加载程序路径指定为\\EFI\\EFI\\UBUNTU\\SHIMX64.EFI
。 /boot
需要是 GRUB 可以理解的东西,以便它可以从那里加载内核和 initramfs 文件。 Ubuntu 的 UEFI 版本的 GRUB 肯定会理解 ext2 和 vfat;因此,如果将/boot
和合并/boot/efi
到单个 vfat 分区中,GRUB 将不会出现任何问题。您不能使用 ext2,因为固件需要从该分区读取 SHIMX64.EFI 和 GRUBX64.EFI,而典型的 UEFI 固件将无法识别 ext2。- 在引导时,
/boot
只有 GRUB 需要,Linux 内核不需要:您可以不/boot
挂载,系统仍然可以正常引导。但您需要保持/boot
挂载状态,以便内核更新可以正常进行。 (或者,如果您确实想通过卸载它来隐藏它,那么您可以添加脚本以/etc/kernel/pre*.d/
在安装内核更新之前自动安装它,并/etc/kernel/post*.d
在安装/删除特定内核包完成后再次卸载它。)
如果您没有牢牢掌握需求是什么,引导加载程序通常会被认为是“可怕且危险的”。另一方面,它通常是相当独立的,因此与引导加载程序相关的问题通常并不难修复......一旦您克服了从外部介质引导系统的第一个障碍,那么您就可以开始修复它。我不会说具有非功能性引导加载程序的系统是“祝酒”:它只需要一点外部帮助。
答案2
引导加载程序将查找您当前已安装的内容/boot/efi
,因此,如果您不想扩大该分区,则可以按原样保留该分区,只需对文件进行一个微小的更改,如下所述。
准备新的启动分区
- 创建一个
ext2
具有所需大小的新分区。该分区不需要引导标志 - 您的 efi 分区是入口点并将委托给这个新分区。 - 将新分区安装到某处。
/newBoot
例如 - 从旧的启动分区复制文件,例如使用
rsync --recursive --delete --archive /boot/ /newBoot/
- 删除 的内容
/newBoot/efi/
,这里只是一个文件夹:rm -rf /newBoot/efi/EFI/
。不要删除newBoot/efi/
。我们想efi
在那里安装旧文件夹。
告诉efi
使用新分区
找出/newBoot
的 UUID:
$ lsblk -e 7 -o name,fstype,size,fsused,label,partlabel,mountpoint,uuid,partuuid
NAME FSTYPE SIZE FSUSED LABEL PARTLABEL MOUNTPOINT UUID PARTUUID
nvme0n1 931.5G
├─nvme0n1p1 vfat 512M 5.3M EFI System Partition /boot/efi FD0E-EECA 587cf214-f068-4879-a833-9dffa5ec6e3d
├─nvme0n1p2 ext2 488M 313.7M /boot 606a1976-d1c2-4246-a256-a8afddb04f84 2e10e277-560f-4f5e-abce-1dce5187a7f0
├─nvme0n1p3 crypto_LUKS 927.7G e7f674b8-4bec-4502-a1e5-0e93aa34786f 2fed2ecb-b548-479b-aa3f-7f1bbfb9981f
│ └─sda3_crypt LVM2_member 927.7G 9tx8Yv-XDCR-RmGf-fmXo-WiX2-SDpG-xH1si4
│ ├─ubuntu--gnome--vg-root ext4 911.6G 734.2G / 1cccfb0a-69da-4246-a071-52f882681418
│ └─ubuntu--gnome--vg-swap_1 swap 15.8G [SWAP] e3facfb8-db2e-426d-aef4-b6c81004fd6f
└─nvme0n1p4 ext2 1.5G newBoot newBoot 5aca79e7-b740-46d3-bc76-aa7e8b8b93da 9e8baf2f-2118-4042-9c47-7ffb824ada52
进行相应的编辑/boot/efi/EFI/ubuntu/grub.cfg
,将旧的当前 UUID 替换为新的 UUID:
# cat /boot/efi/EFI/ubuntu/grub.cfg
# search.fs_uuid 606a1976-d1c2-4246-a256-a8afddb04f84 root
search.fs_uuid 5aca79e7-b740-46d3-bc76-aa7e8b8b93da root
set prefix=($root)'/grub'
configfile $prefix/grub.cfg
整理起来
现在系统应该已经从新分区启动,但从/boot/
新分区启动后将是旧分区。编辑/etc/fstab
以便系统更新找到其位置的所有文件:
# UUID=606a1976-d1c2-4246-a256-a8afddb04f84 /boot ext2 defaults 0 2
UUID=5aca79e7-b740-46d3-bc76-aa7e8b8b93da /boot ext2 defaults 0 2
/boot/efi
中的行保持/etc/fstab
原样:
UUID=FD0E-EECA /boot/efi vfat umask=0077 0 1