phu*_*ehe 13 root boot kernel initrd lvm
我刚刚建立了一个 Gentoo 基本系统(这意味着我现在可以启动和登录并使用它做一些事情)。我的根分区位于 LVM2 虚拟组中(具有单独的/boot分区)。为了启动,我需要将以下参数传递给内核:
root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm
Run Code Online (Sandbox Code Playgroud)
显然,它在挂载 root 之前使用初始 ramdisk 做一些事情(我猜是加载 LVM 的东西)。有没有办法可以将这段代码放入内核本身,这样就不需要 initrd 了?如果没有,我如何自己制作 initrd?
补充一点可能很有用,我曾尝试为非 LVM 根目录编译内核,没有 initrd 并且它运行良好。然后我试图将整个事情放在 LVM 下,但无法启动机器(我猜它无法处理 LVM 的东西)。然后我使用genkernel带有--lvm选项的工具,它创建了我当前正在使用的工作内核和 initrd。
现在我想跳过genkernel并自己做所有事情,最好没有 initrd 以便机器启动得更快(反正我不需要灵活性)。
简单的回答:不。如果你想要 LVM,你需要一个 initrd。
但正如其他人之前所说:LVM 不会减慢您的系统速度或以其他方式做任何坏事,它们只是允许您创建一个环境,允许您的内核加载并完成其工作。
initrd 允许加载您的内核:如果您的内核位于 LVM 驱动器上,则必须先建立整个 LVM 环境,然后才能加载包含内核的二进制文件。
查看initrd 上的维基百科条目,它解释了 initrd 的作用以及您需要它的原因。
另一个注意事项:我明白你想要自己做事的观点,但即使使用 genkernel 也可能弄脏你的手。使用 genkernel --menuconfig all ,您基本上可以设置所有内容,就好像您将在没有工具支持的情况下完全构建内核一样,genkernel 只是为您添加了 make bzImage、make modules 和 make modules_install 行,并执行那些讨厌的 initrd 内容。
您显然可以自己构建 initrd,因为它在此处针对 initramfs或此处针对 initrd 进行了概述。
编辑:刚刚意识到您正在尝试在 LVM 上启动,我从未设置过 LVM,也从不需要它们,所以这里的方法可能不起作用
以下是创建无 initrd 内核所需的基本规则(根据记忆,我记不清了):
重新编译内核,确保内置到内核中(重要:不是作为模块!):
Device Drivers)/,/etc/*和/lib/modules/*(下File systems)基本上,内核需要能够挂载根文件系统、读取 /etc/fstab、加载其他驱动程序模块(如果需要)以及挂载其他非根文件系统以完成其余的引导过程。如果您有更复杂的启动过程,例如网络启动,那么您还需要内置这些驱动程序。
从内核“常规设置 > 初始 RAM 文件系统和 RAM 磁盘 (initramfs/initrd)support”(又名 CONFIG_BLK_DEV_INITRD=n)禁用 initrd。
修改 GRUB 配置,不再需要 init= 和 realroot=,并设置 root= 使其指向根文件系统设备。
我认为仅此而已。不要忘记保留备份内核和可启动 Live CD 的良好副本,以防万一。
可能出错的事情:如果您编译了错误的驱动程序,或者如果您将基本驱动程序编译为模块,则内核无法读取文件系统。使用新内核或 Live CD 重新启动并使用正确的驱动程序重新编译内核。
唯一困难的部分是弄清楚哪个驱动程序与您的硬件相关。您可以使用lspci和lshw来帮助识别您的硬件。如果您还没有这些工具,那么emerge lshw pciutils.