是否可以在没有 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
在安装了lsmod
initrd/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
还有一些要求和期望。