![是否可以在不使用 initrd 的情况下将 root 放入 LVM 中?](https://linux22.com/image/41896/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%B8%8D%E4%BD%BF%E7%94%A8%20initrd%20%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E5%B0%86%20root%20%E6%94%BE%E5%85%A5%20LVM%20%E4%B8%AD%EF%BC%9F.png)
我刚刚设置了一个 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 内核所需执行的基本规则(凭记忆,我记不太清楚了):
重新编译内核,确保内置到内核中(重要:不是作为模块!):
- 主板驱动程序和硬盘驱动程序(均在 下
Device Drivers
) /
、/etc/*
和/lib/modules/*
(在 下File systems
)的文件系统驱动程序
基本上,内核需要能够挂载根文件系统、读取 /etc/fstab、加载其他驱动程序模块(如果需要)以及挂载其他非根文件系统以完成引导过程的其余部分。如果您有更复杂的启动过程,例如网络启动,那么您还需要内置这些驱动程序。
- 主板驱动程序和硬盘驱动程序(均在 下
从内核“常规设置 > 初始 RAM 文件系统和 RAM 磁盘 (initramfs/initrd) 支持”禁用 initrd,又名 CONFIG_BLK_DEV_INITRD=n。
修改 GRUB 配置,不再需要 init= 和 realroot=,并设置 root= 使其指向根文件系统设备。
我想仅此而已。不要忘记保留备份内核以及可启动 Live CD 的完整副本,以防万一发生问题。
可能出错的事情:如果您编译了错误的驱动程序,或者将基本驱动程序编译为模块,则内核无法读取文件系统。使用新内核或使用 Live CD 重新启动并使用正确的驱动程序重新编译内核。
唯一困难的部分是确定哪个驱动程序与您的硬件相关。您可以使用lspci
和lshw
来帮助识别您的硬件。如果您还没有这些工具,那么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 的实验分支中。但它可以安装在另一个插槽中并且完全可用。
享受!