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



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

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

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

这就是initramfs的用途:它是一个CPIO存档,可以在内核映像本身或引导时由引导加载程序附加到内核映像(内核映像是initramfs的容器,而不是其他容器)。

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

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

由于CPIO简单了几个数量级,initramfs比initrd更受欢迎,因为这既节省了对任何内置文件系统模块的需求,也使initramfs的创建更容易。不必创建ext2映像、loopdevice挂载并填充它,它可以归结为一个简单的归档创建,这与使用tar没有什么不同。

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

最小QEMU+Buildroot示例

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

有了这个设置,我们可以很容易地运行两个工作的QEMU命令类型:

qemu-system-x86_64 -drive file=rootfs.ext2

和:

qemu-system-x86_64 -initrd rootfs.cpio

其中:

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

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

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

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

是的,您可以在没有initrd映像的情况下启动系统。

initrd映像是一个gzippedramdisk映像,或者(现在更常见的)一个gziped.cpio映像。

在后一种情况下,.cpio被扩展到一个名为initramfs的文件系统中。

如果.cpio映像不存在,内核将使用内置映像,该映像只包含一些特殊文件(如/dev/console、/dev/null和一些目录),但不包含二进制文件。

然后,内核使用一些内置的逻辑和命令行选项来尝试查找和装载"真正的"根文件系统,该文件系统"安装"在initramfs上,因此将其隐藏

这种"遗留"引导系统在现代发行版中大多不使用。

我的Debian Linux盒子里有一个自定义内核。我自己编译内核,然后把它们应用到dpkg系统的知识中。

配置内核时,我首先删除的是initrd。我知道我的装备是如何访问根文件系统(串行ATA、SCSI支持、SCSI磁盘和ext4)的,所以我将它们编译到内核中。其他模块可从根文件系统/lib/modules 访问

这救了我很多次。如果出现问题,内核会将我放到一个工作提示下,我可以使用它来访问我的装备。如果initrd坏了,我需要一个引导棒(通常会丢失)。现在,当内核知道该怎么做才能得到引导提示时,我可以使用我的系统工具来解决这个问题。

相关内容

  • 没有找到相关文章

最新更新