我的意见是肯定的,确实如此,因为所有对外界的有用暴露(非特权处理器模式)首先需要一个在外界运行的进程。这将需要一个文件系统,甚至是一个临时的、RAM 中的文件系统。
另一位工程师不同意我的观点,但我似乎无法在所有(我不知道的)情况下证明这一点。
这个问题的答案取决于“跑步”的定义吗?
答案1
这是一个相当奇怪的问题,因为您不像运行程序那样运行内核。内核是运行程序的平台。当然有设置和关闭代码,但不可能单独运行内核。必须始终有一个主要的“init”进程。如果它不存在,内核就会出现恐慌。如果 init 尝试退出内核也会出现恐慌。
如今,init 进程类似于 systemd。如果没有另外指定,内核将尝试从以 . 开头的位置列表运行程序/sbin/init
。请参阅此处的 init 参数http://man7.org/linux/man-pages/man7/bootparam.7.html在紧急情况下,您可以使用 启动 Linux init=/bin/bash
。但请注意如何始终指定要运行的文件系统上的文件。
因此,如果内核在没有文件系统的情况下启动,它将出现恐慌,因为没有文件系统就无法加载 init。
由于内核的初始化阶段,可能会出现一些混乱。初始 ramdisk 是从磁盘上的映像加载的,其中包含重要的驱动程序和安装脚本。这些在加载文件系统之前执行。但毫无疑问,初始 ramdisk 本身就是一个文件系统。调用初始 ramdisk /init
(存储在初始 ramdisk 上)。在许多发行版中,最终调用的是 this /sbin/init
。同样,如果没有文件系统,这是不可能的。
答案2
答案将取决于您的字面意思是没有文件系统,还是问题的解释是否与实际陈述的方式略有不同。对问题的解释略有不同的答案是:
- 无需任何程序即可运行 Linux块设备对于某些特殊用例来说是完全可行且有用的。
- 无需任何程序即可运行 Linux文件系统需要重写内核代码的某些部分,而且这不太可能是有用的工作。
- 不使用任何程序运行 Linux文件描述符需要付出很多努力。我很确定这不值得付出努力。
您必须重写部分内核代码才能创建一个没有文件系统的工作系统的原因是:
- 每个线程都有一个根目录和一个必须指向某个文件系统的当前工作目录。
execve
程序由需要文件系统中的可执行文件的系统调用启动。- 内核在引导过程中创建基于内存的文件系统。
程序启动后,execve
它可以取消启动它的可执行文件的映射,但为了做到这一点而不立即崩溃,它首先必须创建一个不受文件支持的可执行内存映射,在跳转到它并取消映射可执行文件之前,它必须使用一些有用的代码对其进行初始化。
因此,正在运行的用户模式程序可以存在于没有文件支持的内存映射的状态,并且可以关闭文件支持的所有文件描述符。它不能停止拥有根目录和当前工作目录,但可以避免这些。
因此,尽管在这种状态下,您可以实现内核代码来将文件系统从程序中剥离出来并让它继续运行,但这听起来似乎没什么用。在不经历使用文件系统的中间状态的情况下进入最终状态将需要更多的工作,而且没有任何好处。
对于一些特殊用例来说有用的设置
避免使用块设备可能很有用。在引导期间,内核创建一个内存文件系统,并且它还可以cpio
在执行之前使用存档中的内容填充该文件系统init
。这样,您就可以完全从基于内存的文件系统运行系统,而无需任何块设备支持。
这对于您不想保留任何状态并且希望系统在重新启动时从头开始的系统非常有用。
当然,在内核获得控制权之前,内核和 cpio 存档必须以某种方式存在于内存中。他们如何到达那里是引导加载程序的工作。即使最终运行的系统不使用块设备,引导加载程序也可以从块设备加载这些内容。但引导加载程序也可以在不使用块设备的情况下获取内核和 cpio 存档,例如通过网络引导。
答案3
在 Linux 中,几乎每个设备都是一个文件,所以你必须有一个文件系统来运行它。
答案4
内核是一个程序,就像任何其他程序一样。默认情况下,Linux 内核尝试访问文件系统,但是可以通过修改内核来轻松消除这种行为(实际上只是添加一个“arch_call_rest_init()”函数)。为了执行“有用的工作”,我们期望开发人员可能在自定义驱动程序中包含内核线程(kthreads),以执行一些所需的初始化和应用程序类型工作负载。 Linux 内核已经包含许多 kthreads,但主要是为了执行内核或驱动程序的辅助工作。内核上下文中可用的 API 与 Linux 用户空间中可用的 API 有很大不同。在无文件系统场景中,很大一部分系统调用功能将变得毫无用处。
是的,Linux 默认情况下期望访问文件系统。不,修改后的内核肯定可以在没有任何文件系统的情况下执行有用的工作。在我看来,不带文件系统的 Linux 的实际用途相当有限,但并非为零。 FWIW,过去许多实时内核被构建到与 RT 应用程序相同的命名空间和二进制文件中。