我刚刚从 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。下面介绍如何修复它:
- 再次启动 LiveCD
lvm2
在 Live 环境中再次安装启动卷组(如果 -ay 不起作用,请尝试 -a yes)
vgchange -a y
将根 LV、/boot 和 /dev 挂载到单独的树下
mkdir /newroot mount /dev/yourVG/rootLV /newroot mount /dev/yourbootpartition /newroot/boot mount -o bind /dev /newroot/dev
将所需的包复制到 /newroot 树中
cp /var/cache/apt/archives/*deb /newroot/tmp/
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 lvm2
了chroot
ing。- 我这样做是为了在 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?)
- 我这样做是为了在 apt 数据库中注册这些操作:例如,,
**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.