Ubuntu x 2 双启动:如何在新的 LUKS 分区中安装新版本的 Ubuntu 后将旧的 LUKS 加密的 Ubuntu 版本恢复到 Grub 菜单

Ubuntu x 2 双启动:如何在新的 LUKS 分区中安装新版本的 Ubuntu 后将旧的 LUKS 加密的 Ubuntu 版本恢复到 Grub 菜单

我有一个 LUKS 加密的 Ubuntu 20.04 设置。我按照我自己的指示缩小 LUKS 分区并安装 Ubuntu 22.04(同样是 LUKS 加密的)。现在,我的 grub 启动菜单不再提供启动旧的 LUKS 加密的 Ubuntu 20.04 版本的选项。相反,它只会启动新的 22.04 版本。

如何重新添加 LUKS 加密的 Ubuntu 20.04 版本?

这是我的磁盘,登录新的 Ubuntu 22.04 操作系统时在 gparted 中显示。

描述:

  1. /dev/nvme0n1p1是 512 MiB EFI 分区
  2. /dev/nvme0n1p2/boot是旧版 Ubuntu 20.04 操作系统的ext4非加密分区
  3. /dev/nvme0n1p3是包含单个 LVM 卷的 LUKS 加密分区,其中装有 Ubuntu 20.04(不再位于 grub 菜单中
  4. /dev/nvme0n1p4/boot是新 Ubuntu 22.04 操作系统的ext4非加密分区
  5. /dev/nvme0n1p5是包含单个 LVM 卷的 LUKS 加密分区,其中装有 Ubuntu 22.04(在 grub 菜单中,并且操作系统现在是否正在运行)

在此处输入图片描述

可能有用:

  1. 对于更有经验的人来说,这个对不同问题的答案可能有一些线索,但我不明白:如何让 grub 从新加密的分区启动
  2. 如何修复/bootLUKS 加密硬盘?

答案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

如果您只是想要快速得到答案,请到此为止。

细节

  1. 编辑文件以在其中/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

    如果设置为ygrub-mkconfiggrub-install将检查加密磁盘并生成在启动期间访问它们所需的其他命令。请注意,在这种情况下无法进行无人值守启动,因为 GRUB 将等待密码来解锁加密容器。

  2. 解锁所有包含您想要添加到 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

  3. 现在您的 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 ###。请勿直接编辑该文件。

故障排除、调试和额外信息。

  1. 运行时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文件中了。

  2. sudo update-grub如果你出去首先解锁所有包含可启动操作系统的 LUKS 加密分区,然后这些操作系统将已删除运行时从 Grub 菜单中删除它们(如果它们之前存在)update-grub(请参阅下一节)。如果您遇到这种情况,只需启动 Grub 菜单中可用的任何 Linux 操作系统,然后按照上述步骤将其他操作系统重新添加到 Grub 菜单中。

  3. sudo fdisk -l您可以通过查看和的输出来查看哪些分区已解锁lsblk

    1. 仅当正在运行的分区 ( /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
                                                     /
      
    2. 现在,运行sudo cryptsetup luksOpen /dev/nvme0n1p3 nvme0n1p3_crypt以解锁该 LUKS 加密分区,这是我看到的。请注意,我现在也看到了nvme0n1p3_cryptLUKS加密分区内的逻辑卷 (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
                                                     /
      
  4. 注意:要获取每个分区的 UUID(通用唯一标识符)号码,请运行以下命令:

    blkid
    
  5. 请注意,需要注意的 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创建它的路径位于旧的(现在未使用的)启动分区上。

细节:

  1. 我启动了/dev/nvme0n1p3Ubuntu 20.04 操作系统,它已自动将旧的(现在是错误的/未使用的)/dev/nvme0n1p2启动分区挂载到路径 处的文件系统中/boot。我运行sudo update-grub以更新路径/dev/nvme0n1p2处(现在是错误的/未使用的)启动分区/boot

  2. 我打开 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

  3. 肮脏的黑客:备份旧的 grub.cfg 文件并将新的复制到它的位置。

  4. 命令摘要:

    # 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
    

参考:

  1. 主要是我自己的反复试验,但也有:
  2. 谷歌搜索grub 警告:os-prober 将不会被执行来检测其他可启动分区
  3. 我第一次了解到添加GRUB_DISABLE_OS_PROBER=false到的地方/etc/default/grubhttps://forum.manjaro.org/t/warning-os-prober-will-not-be-executed-to-detect-other-bootable-partitions/57849
  4. man update-grub
  5. *****https://www.gnu.org/software/grub/manual/grub/html_node/Simple-configuration.html
  6. man 8 grub-mkconfig
  7. man cryptsetup
  8. 为什么运行“apt upgrade”后会出现“警告:os-prober 将不会执行来检测其他可启动分区。”?
  9. 我的另一个问题:Unix 和 Linux:当两个 Linux 操作系统都采用 LUKS 加密时,如何使双启动系统(2 个 Linux 操作系统)正常工作
  10. 如何修复 LUKS 加密硬盘上的 /boot?
  11. 将安装在 LUKS 分区上的 debian 添加到启动选项
  12. 如何让 grub 从新加密的分区启动<==
  13. 使用 mdadm 和多个 luks 分区安装 Ubuntu
  14. 带有 root LUKS 加密的 GRUB 引导加载程序:仅 grub shell
  15. man 5 crypttab, 和https://man7.org/linux/man-pages/man5/crypttab.5.html

相关内容