Linux 中的虚拟文件系统:为什么需要它们以及它们如何工作? 第1部分

大家好! 我们继续为您已经爱上的课程推出新的课程,现在我们急于宣布我们正在启动一组新的课程 《Linux 管理员》将于四月底推出。 本次活动将有一份新出版物的日期。 使用原始材料,您可以 在这里阅读.

虚拟文件系统是一种神奇的抽象,它允许 Linux 的哲学说“一切都是文件”。

Linux 中的虚拟文件系统:为什么需要它们以及它们如何工作? 第1部分

什么是文件系统? 基于 Linux 最早的贡献者和作者之一的话 罗伯塔·拉瓦,“文件系统是根据特定结构组装的数据的分层存储。” 尽管如此,这个定义同样适合 VFAT(虚拟文件分配表)、Git 和 卡桑德拉 (NoSQL数据库)。 那么“文件系统”到底是什么定义的呢?

文件系统基础知识

Linux 内核对可被视为文件系统的实体有一定的要求。 它必须实现方法 open(), read() и write() 对于有名称的持久对象。 从面向对象的角度来看 程序设计,内核将通用文件系统定义为抽象接口,而这三个大函数被认为是“虚拟的”,没有具体的定义。 因此,默认的文件系统实现称为虚拟文件系统(VFS)。

Linux 中的虚拟文件系统:为什么需要它们以及它们如何工作? 第1部分

如果我们可以打开、读取和写入一个实体,那么该实体就被视为一个文件,正如我们从上面控制台的示例中看到的那样。
VFS 现象只是强调了类似 Unix 的观察“一切都是文件”。 想想上面那个 /dev/console 的小例子展示了控制台的实际工作原理是多么奇怪。 图为交互式 Bash 会话。 将字符串发送到控制台(虚拟控制台设备)会将其显示在虚拟屏幕上。 VFS 还有其他甚至更奇怪的特性。 例如,它允许您通过以下方式搜索 这些.

诸如 ext4、NFS 和 /proc 等熟悉的系统在 C 数据结构中具有三个重要函数,称为 文件操作。 此外,某些文件系统以熟悉的面向对象的方式扩展和重新定义了 VFS 功能。 正如 Robert Love 指出的那样,VFS 抽象允许 Linux 用户轻松地将文件复制到第三方操作系统或抽象实体(例如管道),而无需担心其内部数据格式。 在用户端(用户空间),使用系统调用,进程可以使用以下方法从文件复制到内核数据结构 read() 一个文件系统然后使用该方法 write () 用于数据输出的另一个文件系统。

