我试图了解 linux 内核如何知道所需的 rootfs 在启动时的位置。
我阅读了这份文件:
https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
兴趣的一部分说:
所有 2.6 Linux 内核都包含一个 gzip 压缩的“cpio”格式存档,当内核启动时,它会被提取到 rootfs...用于定位和挂载根分区的旧代码
我们的内核是 4.X,但我猜这仍然适用?这听起来像所有内核都有一个嵌入的“cpio”rootfs。
事实上,正如我们读到的那样:
2.6 内核构建过程始终创建一个 gzip 压缩的 cpio 格式 initramfs 存档并将其链接到生成的内核二进制文件中。默认情况下,此存档为空... 配置选项 CONFIG_INITRAMFS_SOURCE ... 可用于指定 initramfs 存档的源
这又提出了几个问题:
- 因此,如果我希望我的 rootfs 在 RAM 中,我需要设置
CONFIG_INITRAMFS_SOURCE
为指向我的 rootfs(大概是 cpio 格式)。
但这不是意味着我的内核和 rootfs 现在是不可分割的吗?如果我想在不重建的情况下对 RootFS 做一些小调整怎么办?如果我希望我的 rootfs 与内核分开存储怎么办?如何告诉内核我的 rootfs 的位置?
- 此外,如果我希望我的 rootfs 位于物理存储(如 eMMC、闪存驱动器等)而不是 RAM 中怎么办?
前面说过:
如果在嵌入的 cpio 归档文件被提取到 rootfs 后不包含 init 程序,内核将使用旧代码来定位和挂载根分区
但是……怎么办?它如何知道 rootfs 的位置?如果它在 eMMC 上,我需要以某种方式告诉内核,对吗?
我使用的引导加载程序是 U-boot。我检查了 U-boot 环境变量,看看它是否以某种方式将 rootfs 位置作为引导参数传递给内核,但似乎并非如此......
编辑:
正如评论中所指出的,rootfs 的位置通过 boot arg 传递给内核。就我而言,u-bootroot=/dev/mmcblk0p4 rw
作为引导参数传递给内核。所以这回答了我的一个问题 - 您可以将该位置作为引导参数传递给任何解压缩的 rootfs。
我仍然不清楚如何,考虑到一些rootfs.tar.gz
与内核分开的内容,如何告诉内核将其解压到 RAM 中并将其用作 rootfs。也许这是不可能的,我只需要使用CONFIG_INITRAMFS_SOURCE
?无论如何,我会阅读 4.X 文档。