不带 initrd 启动

不带 initrd 启动

是否可以在没有 initrd.img 的情况下启动 linux?我计划添加默认驱动程序作为内核本身的一部分,并完全避免 initrd。

哪些模块应该成为内核的一部分而不是可加载模块?

答案1

确实如此,除非您的根卷位于 LVM、dmcrypt 分区上,或者需要运行命令才能访问它。

我已经很多年没有在我的服务器上使用 initrd 了。您至少需要内置这些模块:

  • 根卷磁盘所在的任何控制器的驱动程序
  • “获得”这些功能所需的驱动程序,例如 PCI、PCIe 支持、USB 支持等。
  • 运行安装在其上的文件系统的模块

    内置网卡驱动程序也是一个非常好的主意。

    我发现lspci/lsmod可以从当前运行的内核中帮助您,查看其中的内容并在编译之前使用 make menuconfig 搜索选项来查找启用模块的位置。

答案2

计划添加默认驱动程序

然后从 开始make defconfig && make,正如相关答案简洁地建议的那样。好吧,首先只是默认(x86_64?).config

这样你就得到了一个相当大的内核——现在是 9 MB。唯一的模块是网络过滤器那些。

更定制的配置会产生 4.5 MB 内核和更多模块(特别是 i915 模块)。

一些模块是内置的。参见其他答案。十年后,我还应该明确添加 I/O 设备:USB_HID对于键盘,FB(帧缓冲区)用于集成显卡,具体取决于系统。

设备似乎不喜欢在加电后保持未驱动状态:图形卡模块和网络模块,加上一些总线助手将我的瓦特从 5.1 降低到 3.1。这有点违反直觉;驱动程序解释为将设备置于正确的挂起状态,或以其他方式使它们平静下来。

虽然e1000e可以移除该模块(并且 0.2 瓦左右的功率似乎不会恢复;并且网络将会关闭),但i915甚至无法移除。所以这些“模块”的行为非常不同。

make defconfig在安装了lsmodinitrd/udevd 安装/发行版之后,您可以make nconfig或类似地开始清除(甚至添加一些东西)。与 一起工作Kconfig

修改.config完毕后:

make -jx bzImage

可以安装此映像(复制并给予 KCL: root=)并测试启动。如果它有效,并且您还需要这些模块:

make -jx modules
make INSTALL_MOD_PATH=/maybe/mnt/elseroot modules_install

.config重新配置之前不要忘记保存并命名文件。

一些模块(netfilter、文件系统支持)可以很好地移除。模块与 bzImage 分开编译,如果重复,可以节省内核编译时间。否则差异并不大,除非您关心lsmod输出的外观。

哦然后systemd还有一些要求和期望。

相关内容