是否可以在不使用 initrd 的情况下将 root 放入 LVM 中?

是否可以在不使用 initrd 的情况下将 root 放入 LVM 中?

我刚刚设置了一个 Gentoo 基础系统(这意味着我现在可以启动并登录并使用它做一些事情)。我的根分区位于 LVM2 虚拟组中(具有单独的/boot分区)。为了启动,我需要将以下参数传递给内核:

root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm

显然它在挂载 root 之前使用初始 ramdisk 来做一些事情(我猜加载 LVM 的东西)。有没有办法可以将这段代码放入内核本身,这样就不需要 initrd 了?如果没有的话我该如何自己制作initrd呢?

补充一点可能会有用:我曾尝试在没有 initrd 的情况下为非 LVM root 编译内核,并且它工作得很好。然后我尝试将整个东西放在 LVM 下,但无法启动机器(我猜它无法处理 LVM 的东西)。然后我使用genkernel带有该--lvm选项的工具,它创建了我当前正在使用的工作内核和 initrd。

现在我想跳过genkernel并自己做所有事情,最好没有 initrd,这样机器启动速度会更快(无论如何我不需要灵活性)。

答案1

简单的回答:不。如果您想要 LVM,您需要一个 initrd。

但正如其他人之前所说:LVM 不会减慢您的系统速度或以其他方式做任何坏事,它们只是允许您创建一个允许内核加载并完成其工作的环境。

initrd 允许加载您的内核:如果您的内核位于 LVM 驱动器上,则必须先建立整个 LVM 环境,然后才能加载包含内核的二进制文件。

查看关于 initrd 的维基百科条目它解释了 initrd 的作用以及为什么需要它。

另一条注释:我理解你想要自己做事的观点,但即使使用 genkernel,你也可能会弄脏你的手。使用 genkernel --menuconfig all ,你基本上可以设置所有内容,就好像你在没有工具支持的情况下完全构建内核一样,genkernel 只是为你添加 make bzImage、makemodules 和 makemodules_install 行,并执行那些令人讨厌的 initrd 操作。

显然,您可以按照概述自己构建 initrd这里是 initramfs或者这里是 initrd

答案2

编辑:刚刚意识到你正在尝试在 LVM 上启动,我从未设置过 LVM,也从未需要过它们,所以这里的方法可能不起作用

以下是创建无 initrd 内核所需执行的基本规则(凭记忆,我记不太清楚了):

  1. 重新编译内核,确保内置到内核中(重要:不是作为模块!):

    1. 主板驱动程序和硬盘驱动程序(均在 下Device Drivers
    2. //etc/*/lib/modules/*(在 下File systems)的文件系统驱动程序

    基本上,内核需要能够挂载根文件系统、读取 /etc/fstab、加载其他驱动程序模块(如果需要)以及挂载其他非根文件系统以完成引导过程的其余部分。如果您有更复杂的启动过程,例如网络启动,那么您还需要内置这些驱动程序。

  2. 从内核“常规设置 > 初始 RAM 文件系统和 RAM 磁盘 (initramfs/initrd) 支持”禁用 initrd,又名 CONFIG_BLK_DEV_INITRD=n。

  3. 修改 GRUB 配置,不再需要 init= 和 realroot=,并设置 root= 使其指向根文件系统设备。

我想仅此而已。不要忘记保留备份内核以及可启动 Live CD 的完整副本,以防万一发生问题。

可能出错的事情:如果您编译了错误的驱动程序,或者将基本驱动程序编译为模块,则内核无法读取文件系统。使用新内核或使用 Live CD 重新启动并使用正确的驱动程序重新编译内核。

唯一困难的部分是确定哪个驱动程序与您的硬件相关。您可以使用lspcilshw来帮助识别您的硬件。如果您还没有这些工具,那么emerge lshw pciutils.

答案3

是的,你需要一个 initrd。原因如下:

正常的引导过程从引导加载程序开始,引导加载程序对您的系统有足够的了解,可以找到内核并运行它。 (GRUB2 足够智能,可以找到位于 LVM2 或 RAID 分区上的内核,但 GRUB1 则不然,因此通常建议您将 /boot 创建为具有简化布局的单独分区。)加载后,内核需要能够找到根文件系统,以便它可以启动引导过程。但是,如果没有某些用户空间工具触发,LVM 就无法启动,这些工具存在于根文件系统上,而如果没有存在于根文件系统上的 LVM 工具,则无法加载这些工具...;)

为了打破这个循环,initrd 或 initramfs 是一个压缩文件系统,与内核一起存储(在 /boot 中,或在内核本身内部),其中包含足够的 Linux 系统来启动 LVM 或 MD 等服务你要。它是一个临时文件系统,并且仅充当根文件系统足够长的时间以加载真正的根。

就实际制作而言,大多数有关该主题的文档都过时得惊人 - 例如,lvm2create_initrd 甚至不再在 Gentoo 上工作。 (几个月前我设置了同样的东西,在我从中获得一个可用的 initrd 之前,我必须重写该脚本。)创建您自己的 initramfs 可能很有趣,而且这是获得绝对最小启动的唯一方法过程(并了解 Linux 在此过程中如何启动的细节),但工作量很大。

简短的回答:使用 Dracut。这是一个新的框架,正在创建用于以大多数自动化的方式生成 initramfs,并且它位于 portage 中。文档有点稀疏,但是有足够的内容可以解决问题,而且这是迄今为止获得可靠的 initramfs 和 LVM 根的最简单方法。

答案4

是的。

如果您安装并使用 grub2,则创建和处理 initrd 所产生的复杂性就变得毫无意义了。 grub2 维基百科http://grub.enbug.org/LVMandRAID描述了如何让 /boot 位于 lvm 上,只需要 grub.cfg(grub 配置文件)中的 insmod lvm,因此不需要 initrd。

grub2 现在版本为 1.98,但仍处于 gentoo 的实验分支中。但它可以安装在另一个插槽中并且完全可用。

享受!

相关内容