我有一个 LUKS 加密的 Ubuntu 20.04 设置。我按照我自己的指示缩小 LUKS 分区并安装 Ubuntu 22.04(同样是 LUKS 加密的)。现在,我的 grub 启动菜单不再提供启动旧的 LUKS 加密的 Ubuntu 20.04 版本的选项。相反,它只会启动新的 22.04 版本。
如何重新添加 LUKS 加密的 Ubuntu 20.04 版本?
这是我的磁盘,登录新的 Ubuntu 22.04 操作系统时在 gparted 中显示。
描述:
/dev/nvme0n1p1
是 512 MiB EFI 分区/dev/nvme0n1p2
/boot
是旧版 Ubuntu 20.04 操作系统的ext4非加密分区/dev/nvme0n1p3
是包含单个 LVM 卷的 LUKS 加密分区,其中装有 Ubuntu 20.04(不再位于 grub 菜单中)/dev/nvme0n1p4
/boot
是新 Ubuntu 22.04 操作系统的ext4非加密分区/dev/nvme0n1p5
是包含单个 LVM 卷的 LUKS 加密分区,其中装有 Ubuntu 22.04(是在 grub 菜单中,并且操作系统现在是否正在运行)
可能有用:
- 对于更有经验的人来说,这个对不同问题的答案可能有一些线索,但我不明白:如何让 grub 从新加密的分区启动
- 如何修复
/boot
LUKS 加密硬盘?
答案1
经过大量的努力和调查,我终于明白了!
1. 如何添加其他 LUKS 加密的 Linux 发行版返回到您的 Grub 引导加载程序启动菜单
快速摘要
# 1. Open your `/etc/default/grub` file.
sudo gedit /etc/default/grub
# Then manually add these lines to the bottom of that file:
# (required)
GRUB_DISABLE_OS_PROBER=false
# (optional)
GRUB_ENABLE_CRYPTODISK=y
# 2. Unlock your LUKS-encrypted partitions which contain other bootable
# operating systems. In my case:
sudo cryptsetup luksOpen /dev/nvme0n1p3 nvme0n1p3_crypt
# 3. Update your Grub bootloader in your `/boot` partition.
sudo update-grub
# When I run `update-grub`, my output now includes this line:
#
# Found Ubuntu 20.04.5 LTS (20.04) on /dev/mapper/system-root
# 4. Done. Reboot to see and use the new Grub entries!
reboot
如果您只是想要快速得到答案,请到此为止。
细节
编辑文件以在其中
/etc/default/grub
添加以下行:GRUB_DISABLE_OS_PROBER=false
# 1. Open /etc/default/grub in gedit sudo gedit /etc/default/grub # 2. Now manually add this line to the bottom of it. GRUB_DISABLE_OS_PROBER=false # I also recommend this line, but it appears to *not* be necessary: GRUB_ENABLE_CRYPTODISK=y # 3. Manually save and close the file
线路
GRUB_DISABLE_OS_PROBER=false
启用操作系统探测器,它会扫描文件系统以查找有效的操作系统并将其添加到 Grub 引导加载程序。此功能已禁用默认情况下,使能够我们设置它GRUB_DISABLE_OS_PROBER=false
。Grub 用户手册中对此有如下说明:https://www.gnu.org/software/grub/manual/grub/html_node/Simple-configuration.html:GRUB_DISABLE_OS_PROBER
具有
grub-mkconfig
使用外部 os-prober 程序发现同一台机器上安装的其他操作系统并为它们生成相应菜单项的功能。默认情况下,此功能处于禁用状态,因为自动且静默地执行 os-prober 并根据该数据创建启动项是一种潜在的攻击媒介。将此选项设置为false
可在命令中启用此功能grub-mkconfig
。提醒自己:尽管看起来不是是必要的:如果上述方法本身不起作用,请尝试添加
GRUB_ENABLE_CRYPTODISK=y
。来自上面的链接:GRUB_ENABLE_CRYPTODISK
如果设置为
y
,grub-mkconfig
和grub-install
将检查加密磁盘并生成在启动期间访问它们所需的其他命令。请注意,在这种情况下无法进行无人值守启动,因为 GRUB 将等待密码来解锁加密容器。解锁所有包含您想要添加到 Grub 菜单的操作系统的 LUKS 加密分区。
就我而言,我的旧 Ubuntu 20.04 操作系统位于我的
/dev/nvme0n1p3
分区中,正如我的问题中所解释的那样。gparted
注意:我喜欢在GUI 分区编辑器中查看我的分区。因此,解锁该分区的方法如下:
sudo cryptsetup luksOpen /dev/nvme0n1p3 nvme0n1p3_crypt # You'll need to enter your `sudo` password, as well as the LUKS encryption # password. It won't show anything while you type them. # If you have other LUKS-encrypted partitions, unlock them now too. Ex: sudo cryptsetup luksOpen /dev/nvme0n1p6 nvme0n1p6_crypt sudo cryptsetup luksOpen /dev/sda2 sda2_crypt sudo cryptsetup luksOpen /dev/sda3 sda3_crypt # etc.
如需更多帮助,请参阅
man cryptsetup
。请注意,该luksOpen
选项相当于open --type luks
。现在您的 LUKS 加密分区已解锁,并且您已告诉 Grub 在您的文件系统中搜索其他操作系统,请更新 Grub 引导加载程序:
sudo update-grub
在其输出中,查找如下行,表明它正在查找并将操作系统添加到 Grub 菜单:
Found Ubuntu 20.04.5 LTS (20.04) on /dev/mapper/system-root
对我来说完整的示例命令和输出,输出中包含上面的那行:
$ sudo update-grub Sourcing file `/etc/default/grub' Sourcing file `/etc/default/grub.d/init-select.cfg' Generating grub configuration file ... Found linux image: /boot/vmlinuz-5.19.0-32-generic Found initrd image: /boot/initrd.img-5.19.0-32-generic Found linux image: /boot/vmlinuz-5.15.0-60-generic Found initrd image: /boot/initrd.img-5.15.0-60-generic Memtest86+ needs a 16-bit boot, that is not available on EFI, exiting Warning: os-prober will be executed to detect other bootable partitions. Its output will be used to detect bootable binaries on them and create new boot entries. Found Ubuntu 20.04.5 LTS (20.04) on /dev/mapper/system-root Adding boot menu entry for UEFI Firmware Settings ... done
要验证新的 Grub 菜单项,您可以手动打开文件
/boot/grub/grub.cfg
并查找menuentry
该文件中注释后的条目### BEGIN /etc/grub.d/30_os-prober ###
。请勿直接编辑该文件。
故障排除、调试和额外信息。
运行时
sudo update-grub
,如果您在输出中看到以下几行:Warning: os-prober will not be executed to detect other bootable partitions. Systems on them will not be added to the GRUB boot configuration. Check GRUB_DISABLE_OS_PROBER documentation entry.
...那么就意味着你忘记添加
GRUB_DISABLE_OS_PROBER=false
到你的/etc/default/grub
文件中了。sudo update-grub
如果你出去首先解锁所有包含可启动操作系统的 LUKS 加密分区,然后这些操作系统将已删除运行时从 Grub 菜单中删除它们(如果它们之前存在)update-grub
(请参阅下一节)。如果您遇到这种情况,只需启动 Grub 菜单中可用的任何 Linux 操作系统,然后按照上述步骤将其他操作系统重新添加到 Grub 菜单中。sudo fdisk -l
您可以通过查看和的输出来查看哪些分区已解锁lsblk
。仅当正在运行的分区 (
/dev/nvme0n1p5
) 解锁时(即:重新启动后),我的输出如下所示。请注意,在这两种情况下,仅nvme0n1p5_crypt
显示:# 1. `sudo fdisk -l | grep -i mapper` output: $ sudo fdisk -l | grep -i mapper Disk /dev/mapper/nvme0n1p5_crypt: 870.4 GiB, 934587400192 bytes, 1825366016 sectors # 2. `lsblk` output: $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 4K 1 loop /snap/bare/5 loop1 7:1 0 63.3M 1 loop /snap/core20/1778 loop2 7:2 0 63.3M 1 loop /snap/core20/1822 loop3 7:3 0 72.9M 1 loop /snap/core22/522 loop4 7:4 0 240.6M 1 loop /snap/firefox/2356 loop5 7:5 0 239.8M 1 loop /snap/firefox/2391 loop6 7:6 0 400.8M 1 loop /snap/gnome-3-38-2004/112 loop7 7:7 0 346.3M 1 loop /snap/gnome-3-38-2004/119 loop8 7:8 0 452.4M 1 loop /snap/gnome-42-2204/56 loop9 7:9 0 91.7M 1 loop /snap/gtk-common-themes/1535 loop10 7:10 0 45.9M 1 loop /snap/snap-store/582 loop11 7:11 0 45.9M 1 loop /snap/snap-store/638 loop12 7:12 0 49.8M 1 loop /snap/snapd/17950 loop13 7:13 0 49.8M 1 loop /snap/snapd/18357 loop14 7:14 0 304K 1 loop /snap/snapd-desktop-integration/49 loop15 7:15 0 428K 1 loop /snap/snapd-desktop-integration/57 nvme1n1 259:0 0 1.8T 0 disk nvme0n1 259:1 0 953.9G 0 disk ├─nvme0n1p1 259:2 0 512M 0 part /boot/efi ├─nvme0n1p2 259:3 0 1.4G 0 part ├─nvme0n1p3 259:4 0 80G 0 part ├─nvme0n1p4 259:5 0 1.5G 0 part /boot └─nvme0n1p5 259:6 0 870.4G 0 part └─nvme0n1p5_crypt 253:0 0 870.4G 0 crypt /var/snap/firefox/common/host-hunspell /
现在,后运行
sudo cryptsetup luksOpen /dev/nvme0n1p3 nvme0n1p3_crypt
以解锁该 LUKS 加密分区,这是我看到的。请注意,我现在也看到了nvme0n1p3_crypt
LUKS加密分区内的逻辑卷 (LVM)/dev/mapper/system-root
在哪里:/dev/mapper/system-root
/dev/mapper/nvme0n1p3
# 1. `sudo fdisk -l | grep -i mapper` output: $ sudo fdisk -l | grep -i mapper Disk /dev/mapper/nvme0n1p5_crypt: 870.4 GiB, 934587400192 bytes, 1825366016 sectors Disk /dev/mapper/nvme0n1p3_crypt: 80 GiB, 85903540224 bytes, 167780352 sectors Disk /dev/mapper/system-root: 80 GiB, 85899345920 bytes, 167772160 sectors # 2. `lsblk` output: $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 4K 1 loop /snap/bare/5 loop1 7:1 0 63.3M 1 loop /snap/core20/1778 loop2 7:2 0 63.3M 1 loop /snap/core20/1822 loop3 7:3 0 72.9M 1 loop /snap/core22/522 loop4 7:4 0 240.6M 1 loop /snap/firefox/2356 loop5 7:5 0 239.8M 1 loop /snap/firefox/2391 loop6 7:6 0 400.8M 1 loop /snap/gnome-3-38-2004/112 loop7 7:7 0 346.3M 1 loop /snap/gnome-3-38-2004/119 loop8 7:8 0 452.4M 1 loop /snap/gnome-42-2204/56 loop9 7:9 0 91.7M 1 loop /snap/gtk-common-themes/1535 loop10 7:10 0 45.9M 1 loop /snap/snap-store/582 loop11 7:11 0 45.9M 1 loop /snap/snap-store/638 loop12 7:12 0 49.8M 1 loop /snap/snapd/17950 loop13 7:13 0 49.8M 1 loop /snap/snapd/18357 loop14 7:14 0 304K 1 loop /snap/snapd-desktop-integration/49 loop15 7:15 0 428K 1 loop /snap/snapd-desktop-integration/57 nvme1n1 259:0 0 1.8T 0 disk nvme0n1 259:1 0 953.9G 0 disk ├─nvme0n1p1 259:2 0 512M 0 part /boot/efi ├─nvme0n1p2 259:3 0 1.4G 0 part ├─nvme0n1p3 259:4 0 80G 0 part │ └─nvme0n1p3_crypt 253:1 0 80G 0 crypt │ └─system-root 253:2 0 80G 0 lvm ├─nvme0n1p4 259:5 0 1.5G 0 part /boot └─nvme0n1p5 259:6 0 870.4G 0 part └─nvme0n1p5_crypt 253:0 0 870.4G 0 crypt /var/snap/firefox/common/host-hunspell /
注意:要获取每个分区的 UUID(通用唯一标识符)号码,请运行以下命令:
blkid
请注意,需要注意的 3 个主要磁盘相关文件如下。使用以下命令查看它们
cat
:# filesystem table (fstab) cat /etc/fstab # Encrypted table cat /etc/crypttab # User-editable Grub config file # (read and used by `sudo update-grub`) cat /etc/default/grub # NON-user-editable final grub config file on your `/boot` partition # (created or updated by `sudo update-grub`) cat /boot/grub/grub.cfg
2. 如何消除从 Grub 引导加载程序启动菜单中选择其他 LUKS 加密的 Linux 发行版
要从 Grub 启动菜单中删除除正在运行的操作系统之外的所有内容,只需重新启动进入所需的操作系统(这会再次锁定所有其他 LUKS 加密分区),然后运行:
sudo update-grub
由于没有其他 LUKS 加密分区被解锁,它们将自动从 Grub 引导加载程序中删除。以下是该命令和输出:
$ sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.19.0-32-generic
Found initrd image: /boot/initrd.img-5.19.0-32-generic
Found linux image: /boot/vmlinuz-5.15.0-60-generic
Found initrd image: /boot/initrd.img-5.15.0-60-generic
Memtest86+ needs a 16-bit boot, that is not available on EFI, exiting
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
Adding boot menu entry for UEFI Firmware Settings ...
done
如果你有一个单一的、共享的/boot
分区用于所有操作系统(不像我),那就这样吧!sudo update-grub
在此操作系统中运行将更新该单个/boot
分区,从而影响用于启动的 Grub 引导加载程序。或者,如果你在你的最新安装操作系统,它会更新/boot
您的 Grub 引导加载程序实际使用的分区,就是这样!
但,如果你使用的是其他操作系统,它将更新它自己的,老的 /boot
分区,而不是实际用于启动的最新分区。在这种情况下,您可能需要将最新/boot
分区重新挂载到/boot
文件系统的目录中,然后sudo update-grub
再次运行,或者也许你可以运行某种chroot
魔法。但是,我没有时间这样做,所以这里是我做的一个肮脏的黑客行为:
快速摘要:
我只是手动将新创建的/boot/grub/grub.cfg
文件复制到实际(最新)启动分区上的正确位置,因为/boot
创建它的路径位于旧的(现在未使用的)启动分区上。
细节:
我启动了
/dev/nvme0n1p3
Ubuntu 20.04 操作系统,它已自动将旧的(现在是错误的/未使用的)/dev/nvme0n1p2
启动分区挂载到路径 处的文件系统中/boot
。我运行sudo update-grub
以更新路径/dev/nvme0n1p2
处(现在是错误的/未使用的)启动分区/boot
。我打开 GUI 文件浏览器并双击 处的新启动分区
/dev/nvme0n1p4
,以自动将其挂载到 路径 处的文件系统中/media/gabriel/abcd-1234-efgh-abcdefghij
。换句话说,当我在 分区 中登录 Ubuntu 20.04 时/dev/nvme0n1p3
,路径/media/gabriel/abcd-1234-efgh-abcdefghij
为完全一样/boot
作为我登录到分区上的 Ubuntu 22.04 操作系统时的路径/dev/nvme0n1p5
!肮脏的黑客:备份旧的 grub.cfg 文件并将新的复制到它的位置。
命令摘要:
# running on the Ubuntu 20.04 OS: forcibly remove the Ubuntu 22.04 entry # from the Grub boot menu #-------------------------------------------- # run withOUT first unlocking the Ubuntu 22.04 LUKS partition, so that the # Ubuntu 22.04 Grub entry will be removed from the "/boot/grub/grub.cfg" # file sudo update-grub # manually mount the latest boot dir by double-clicking it in your file # manager # back up the old grub.cfg file in the new /boot dir sudo mv /media/gabriel/abcd-1234-efgh-abcdefghij/grub/grub.cfg \ /media/gabriel/abcd-1234-efgh-abcdefghij/grub/grub.cfg.bak # dirty hack: copy over the Ubuntu 20.04-created grub.cfg file to the # latest /boot dir mounted at this other place sudo cp /boot/grub/grub.cfg \ /media/gabriel/abcd-1234-efgh-abcdefghij/grub/grub.cfg # now reboot, and all you'll see in the Grub boot menu is the old Ubuntu # 20.04 entry, *not* the new Ubuntu 22.04 entry reboot
另一个撤销前一个肮脏黑客行为的肮脏黑客行为:
grub.cfg
要撤消此操作,只需恢复您之前备份的旧文件即可grub.cfg.bak
:sudo mv /media/gabriel/abcd-1234-efgh-abcdefghij/grub/grub.cfg.bak \ /media/gabriel/abcd-1234-efgh-abcdefghij/grub/grub.cfg
参考:
- 主要是我自己的反复试验,但也有:
- 谷歌搜索grub 警告:os-prober 将不会被执行来检测其他可启动分区
- 我第一次了解到添加
GRUB_DISABLE_OS_PROBER=false
到的地方/etc/default/grub
:https://forum.manjaro.org/t/warning-os-prober-will-not-be-executed-to-detect-other-bootable-partitions/57849 man update-grub
- *****https://www.gnu.org/software/grub/manual/grub/html_node/Simple-configuration.html
man 8 grub-mkconfig
man cryptsetup
- 为什么运行“apt upgrade”后会出现“警告:os-prober 将不会执行来检测其他可启动分区。”?
- 我的另一个问题:Unix 和 Linux:当两个 Linux 操作系统都采用 LUKS 加密时,如何使双启动系统(2 个 Linux 操作系统)正常工作
- 如何修复 LUKS 加密硬盘上的 /boot?
- 将安装在 LUKS 分区上的 debian 添加到启动选项
- 如何让 grub 从新加密的分区启动<==
- 使用 mdadm 和多个 luks 分区安装 Ubuntu
- 带有 root LUKS 加密的 GRUB 引导加载程序:仅 grub shell
man 5 crypttab
, 和https://man7.org/linux/man-pages/man5/crypttab.5.html