是否可以在不创建initrd映像的情况下启动Linux内核?

Nee*_*eel 13 linux boot initrd

据我所知,initrd是一个可以在RAM中加载的小图像.它用于引导包含所有可加载模块的完整内核.作为该过程的一部分,我们需要vmlinuz内核映像,它是bzImage的重命名版本.

是否可以在不创建initrd映像的情况下引导内核?

dat*_*olf 19

initrd/initramfs是可选的,不是必需的.bzImage是纯内核映像,可以由引导加载程序直接引导.但是,执行某些任务(加载文件系统模块,磁盘访问驱动程序,从没有固定名称/路径的某些可交换介质安装根文件系统等)可能是必要的,这通常需要访问文件系统和用户空间工具.

这就是initramfs的用途:它是一个CPIO归档,它连接到内核映像(内核映像是initramfs的容器而不是其他方式),无论是在内核映像本身,还是在引导时由引导加载程序.

该CPIO存档包含一个初始rootfs,其中包含设置所有设备以访问正确的根文件系统所需的模块,以及一些识别这些设备的程序,加载模块,执行其他一些启动任务,将正确的根文件系统重新安装到/和start/sbin /在里面

initrd类似,主要区别在于它是一个文件系统映像,可能并且通常是压缩的.内核必须支持内置的文件系统,并将此图像作为初始/安装.

由于CPIO在几个数量级上更简单,因此initramfs优先于initrd,因为这既节省了内置任何文件系统模块的要求,也使initramfs创建更容易.而不是必须创建一个ext2映像,loopdevice安装并填充它,它归结为一个简单的存档创建,与使用tar不同.

但是,如果您使用内核映像中内置的所有必需驱动程序和模块编译内核,并且您的根文件系统设备在系统中具有固定名称,则您不需要initramfs,因为内核可以自行完成.


Dou*_*der 5

initrd 包含理解根文件系统所需的模块,因此能够访问内核模块的正常存储。

如果您的内核是使用所有内置代码而不是作为模块编译的,则不需要 initrd。


Cir*_*四事件 5

最小 QEMU + Buildroot 示例

这是一个最小的具体示例,表明 initrd 不是强制性的:https : //github.com/cirosantilli/linux-kernel-module-cheat/tree/0b4f156b1b536a89c90882ed8ce551abcd3780af#initrd

有了这个设置,我们可以轻松地运行两个有效的 QEMU 命令:

qemu-system-x86_64 -drive file=rootfs.ext2
Run Code Online (Sandbox Code Playgroud)

和:

qemu-system-x86_64 -initrd rootfs.cpio
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • rootfs.ext2rootfs.cpio基本上是相同的根文件系统,但格式不同
  • 第一个命令有一个硬盘驱动器,没有 -initrd
  • 第二个命令有-initrd但没有硬盘

在这两种情况下,Linux 都可以正常启动,只是在-initrd系统中,文件写入不是持久的,因为所有内容都在内存中。