我试图了解 linux 内核如何知道启动时所需的 rootfs 在哪里。
我读了这个文件:
https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
感兴趣的部分说:
所有 2.6 Linux 内核都包含一个 gzip 压缩的“cpio”格式存档,在内核启动时将其解压缩到 rootfs 中……如果在将嵌入式 cpio 存档解压缩到其中后,rootfs 中不包含 init 程序,则内核将失败用于定位和挂载根分区的旧代码
我们的内核是 4.X,但我猜这仍然适用吗?这听起来像所有内核都有一个嵌入式“cpio”rootfs。
事实上,正如我们在上面读到的那样:
2.6 内核构建过程总是创建一个 gzipped cpio 格式的 initramfs 存档并将其链接到生成的内核二进制文件中。默认情况下,此存档为空...配置选项 CONFIG_INITRAMFS_SOURCE ... 可用于指定 initramfs 存档的源
这又引发了几个问题:
CONFIG_INITRAMFS_SOURCE指向我的 rootfs(大概是 cpio 格式)。但这不是意味着我的内核和 rootfs 现在是不可分割的吗?如果我想在不重建的情况下对 RootFS 进行小幅调整怎么办?如果我希望我的 rootfs 与内核分开存储怎么办?如何告诉内核我的 rootfs 的位置?
之前说过:
如果在嵌入的 cpio 归档文件被提取到 rootfs 之后,它不包含一个 init 程序,内核将使用旧代码来定位和挂载一个根分区
但是……怎么办?它如何知道在哪里可以找到 rootfs?如果它在 eMMC 上,我需要以某种方式告诉内核,对吗?
我使用的引导程序是 U-boot。我检查了 U-boot 环境变量,看看它是否以某种方式将 rootfs 位置作为引导参数传递给内核,但似乎并非如此...... …