我发现如果我选择jffs
orsd
作为文件系统(而不是initramfs
),内核大小将非常小(1.4 MB,而initramfs
3.4 MB)。这意味着initramfs
需要相当大的空间。因此,如果可以的话,我会完全删除它,从而得到非常小的内核,这就是我想要的。
我脑海中浮现的基本问题是:为什么我需要initramfs
? Linux 内核无法在没有任何初始文件系统的情况下启动吗?
我的最终应用程序只会进行计算和通信 - 根本不进行存储。因此,没有文件系统的操作系统是有意义的 - 至少对我的应用程序而言。
答案1
initramfs 的大小增加不是由于 ramfs 驱动程序(它只有几 kB,并且无论如何都需要其他东西),而是由于 initramfs 本身。 initramfs 包含组装和挂载真实根文件系统所需的程序。
/
Initramfs 使引导系统变得更加容易,并且在某些情况下(例如加密)是可能的。强烈建议将其保留在具有大量可热插拔外围设备的 PC 式硬件上。另一方面,在没有任何 initramfs 的情况下启动嵌入式设备非常有意义,并且内核只支持其构建的特定硬件配置。
内核当然需要启动到文件系统:必须有某种方式来加载您想要运行的任何应用程序。如果你不打算运行任何东西,那么你最好保持机器断电。
如果您不想使用 initramfs,只需告诉您的引导加载程序不要传递它即可。当然,也不要在内核构建的输出中包含一个 - 如果有的话,这是如何发生的,这取决于体系结构和引导加载程序:例如,vmlinux
并且bzImage
不包含 initramfs (它们分别是原始内核和压缩内核) ),但是uImage
(对于 U-Boot)会同时打包内核和 initramfs(如果有的话)。
(从技术上讲,如麦克塞夫请注意,总是有一个 initramfs — 但默认情况下,它是一个空的 134 字节存档。您所看到并想要摆脱的,是由您的构建过程创建的“真实的”非空 initramfs,其中包含用于挂载根文件系统的工具。)
请注意,initramfs 是创建没有持久数据的单一应用程序系统的合理方法:将所有应用程序放入 initramfs 中,启动并保留它。这使得组织持久存储或启动映像变得更加容易(您所需要的只是内核和 initramfs,它们可以捆绑在一起)。然而这种方法也有缺点:initramfs 中的所有数据都将永久存储在 RAM 中,并且您无法轻松修改启动映像中的文件,必须重建存档。
答案2
从线性FS:
initramfs 的唯一目的是挂载根文件系统。 initramfs 是在普通根文件系统上可以找到的完整目录集。它被捆绑到一个 cpio 存档中,并使用多种压缩算法之一进行压缩。
...
在 LFS 环境中使用 initramfs 只有四个主要原因:从网络加载 rootfs、从 LVM 逻辑卷加载、在需要密码的情况下拥有加密的 rootfs、或者为了方便将 rootfs 指定为标签或 UUID。任何其他情况通常意味着内核配置不正确。
...
对于大多数发行版来说,内核模块是拥有 initramfs 的最大原因。在一般发行版中,存在许多未知因素,例如文件系统类型和磁盘布局。在某种程度上,这与 LFS 相反,LFS 的系统功能和布局是已知的,并且通常会构建自定义内核。在这种情况下,很少需要 initramfs。
另一个来源www.kernel.org
除此之外,还有很多类似路由器的 Linux 系统不使用 initramfs。
答案3
您需要 initramfs 来进行更复杂的设置,例如网络引导、lvm 或 raid,因为它们需要一些用户模式实用程序来配置对 root fs 的访问。对于磁盘上的简单常规分区,只要将磁盘驱动程序内置到内核中,并通过设备路径而不是 UUID 指定 root 参数,那么您就可以不需要 initramfs。当然,设备路径可能会发生变化,具体取决于您连接的即插即用(即 USB)设备,甚至只是随机的时序差异,这就是为什么几乎每个人都使用 uuid 和 initramfs 来提高可靠性。
答案4
如果您的根分区位于使用 MBR 分区表的磁盘上,并且您希望将持久块设备名称作为root=
内核的参数,则需要使用 initramfs。/dev/sdX
不是持久性的,PARTUUID=
是仅 GPT 的功能,LABEL=
并且UUID=
在启动的早期阶段对内核不可见。 initramfs 可以加载存储和文件系统驱动程序,LABEL=
并且UUID=
对内核可见。