修复无法启动的LVM根目录安装,使用桌面LiveCD。

我刚刚使用10.10桌面版LiveCD进行了安装,将根卷设置为LVM LV。
显然这是不被支持的;在启动图形界面安装程序之前,我通过以下步骤成功实现了:
- 在运行中的系统上安装lvm2软件包 - 在系统硬盘上创建一个LVM类型的分区 - 使用LVM工具创建物理卷、卷组和根LV。我还创建了第二个用于/var的LV,但我认为这与问题无关。 - 在两个LV上分别创建ext4文件系统。
完成这些步骤后,图形界面安装程序将这两个LV作为安装目标提供给我,我欣然接受,并将/boot放在与LVM分区分开的主分区上。
安装过程似乎很顺利,我已经验证了根卷和var卷都包含了看起来正常的目录结构。
然而,引导失败了;如果我理解正确的话,我被放入了一个在initrd文件系统中运行的busybox中。
虽然我还没有完全阅读grub2文档,但看起来尝试引导我的新系统的条目是正确的。
menuentry 'Ubuntu, with Linux 2.6.35-22-generic' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos3)'
    search --no-floppy --fs-uuid --set $UUID_OF_BOOT_FILESYSTEM
    linux   /vmlinuz-2.6.35-22-generic root=/dev/mapper/$LVM_VOLUME_GROUP-root ro   quiet splash
    initrd  /initrd.img-2.6.35-22-generic
}

请注意,实际的`grub.cfg`文件中的$VARS将被替换为相应的值。
我重新启动进入了livecd,并将initrd镜像解压到一个临时目录中。看起来initrd镜像缺少LVM功能。例如,如果我正确地阅读了`/usr/share/initramfs-tools/hooks/lvm2`(在livecd引导系统上安装了`lvm2`,但在已安装系统上不存在),那么`/sbin`目录下应该有一个`lvm`可执行文件;但事实并非如此。
如何解决这个问题?我知道使用备用安装CD可能更容易,因为它显然支持LVM,但我不想等待下载并重新安装。

我已经解决了这个问题,并在我的博客上写下了解决方案,你可以看一下,如果你遇到了同样的问题。https://blog.isweluiz.com.br/2022/10/bug-cannot-unlock-encrypted-root-after.html - isweluiz
3个回答

你抓住了问题的关键:initramfs没有LVM支持。以下是解决方法:
  1. 再次启动LiveCD
  2. 在Live环境中再次安装lvm2
  3. 激活卷组(如果 -a y 不起作用,请尝试 -a yes)

    vgchange -a y
    
  4. 将根逻辑卷(root LV)、/boot 和 /dev 挂载到单独的目录下

    mkdir /newroot
    mount /dev/yourVG/rootLV /newroot
    mount /dev/yourbootpartition /newroot/boot
    mount -o bind /dev /newroot/dev
    
  5. 将所需的软件包复制到 /newroot 目录下

    cp /var/cache/apt/archives/*deb /newroot/tmp/
    
  6. 进入新的目录并安装软件包

    chroot /newroot
    cd /tmp
    dpkg -i *.deb
    
此时,事情应该恢复正常了(因为在安装lvm2时,initramfs将会重新生成)。如果没有恢复正常,你可以尝试在chroot环境中运行update-initramfs -u来解决问题。

绑定挂载/dev的原因是什么? - intuited
我添加了/dev,以防grub被重新运行,并想找出引导驱动器的位置。在chroot环境中,如果网络未启动或出现其他奇怪问题,我使用dpkg命令。如果网络正常工作,我建议使用"apt-get"而不是"aptitude",因为它在解决依赖关系方面更出色。 - Kees Cook
谢谢你关于apt-get的提示,很难记住这些东西。你有更多相关信息的链接吗? - intuited

安装系统到硬盘后,您需要在启动系统之前将lvm2安装到该系统中。如果您在livecd上安装了lvm2,则软件包仍然位于/var/cache/apt/archives目录中。切换到该目录,挂载硬盘,并使用dpkg --root=/mnt *.deb将软件包安装到硬盘上。在您的情况下,您需要将根文件系统挂载到/mnt,并将var文件系统挂载到/mnt/var。
此外,您不需要单独的/boot分区,并且单独的/var分区也是有问题的。

不错..这比chroot更容易。我猜这样做不会在aptitude的软件包数据库中注册为明确安装的软件包,所以我应该只是通过这种方式安装lvm2及其依赖项。使用单独的/var有什么缺点吗?除了需要分配额外的“松弛”空间之外?我希望能够对其进行快照,所以我不想将其与其他大型变量文件混合在一起;我计划在系统启动后创建一个独立的/data卷的目录,并将我的主目录符号链接或绑定挂载到其中,用于存放音乐等文件。 - intuited
另外:我还需要将引导文件系统挂载到/mnt/boot,对吗?我了解到lvm2在安装时会构建一个新的initrd。 - intuited
@intuited 不,它将像以往一样被记录为手动安装。是的,如果你有一个单独的/boot,你也需要挂载它。拥有一个单独的/var对于创建快照没有帮助。 - psusi
一个单独的/var分区并不能帮助快照,不过它可以防止根文件系统意外填满。你是说它会导致快照出现问题吗?哦,等一下,那是你在另一个问题的评论线程上。无所谓了。。 - intuited

我最终主要是按照Kees Cook的指导进行操作,还参考了this walkthrough的最后一部分。然而:
  • 我没有绑定挂载/dev。 这似乎导致了后来的一些错误消息;请参见下文。
  • 我除了/boot以外,还将我的/var卷挂载到新根目录上。
  • 我没有将deb文件复制到新根目录的/tmp中。相反,在chroot后运行了# apt-get install aptitude; aptitude install lvm2

    • 我这样做是为了在apt数据库中注册这些操作:例如,aptitude和可能也有apt-get将跟踪哪些软件包是显式安装的,哪些是作为依赖项自动安装的。
    • 由于我实际上是通过本地apt代理获取软件包(运行apt-cacher-ng),我甚至不需要等待它们重新下载。在运行apt-get之前,我必须在/etc/apt/apt.conf.d/02proxy创建一个包含Acquire::http::Proxy "http://local-apt-proxy-server:3142";的文件。在进行安装之前,在运行LiveCD时,我也做了同样的事情。
    • 我几次收到了错误消息或警告,如下所述

      Can not write log, openpty() failed (/dev/pts not mounted?)
      
**挂载 -o bind /dev/pts /mnt/YouNameIt/dev/pts**
    This did not prevent the appropriate lines from being added to `/var/log/dpkg.log`.

    I suspect that this issue could have been averted by bind-mounting `/dev`, but I don't really understand what it means, i.e. I don't know what log it's referring to, or why it would need to access a pty in order to write to a log.

我选择了自己的答案,因为它对我来说很有效;请参考Kees的答案,那是一个类似的解决方案,在某些情况下可能更可靠。 - intuited