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

大家好! 我们将继续在您已经喜欢的课程中启动新主题,并很高兴地通知您,我们将在4月底开始的Linux Administrator课程中开始新的课程。 新出版物的发布时间将与此事件相吻合。 原始材料可以在这里找到

虚拟文件系统充当某种神奇的抽象,使Linux哲学可以说“一切都是文件”。



什么是文件系统? 根据第一批Linux贡献者和作者Robert Love的话说:“文件系统是一个分层的数据仓库,按照特定的结构组装而成。” 不管怎样,该定义同样适用于VFAT(虚拟文件分配表),Git和CassandraNoSQL数据库 )。 那么,什么定义了像“文件系统”这样的概念呢?

文件系统基础

Linux内核对可被视为文件系统的实体有特定要求。 它应该为具有名称的持久对象实现open()read()write()方法。 从面向对象编程的角度来看,内核将通用文件系统(generic filesystem)定义为抽象接口,这三个大功能被认为是“虚拟”的,没有特定的定义。 因此,文件系统的默认实现称为虚拟文件系统(VFS)。



如果我们可以打开,读取和写入实体,则可以从上面控制台的示例中看到该实体被视为文件。
VFS现象仅强调了类Unix系统的观察特性,该特性指出“一切都是文件”。 考虑一下上面带有/ dev / console的小示例显示控制台实际上是如何工作的,这是多么奇怪。 图为交互式Bash会话。 将字符串发送到控制台(虚拟控制台设备)会在虚拟屏幕上显示该字符串。 VFS具有其他甚至更陌生的属性。 例如,可以搜索它们

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

属于基本VFS类型的函数定义可内核源文件的fs / * .C文件中找到,而fs/子目录包含特定的文件系统。 内核还包含诸如cgroups/devtmpfs类的实体,它们在引导过程中是必需的,因此在init/ kernel子目录中定义。 请注意, cgroups/devtmpfs不会调用file_operations三大函数,而是直接读取和写入内存。
下图显示了用户空间如何访问通常安装在Linux系统上的各种文件系统。 未显示诸如dmesgdmesgPOSIX clocks之类的结构,它们也实现了file_operations结构,访问该结构通过VFS层。



VFS是系统调用和某些file_operations (例如ext4procfs实现之间的“外壳层”。 file_operations函数可以与设备驱动程序或内存访问设备进行交互。 tmpfsdevtmpfscgroups不使用file_operations ,而是直接访问内存。
VFS的存在提供了重用代码的能力,因为与文件系统相关的基本方法不需要由每种类型的文件系统重新实现。 重用代码是软件工程师广泛接受的做法! 但是,如果可重用代码包含严重错误 ,则继承通用方法的所有实现都将遭受它们的困扰。

/ tmp:简单提示

检测系统上是否存在VFS的一种简单方法是进入mount | grep -v sd | grep -v :/ mount | grep -v sd | grep -v :/ mount | grep -v sd | grep -v :/ ,它将显示所有未驻留在磁盘上而不是NFS的已挂载文件系统,这在大多数计算机上都是如此。 上面列出的VFS挂载之一无疑是/tmp ,对吗?



每个人都知道在物理介质上存储/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/sysuserspace可以使用sysctl命令配置的选项的地方。 单个进程的状态和统计信息显示在/proc/目录中。



/proc/meminfo是一个空文件,其中仍然包含有价值的信息。

/proc文件的行为说明了VFS磁盘文件系统的异同程度。 一方面, /proc/meminfo包含可以使用free命令查看的信息。 另一方面,那里是空的! 怎么了 这种情况类似于著名的文章“没有人看着月球时是否存在?” 康奈尔大学物理学教授David Mermin在1985年撰写的《现实与量子理论》 。 事实是,当对/proc发出请求时,内核会收集内存统计信息,并且实际上,当没有人在/proc文件中查找时, /proc文件中没有任何内容。 正如Mermin所说:“基本的量子学说规定,测量通常不会揭示所测量属性的既有价值。” (把月亮当作作业!)
procfs看起来空虚是有道理的,因为那里的信息是动态的。 sysfs情况略有不同。 让我们比较一下/proc/sys有多少个至少一个字节的文件。



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

sysfs的目的是提供内核在用户空间中称为«kobjects»属性。 kobjects的唯一用途是对链接计数:删除到kobject的最后一个链接时,系统将还原与其关联的资源。 但是, /sys构成了著名的“用于用户空间的稳定ABI”内核的大部分,在任何情况下都不会破坏它 。 这并不意味着sysfs中的文件是静态的,这将与对不稳定对象的链接计数产生矛盾。
内核的稳定内核应用程序接口(内核的稳定ABI)限制了/sys可能出现的内容,而不是此特定时刻实际存在的内容。 列出sysfs中的文件权限可以帮助您了解设备,模块,文件系统等的可配置设置。 可以自定义或阅读。 我们得出的结论是,procfs也是稳定的ABI内核的一部分,尽管在文档中没有明确说明。



sysfs中的文件描述了每个实体的一个特定属性,并且可以是可读,可重写或同时具有两者。 文件中的“ 0”表示无法删除SSD。

我们从翻译的第二部分开始,介绍如何使用eBPF和bcc工具观察VFS,现在我们等待您的评论,并按照惯例邀请您参加公开网络研讨会 ,该研讨会将于4月9日由我们的老师Vladimir Drozdetsky举行。

第二部分。

Source: https://habr.com/ru/post/zh-CN446614/


All Articles