RootFileSystem 与内核更新

RootFileSystem vs kernel updating

我知道它们是两个不同的东西,但是实际的 Linux 内核和 rootFS 文件系统之间有什么区别,尤其是在内存中的位置和更新方面?

关于分区,为什么内核和rootFS几乎总是在不同的分区上?内核代码不会存储在 rootFS 本身中吗?那么它们在内存中的不同分区上如何?

现在关于更新,我一直在研究一个 OTA 更新框架,它声称可以进行完整的内核映像更新。它为 rootFS 使用两个单独的分区。如果更新一个 rootFS 分区时出现问题,它可以回退到正常工作的 rootFS 分区,这很有意义。但是,这实际上是如何更新内核的呢?我不明白。

I know that they are two different things, but what is the difference between the actual Linux kernel and the rootFS file system especially in terms of location in memory and updates?

内核通常是一个镜像文件(如zImage)。在 ARM 系统内核中也需要设备树文件,但我们暂时避免使用它。反过来,RootFS 是一个文件系统,包含 / 中的所有文件,如二进制文件(initbash)、配置文件(/etc)、用户主目录, 等等。有时 RootFs 包含内核映像文件,有时不包含,这取决于您的特定系统。

Regarding partitioning, why is it that the kernel and rootFS are nearly always on different partitions? Won't the kernel code be stored within the rootFS itself? So how are they on different partitions in memory?

你的问题的关键是考虑引导加载程序(如 U-Boot 或 GRUB)。一旦您了解 OS 引导过程在引导加载程序中的工作原理,答案就会自动揭晓。正如您所提到的,存在不同的分区方案,这会导致引导过程的差异。实际上,那里有 很多 不同的引导方案。让我们回顾其中的一些内容,希望它能解释您想知道的内容。

  1. 内核和 rootfs 在不同的分区上。在这种情况下,引导加载程序通常将内核映像读取到 RAM,通过内核命令行(通过 root= 参数)传递 rootfs 分区。然后引导加载程序开始内核执行,内核从 root= 参数指定的分区挂载 rootfs。
  2. 内核映像位于 rootfs 中。在这种情况下,引导加载程序应该知道内核映像的确切位置(例如 /boot/zImage)。引导加载程序知道 rootfs FS 格式(例如 ext4),从 rootfs 读取 /boot/zImage 到 RAM。然后像上一项一样继续执行。
  3. 内核映像和 rootfs 通过网络(例如 TFTP)传递。在这种情况下,有时会将 rootfs 放入 RAM 中并作为 ramdisk(来自 RAM)安装。在这种情况下不使用持久存储,重启后对 rootfs 的任何更改都将丢失。另一种网络情况是当通过NFS挂载rootfs时,将使用服务器上的持久存储(用户透明查看)。

Now regarding updating, I've been looking into an OTA update framework which claims to do a full kernel image update. It uses two separate partitions for rootFS. If there is a problem updating one rootFS partition, it can fall back to the working rootFS partition which makes sense. However, how is this actually updating the kernel tho? I don't understand.

在更新方面,使用哪种方案并没有什么不同, (1) 或 (2)。你说的是什么叫做(至少在 Android)A/B Seamless Updates,意思是两个分区(A 和 B)用于存储相同的图像(例如旧的 rootfs 和新的 rootfs)。您需要了解只更新 rootfs 而不更新内核是可以的。内核开发中有个规则是这样写的:"We don't break userspace"。这意味着您可以依靠不同版本的内核来 运行 相同的用户空间,或者您可以依靠一个内核版本来 运行 不同的用户空间。

所以这更像是架构问题:您是否要更新系统中的内核?如果是,那么您需要为内核提供两个不同的分区,为 rootfs 提供两个分区。或者您可以将内核映像和 rootfs 放在同一个分区中(例如参见 [​​=23=] 格式),并提供第二个分区用于更新。