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

是否可以在不创建initrd映像的情况下引导Linux内核?,linux,boot,initrd,Linux,Boot,Initrd,据我所知,initrd是一个可以在RAM中加载的小映像。它用于引导包含所有可加载模块的完整内核。作为过程的一部分,我们需要vmlinuz内核映像,它是bzImage的重命名版本 是否可以在不创建initrd映像的情况下引导内核 initrd包含理解根文件系统所需的模块,因此能够访问内核模块的正常存储 如果内核是使用所有内置代码编译的,而不是作为模块编译的,那么就不需要initrd。initrd/initramfs是可选的,不是必需的。bzImage是纯内核映像,可以由引导加载程序直接引导。但是,

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


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

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


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

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

这就是initramfs的用途:它是一个CPIO归档,附加到内核映像(内核映像是initramfs的容器,而不是相反)中的内核映像本身,或者在引导时由引导加载程序附加

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

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

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


但是,如果在编译内核时,内核映像中内置了所有必需的驱动程序和模块,并且根文件系统设备在系统中有固定的名称,则不需要initramfs,因为内核可以自己执行操作。

是的,可以在不使用initrd映像的情况下启动系统

initrd映像要么是gzip压缩的ramdisc映像,要么(现在更常见)是gzip压缩的.cpio映像

在后一种情况下,将.cpio扩展为名为initramfs的文件系统

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

然后,内核使用一些内置逻辑和命令行选项来尝试查找并装载“真实”根文件系统,该文件系统被装载在initramfs上,因此隐藏了它


这种“传统”引导系统大部分不用于现代发行版。

最小QEMU+Buildroot示例

下面是一个最小的具体示例,表明initrd不是强制性的:

通过该设置,我们可以轻松运行以下类型的两个工作QEMU命令:

qemu-system-x86_64 -drive file=rootfs.ext2
以及:

其中:

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

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

我的Debian Linux机箱中有一个自定义内核。我自己编译内核,然后让它们了解dpkg系统

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


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

您是否尝试过从引导加载程序中省略
initrd=…
选项?原则上,initrd是可选的,只要内核中编译了所有必要的驱动程序来查找根文件系统。还有,这怎么会是一个编程问题呢?这是可能的,过去所有Linux系统都是在没有initrd的情况下启动的。但是initrd让很多事情变得容易多了。我很好奇。。。为什么要在没有initrd的情况下启动?知道这一点可能会使提供更有意义的答案变得更容易。我当时正在为openwrt项目进行开发,希望创建一个占用空间小的内核映像。省略initrd部分会导致启动失败。这很有趣,我在哪里可以找到关于内置映像的更多详细信息?当我在没有
-initrd
的情况下运行QEMU时,这就是所使用的吗?看起来构建的int映像是从
gen\u init\u cpio
程序从
default\u cpio\u列表中生成的-请参阅
qemu-system-x86_64 -initrd rootfs.cpio