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

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

我刚刚从 10.10 Desktop LiveCD 进行了安装,将根卷设为 LVM LV。

显然这不受支持;我在启动 GUI 安装程序应用程序之前通过采取以下步骤来解决这个问题:

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

完成这些步骤后,GUI 安装程序提供了两个 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
}

笔记$VARS 在实际中被grub.cfg其对应的值替换。

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

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

答案1

您正好碰到了问题:initramfs 不支持 LVM。下面介绍如何修复它:

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

    vgchange -a y
    
  4. 将根 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 进入新树并安装软件包

    chroot /newroot
    cd /tmp
    dpkg -i *.deb
    

此时,一切应该恢复正常(因为安装 lvm2 时将重新生成 initramfs)。如果没有,您可以尝试update-initramfs -u在 chroot 中运行。

答案2

将系统安装到硬盘后,您需要将 lvm2 安装到该系统中,然后才能启动。如果您在 livecd 上安装了 lvm2,那么软件包仍将位于 /var/cache/apt/archives 中。转到该目录,挂载硬盘,然后使用 dpkg --root=/mnt *.deb 将软件包安装到硬盘。对于您来说,您需要将根文件系统挂载到 /mnt,并将 var 文件系统挂载到 /mnt/var。

另外,您不需要单独的 /boot 分区,而单独的 /var 分区则是值得怀疑的。

答案3

我最终按照 Kees Cook 精心布置的方案做了,并借助了本演练。 然而:

  • 我没有 bind-mount /dev。这似乎导致后来出现一些错误消息;见下文。
  • /var除了 之外,我还在新的根目录上安装了我的卷/boot
  • 我没有将 debs 复制到/tmp新根目录中。相反,我运行# apt-get install aptitude; aptitude install lvm2chrooting。

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

      Can not write log, openpty() failed (/dev/pts not mounted?)
      

**mount -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.

相关内容