属于基本 VFS 类型的函数定义位于文件中 文件系统/*.c 内核源代码,而子目录 fs/ 包含某些文件系统。 核心还包含实体,例如 cgroups, /dev и tmpfs,在启动过程中需要,因此在内核子目录中定义 init/。 请注意 cgroups, /dev и tmpfs 不要调用“三大”功能 file_operations,而是直接读写内存。
下图显示了用户空间如何访问 Linux 系统上通常安装的不同类型的文件系统。 结构未显示 pipes, dmesg и POSIX clocks,它也实现了结构 file_operations,通过VFS层访问。

Linux 中的虚拟文件系统:为什么需要它们以及它们如何工作? 第1部分

VFS 是系统调用和某些特定实现之间的“包装层” file_operations例如 ext4 и procfs。 功能 file_operations 可以与设备驱动程序或内存访问设备交互。 tmpfs, devtmpfs и cgroups 不使用 file_operations,而是直接访问内存。
VFS 的存在提供了重用代码的机会,因为与文件系统相关的基本方法不必由每种类型的文件系统重新实现。 代码重用是软件工程师的常见做法! 但是,如果可重用代码包含 严重的错误,所有继承通用方法的实现都会受到它们的影响。

/tmp:简单提示

检测系统上是否存在 VFS 的一个简单方法是输入 mount | grep -v sd | grep -v :/,这将显示所有已安装的(mounted)非磁盘驻留且非 NFS 的文件系统,这在大多数计算机上都是如此。 列出的坐骑之一(mounts)VFS无疑会 /tmp, 对?

Linux 中的虚拟文件系统:为什么需要它们以及它们如何工作? 第1部分

大家都知道存储 / tmp 在物理媒介上——疯狂! .

为什么不宜保存 /tmp 在物理媒体上? 因为文件在 /tmp 是临时的,存储设备比创建 tmpfs 的内存慢。 此外,物理介质在被覆盖时比内存更容易磨损。 最后,/tmp 中的文件可能包含敏感信息,因此使它们在每次重新启动时消失是一项重要功能。

不幸的是,某些 Linux 发行版安装脚本默认在存储设备上创建 /tmp。 如果您的系统也发生这种情况,请不要绝望。 请遵循一些简单的说明 Arch Wiki要解决此问题,请注意分配的内存 tmpfs 无法用于其他目的。 换句话说,一个拥有巨大 tmpfs 和大文件的系统可能会耗尽内存并崩溃。 另一个提示:编辑文件时 /etc/fstab,记住它必须以换行符结尾,否则你的系统将无法启动。

/proc 和 /sys

除了 /tmp、Linux用户最熟悉的VFS(虚拟文件系统)是 /proc и /sys。 (/dev 驻留在共享内存中并且没有 file_operations)。 为什么有这两个组件? 我们来看看这个问题。

procfs 创建内核及其监视的进程的快照 userspace。 在 /proc 内核打印出有关其可用内容的信息,例如中断、虚拟内存和调度程序。 除了, /proc/sys 是命令配置参数的地方 sysctl, 可以用来 userspace。 各个进程的状态和统计信息显示在目录中 /proc/.

Linux 中的虚拟文件系统:为什么需要它们以及它们如何工作? 第1部分

这是 /proc/meminfo 是一个空文件,但包含有价值的信息。

行为 /proc 文件显示了 VFS 磁盘文件系统的不同之处。 一方面, /proc/meminfo 包含可以使用命令查看的信息 free。 另一方面,却是空的! 它是如何工作的? 这种情况让人想起题为“ 当没人看月亮时,月亮还存在吗? 现实与量子理论”由康奈尔大学物理学教授 David Mermin 于 1985 年撰写。 事实上,当发出请求时,内核会收集内存统计信息 /proc,实际上在文件中 /proc 当没人看的时候,什么也没有。 正如所说 梅尔敏,“基本量子学说表明,测量通常不会揭示被测量财产的预先存在的价值。” (并将有关月亮的问题视为家庭作业!)
看似空虚 procfs 这是有道理的,因为那里的信息是动态的。 情况略有不同 sysfs。 让我们比较一下有多少个至少为 XNUMX 字节大小的文件 /proc/sys.

Linux 中的虚拟文件系统:为什么需要它们以及它们如何工作? 第1部分

Procfs 有一个文件,即导出的内核配置,这是一个例外,因为它只需要在每次启动时生成一次。 另一方面,在 /sys 有许多较大的文件,其中许多占用了整个内存页。 通常文件 sysfs 与通过读取文件获得的信息表不同,仅包含一个数字或行 /proc/meminfo.

目标 sysfs - 提供内核调用的读/写属性 «kobjects» 在用户空间中。 唯一的目标 kobjects 是链接计数:当一个kobject的最后一个链接被删除时,系统将恢复与其关联的资源。 尽管如此, /sys 组成了大部分著名的 “用户空间的稳定 ABI” 核心,在任何情况下都没有人能够做到这一点 “休息”。 这并不意味着 sysfs 中的文件是静态的,这与不稳定对象的引用计数不一致。
内核的稳定 ABI 限制了可以出现的内容 /sys,而不是在那个特定时刻实际存在的内容。 列出 sysfs 中的文件权限可以深入了解设备、模块、文件系统等的可配置设置。 可以配置或读取。 合乎逻辑的结论是,procfs 也是内核稳定 ABI 的一部分,尽管在 文件资料.

Linux 中的虚拟文件系统:为什么需要它们以及它们如何工作? 第1部分

文件位于 sysfs 描述每个实体的一个特定属性,并且可以是可读的、可写的或两者兼而有之。 文件中的“0”表示SSD无法移除。

让我们从如何使用 eBPF 和 bcc 工具监控 VFS 开始翻译的第二部分,现在我们正在等待您的评论,并传统上邀请您 开放网络研讨会,将于9月XNUMX日由我们老师举办—— 弗拉基米尔·德罗兹杰茨基.

来源: habr.com

添加评论