据我所知,initrd是一个可以在RAM中加载的小图像。它用于引导包含所有可加载模块的完整内核。作为该过程的一部分,我们需要vmlinuz内核映像,它是bzImage的重命名版本。
是否可以在不创建initrd映像的情况下启动内核?
答案 0 :(得分:16)
initrd / initramfs是可选的,不是必需的。 bzImage是纯内核映像,可以由引导加载程序直接引导。但是,执行某些任务(加载文件系统模块,磁盘访问驱动程序,从没有固定名称/路径的某些可交换介质安装根文件系统等)可能是必要的,这通常需要访问文件系统和用户空间工具。 / p>
这就是 initramfs 的用途:它是一个CPIO归档,它连接到内核映像(内核映像是initramfs的容器,而不是其他方式),在内核映像本身,或者在启动时通过引导加载程序。
该CPIO存档包含一个初始rootfs,其中包含设置所有设备以访问正确的根文件系统所需的模块,以及一些识别这些设备的程序,加载模块,执行其他一些启动任务,将正确的根文件系统重新安装到/和start / sbin / init
initrd 类似,主要区别在于它是一个文件系统映像,可能并且通常是压缩的。内核必须支持内置的文件系统,并将此图像挂载为初始的/.
由于CPIO比几个数量级更简单,因此initramfs优先于initrd,因为这既保留了内置任何文件系统模块的要求,也使initramfs创建更容易。而不是必须创建一个ext2映像,loopdevice安装并填充它,它归结为一个简单的存档创建,与使用tar不同。
但是,如果您使用内核映像中内置的所有必需驱动程序和模块编译内核,并且您的根文件系统设备在系统中具有固定名称,则您不需要initramfs,因为内核可以自行完成任务
答案 1 :(得分:2)
initrd包含理解根文件系统所需的模块,因此能够访问内核模块的正常存储。
如果你的内核是用内置的所有代码编译的,而不是作为模块编译的,那么就不需要initrd。
答案 2 :(得分:2)
是的,您可以在没有initrd映像的情况下启动系统。
initrd图像是一个gzip压缩图像,或者(现在更常见的)是一个压缩的.cpio图像。
在后一种情况下,.cpio将扩展为名为initramfs的文件系统。
如果.cpio映像不存在,内核会使用内置映像,它只包含一些特殊文件(例如/ dev / console,/ dev / null和一些目录),但是没有二进制文件。
内核然后使用一些内置逻辑和命令行选项来尝试查找和装载“真正的”根文件系统,它安装在initramfs“上方”并因此隐藏它。
这种“遗留”启动系统主要不用于现代发行版。
答案 3 :(得分:2)
最小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.ext2
和rootfs.cpio
基本上是相同的根文件系统,但格式不同-initrd
-initrd
但没有硬盘在这两种情况下,Linux都可以正常启动,但在-initrd
系统中,文件写入不会持久,因为所有内容都在内存中。
答案 4 :(得分:-2)
我的Debian Linux机器上有一个自定义内核。我自己编译内核,然后将其用于dpkg系统知识。
在配置内核时,我要删除的第一件事是initrd。我知道我的钻机是如何访问根文件系统(串行ATA,SCSI支持,SCSI磁盘和ext4)的,所以我将它们编译为内核。其他模块可从根文件系统/ lib / modules
访问这救了我很多遍。如果出了什么问题,内核会将我引导至工作提示符,我可以使用它来访问我的装备。如果initrd坏了,我需要一个引导棒(通常会丢失)。现在,当内核知道如何执行启动提示时,我通常可以使用系统工具来解决问题。