从桌面 LiveCD 修复 LVM 根目录上无法启动的安装

int*_*ted 9 live-cd installation lvm initramfs

我刚刚从 10.10 桌面 LiveCD 进行了安装,使根卷成为 LVM LV。

显然这是不支持的;在启动 GUI 安装程序应用程序之前,我通过执行以下步骤来管理它:

  • lvm2在正在运行的系统上安装软件包
  • 在系统硬盘上创建一个 LVM 类型的分区
  • 使用 LVM 工具创建物理卷、卷组和根 LV。我还创建了第二个 LV /var;我认为这无关紧要。
  • 在两个 LV 中的每一个上创建一个文件系统 (ext4)。

完成这些步骤后,GUI 安装程序提供了两个 LV 作为安装目标;我很高兴地接受了,同时还放置/boot了一个与 LVM 分区分开的主分区。

安装似乎进行得很顺利,而且我已经确认 root 和 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
}
Run Code Online (Sandbox Code Playgroud)

请注意, $VARS 在实际中被替换grub.cfg为其相应的值。

我重新启动回 livecd 并将 initrd 映像解压缩到临时目录中。看起来 initrd 映像缺少 LVM 功能。例如,如果我正在阅读/usr/share/initramfs-tools/hooks/lvm2(安装lvm2在 livecd 引导的系统上,而不存在于已安装的系统上),则可lvm执行文件应位于/sbin; 事实并非如此。

解决这种情况的最佳方法是什么?我意识到只使用备用安装 CD 会更容易,它显然支持 LVM,但我不想等待它下载然后必须重新安装。

Kee*_*ook 9

您直接解决了这个问题:initramfs 不支持 LVM。以下是修复方法:

  1. 再次启动 LiveCD
  2. lvm2在 Live 环境中再次安装
  3. 调出卷组(如果 -ay 不起作用,请尝试 -a yes)

    vgchange -a y
    
    Run Code Online (Sandbox Code Playgroud)
  4. 获取挂载在单独树下的根 LV、/boot 和 /dev

    mkdir /newroot
    mount /dev/yourVG/rootLV /newroot
    mount /dev/yourbootpartition /newroot/boot
    mount -o bind /dev /newroot/dev
    
    Run Code Online (Sandbox Code Playgroud)
  5. 将需要的包复制到 /newroot 树中

    cp /var/cache/apt/archives/*deb /newroot/tmp/
    
    Run Code Online (Sandbox Code Playgroud)
  6. Chroot 进入新树并安装软件包

    chroot /newroot
    cd /tmp
    dpkg -i *.deb
    
    Run Code Online (Sandbox Code Playgroud)

此时,事情应该恢复正常(因为安装 lvm2 时会重新生成 initramfs)。如果没有,您可以update-initramfs -u在 chroot 内运行。