Linux 内核是否需要文件系统才能运行?

Pet*_* L. 21 filesystems linux-kernel

我的观点是肯定的,确实如此,因为所有对外部世界(非特权处理器模式)有用的暴露首先需要一个在外部世界中运行的进程。这将需要一个文件系统,甚至是一个临时的、内存中的文件系统。

另一位工程师不同意我的观点,但我似乎无法在所有(我不知道的)情况下证明这一点。

这个问题的答案是否取决于“跑步”的定义?

Phi*_*ing 28

这是一个相当奇怪的问题,因为您不像运行程序那样运行内核。内核是运行程序的平台。当然有设置和关闭代码,但不可能单独运行内核。必须始终有一个主要的“init”进程。如果它不存在,内核就会恐慌。如果 init 试图退出内核,它也会panic。

如今,init 进程类似于 systemd。如果没有另外指定,内核将尝试从以/sbin/init. 在此处查看 init 参数http://man7.org/linux/man-pages/man7/bootparam.7.html紧急情况下,您可以使用init=/bin/bash. 但是请注意您总是在文件系统上指定要运行的文件。

因此,如果内核启动时没有文件系统,则内核会发生恐慌,因为没有文件系统就无法加载 init。

由于内核的初始化阶段,可能会出现一些混淆。初始 ramdisk 从磁盘上的映像加载,其中包含重要的驱动程序和安装脚本。这些是在加载文件系统之前执行的。但是毫无疑问,最初的 ramdisk 本身就是一个文件系统。/init调用初始 ramdisk (存储在初始 ramdisk 上)。在许多发行版中,最终调用/sbin/init. 同样,如果没有文件系统,这是不可能的。

  • 请注意,您可以将 initramfs(一种提取到 ramfs 或 tmpfs 文件系统中的 CPIO 存档)构建到内核中。这是否算作内核“需要文件系统”取决于您,因为这意味着您可以引导内核,除了内核之外什么都没有,并且拥有一个功能性(如果有点受限)的系统。另请注意,即使您修补内核以不再需要 init,它仍将创建永远不会公开的 _internal_ 虚拟文件系统。 (5认同)

kas*_*erd 17

答案将取决于您的字面意思是没有文件系统,还是打算对问题的解释与实际陈述方式略有不同。对问题的解释方式略有不同的答案是:

  • 在没有任何块设备的情况下运行 Linux对于某些特殊用例是完全可行和有用的。
  • 在没有任何文件系统的情况下运行 Linux将需要重写内核代码的某些部分,这不太可能是一项有用的工作。
  • 在不使用任何文件描述符的情况下运行 Linux需要付出很多努力。我很确定这不值得付出努力。

您必须重写部分内核代码以创建没有文件系统的工作系统的原因是:

  • 每个线程都有一个根目录和一个必须指向某个文件系统的当前工作目录。
  • 程序由execve需要来自文件系统的可执行文件的系统调用启动。
  • 内核在引导过程中创建一个基于内存的文件系统。

在程序开始使用后execve,它可以取消映射启动它的可执行文件,但为了这样做而不会立即崩溃它首先必须创建一个不受文件支持的可执行内存映射,在跳转到它并取消映射可执行文件之前,它必须使用一些有用的代码对其进行初始化。

因此,正在运行的用户模式程序可以处于没有文件支持的内存映射的状态,并且可以关闭所有文件支持的文件描述符。它不能停止拥有根目录和当前工作目录,但它可以避免这些。

因此,尽管在这种状态下您可以实现内核代码以从程序下剥离文件系统并使其继续运行,但听起来似乎没有用。并且在不经过使用文件系统的中间状态的情况下进入最终状态将是更多的工作,没有任何有用的好处。

一些特殊用例的有用设置

避免使用块设备可能很有用。在引导期间,内核会创建一个内存文件系统,并且它还可以cpio在执行init. 这样您就可以完全从基于内存的文件系统运行系统,而无需任何块设备来支持它。

这对于您不想保留任何状态并且希望系统在重新启动时从干净的状态启动的系统非常有用。

当然,内核和 cpio 存档必须在内核获得控制权之前以某种方式存在于内存中。他们如何到达那里是引导加载程序的工作。即使最终运行的系统不使用块设备,引导加载程序也可以从块设备加载它们。但是引导加载程序也可以在不使用块设备的情况下获取内核和 cpio 存档,例如通过网络引导。

  • @彼得L。是的,如果你不重写任何东西,Linux 将需要一个文件系统。当人们谈论没有文件系统的 Linux 的实际用途时,他们通常指的是由块设备支持的那些,并且您可以在没有由块设备支持的文件系统的情况下运行 Linux。你仍然有某种文件系统。 (2认同)

K7A*_*AAY 5

在Linux中,几乎每个设备都是一个文件,所以你必须有一个文件系统来运行它。

  • 当然,设备驱动程序存在于内核内部,无论设备文件是否指向它们。 (8认同)
  • 并非每个设备都是文件。例如,网络接口(“eth0”、“wlan0”等)就不是。 (6认同)