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


9

我只是从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映像解压缩到temp目录中。看来initrd映像缺少LVM功能。例如,如果我正在正确读取/usr/share/initramfs-tools/hooks/lvm2(已安装lvm2在livecd引导的系统上,而未安装在已安装的系统上),lvm则应在其中放置一个可执行文件/sbin。事实并非如此。

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

Answers:


9

您直接遇到了问题:initramfs不支持LVM。解决方法如下:

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

    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内部运行。


绑定安装/ dev的原因是什么?
直觉

我添加了/ dev,以防grub重新运行,并想弄清楚引导驱动器的位置。如果chroot内的网络连接不正常或出现异常,我将使用dpkg。如果网络连接确实有效,那么我建议使用“ apt-get”而不是“ aptitude”,因为这几天它的dep解析度更好。
Kees Cook

感谢您提供的技巧apt-get,很难跟踪什么是什么。您是否有指向更多信息的链接?
直觉

1

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

另外,您不需要单独的/ boot分区,并且单独的/ var分区是有问题的。


很好..比chroot-ing 容易。我猜这不会在aptitude已明确安装的软件包的db中注册,因此我可能应该lvm2以这种方式安装及其依赖项。使用单独的任何缺点/var?除了必须分配额外的“空闲”空间的问题之外?我希望能够对其进行快照,所以我不想将其与其他大型变量文件混在一起。我计划将我的主目录符号链接或绑定安装到一个单独的目录中,该目录/data将在系统启动和运行后创建,以保存音乐等。
直觉

另外:我还需要将引导fs安装在/mnt/boot,不是吗?我收集到的信息lvm2会在安装时建立一个新的initrd。
直觉

@intuited不,它将像以往一样被记录为手动安装。是的,如果您有一个单独的目录,则还需要/ boot挂载。拥有单独的/ var不利于创建快照。
psusi 2011年

单独的/var分区对快照无济于事,但是,例如,它将有助于防止根fs意外填充。您是在说拍摄快照会带来问题吗?哦,等等,那是您在另一个问题注释线程上。没关系..
直觉

1

本演练的最后部分的一些帮助下,我最终主要完成了Kees Cook精心布置的工作。然而:

  • 我没有装上/dev。看起来这稍后导致了一些错误消息。见下文。
  • /var除了,我将卷安装在新的根目录上/boot
  • 我没有将Debs复制到/tmp新根目录中。相反,我在# apt-get install aptitude; aptitude install lvm2吃完之后就跑了chroot

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

      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.

我接受我自己的答案,因为它对我来说效果很好;请参阅Kees的答案以获取类似的解决方案,该解决方案在某些情况下可能更可靠。
直觉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.