没有文件系统,文件可以存在吗?

tra*_*shi 1 linux filesystems files

我正在阅读有关文件系统的内容,并想到了一些问题。

问:如果文件是 unix/linux 的一个组成部分(即代表 中的进程/proc或设备文件/dev),如一句名言'一切都是文件”,它们是否存在于文件系统的上下文之外?我觉得像网络套接字文件或块设备文件这样的文件是独立于文件系统的,更像是操作系统本身的一部分。

后续 Q. unix/linux 可以在没有文件系统的情况下运行吗?例如,Linux 系统是否可以通过手动访问二级存储来工作?

ilk*_*chu 5

是的。和不。也许。

并非一切都是文件;显然,硬盘驱动器不能包含一个分区,然后包含一个文件系统,然后包含硬盘驱动器本身。只是很多东西都可以通过名字访问通过文件系统树可见。

就文件系统而言(逻辑文件系统,或数据结构意义上的具体系统,如 ext4),只是将某些文件标记为某些特定编号设备的“设备节点”。但是它们的功能是由单独的驱动程序实现的。当进程访问它们时,操作系统只是将访问转移到适当的驱动程序,而不是文件系统。将它们视为引用或指针等。

考虑到这一点,很容易理解 eg/proc绝不是强制性的。系统可以运行,即使没有它也可以运行进程。您只是没有那种查看这些进程的方法。但是像fork(), kill()and 之类的东西wait*()仍然可以工作,因为它们通过 PID 来引用进程,而不是通过某个文件系统名称。通常,网络套接字也不显示为命名文件。Unix 域套接字可以做到这一点,但 IIRC 他们不必这样做。而 TCP 或 UDP 套接字等则不然。但是网络套接字确实作为进程的文件描述符出现,read()并且write()系统调用与管道或“真实”文件一样使用它们。所以在某种意义上,网络套接字也像文件一样行走、交谈和嘎嘎叫,即使网络协议与在磁盘上存储位没有太大关系。

但是,据我所知,如果没有那些命名的设备节点,您实际上没有办法引用任意硬盘驱动器。您的硬件仍然存在,系统仍然具有必要的 SATA/USB/任何使用它们所需的驱动程序,但您无法告诉它这样做。尽管您可以挂载文件系统,然后删除指向文件系统所在设备的设备节点。这里没有问题,因为设备节点只是用户空间访问设备的一种方式。

你问,“unix/linux 可以在没有文件系统的情况下运行吗?”。一方面,Linux 不能在没有文件系统的情况下运行,因为它通过查找要运行的可执行文件来启动用户空间(最终运行保留为 的内容init)。该文件系统不需要是普通磁盘驱动器上的一个,但它可以是内核根据内核映像中包含的数据设置的特殊 rootfs 文件系统。(顺便说一句,你无法摆脱根文件系统的,它总是在那里,即便是空的,所以内核并不需要处理没有任何挂载文件系统的想法。)请参阅RAMFS-根文件系统,initramfs.txt在有关 rootfs 的详细信息,请参阅内核文档。

我想我们可以假设一些假设的操作系统可以在没有文件系统的情况下运行,但是例如execve()系统调用采用文件名,因此正在运行的任何程序都无法启动其他程序(正在运行的程序需要以其他方式加载),并且如果没有命名的设备节点,访问存储也会很困难。无论如何,它看起来不像其他Unixen。

在 Linux 上,有可能设计一个奇怪的单一用途系统,它会在启动时从 rootfs 启动单个用户空间程序,然后清除 rootfs 并且从不挂载任何其他文件系统。这将尽可能接近没有文件系统,并且程序仍然可以运行,例如访问网络。不过,我怀疑它是否有任何实际用途,而且像往常一样,任何打开的文件在关闭之前仍然存在,因此删除它们的名称可能不是很有用。

另请参阅Linux 内核是否需要文件系统才能运行?,我在上面回应的部分答案。对于上一个较长的讨论,“一切皆文件”的口号,看到这个答案一个门外汉对“一切皆文件”的解释-从Windows有什么不同?.