在Linux中解释虚拟文件系统

发布者:上海IT外包来源:http://www.lanmon.net点击数:1635

什么是文件系统?早期的Linux撰稿人和作者罗伯特·洛夫(Robert Love)表示,“文件系统是一个遵循特定结构的分层数据存储。”但是,该描述也适用于VFAT(虚拟文件分配表虚拟)。文件分配表),Git和Cassandra(NoSQL数据库)。那么如何区分文件系统呢?
文件系统基本概念
Linux内核要求文件系统是实体。它还必须在持久对象上实现open(),read()和write()方法,并且这些实体需要具有与之关联的名称。从面向对象编程的角度来看,内核将通用文件系统视为抽象接口。这三个函数是“虚拟”的,没有默认定义。因此,内核的默认文件系统实现称为虚拟文件系统(VFS)。
在Linux中解释虚拟文件系统
如果我们可以打开(),读取()和写入(),它就是一个文件,如此控制台会话中所示。
VFS是众所周知的类Unix系统中“一切都是文件”概念的基础。让我们看看它有多奇怪。上面的小演示显示了角色设备/dev/console的实际工作。该图显示了虚拟电传打字机控制台(tty)上的交互式Bash会话。将字符串发送到虚拟控制台设备会使其显示在虚拟屏幕上。 VFS具有更奇怪的属性。例如,它可以在其中解决。
我们熟悉的文件系统,如ext4,NFS和/proc,提供了一个名为file_operations的C语言数据结构中三个主要函数的定义。此外,各个文件系统以熟悉的面向对象的方式扩展和覆盖VFS功能。正如Robert Love指出的那样,VFS的抽象允许Linux用户轻松地从外部操作系统或抽象实体(例如管道)复制(或复制)文件,而不必担心其内部数据格式。在用户空间方面,通过系统调用,进程可以使用read()之一的文件系统方法从文件复制到内核的数据结构,然后使用另一个文件系统的方法write()来输出数据。作为VFS基类型一部分的函数定义可以在内核源代码的fs/* .c文件中找到,而fs /的子目录包含特定的文件系统。内核还包含类似文件系统的实体,例如cgroup,/dev和tmpfs,它们在引导过程的早期需要,因此在内核的init /子目录中定义。请注意,cgroup,/dev和tmpfs不会调用file_operations的三个主要功能,而是直接读取和写入内存。
下图概述了用户空间如何访问通常在Linux系统上安装的各种类型的文件系统。管道,dmesg和POSIX时钟等结构未在此图中显示。它们还实现了struct file_operations,它们的访问权也通过VFS层。
在Linux中解释虚拟文件系统
用户空间如何访问各种类型的文件系统
VFS是系统调用和特定file_operations实现之间的“夹层”,例如ext4和procfs。然后,file_operations函数可以与特定于设备的驱动程序或内存访问器进行通信。 Tmpfs,devtmpfs和cgroup不使用file_operations,而是直接访问内存。
VFS的存在有助于代码重用,因为与文件系统相关的基本方法不需要由每种文件系统类型重新实现。代码重用是一种被广泛接受的软件工程最佳实践!好吧,但是如果重用的代码引入了严重的错误,那么继承常用方法的所有实现都会受到影响。
/tmp:小提示
找出系统中存在哪个VFS的简单方法是键入mount | grep -v sd | grep -v: /,在大多数计算机上,它将列出磁盘上没有驻留的所有内容,而不是NFS。文件系统。其中一个列出的VFS挂载肯定是/tmp,对吧?
每个人都知道将/tmp放在物理存储设备上是疯了!图片:https://tinyurl.com/ybomxyfo
为什么不希望将/tmp留在存储设备上?因为/tmp中的文件是临时的(!)而存储设备比内存慢,所以会创建一个文件系统,如tmpfs。此外,物理设备比内存更容易磨损。最后,/tmp中的文件可能包含敏感信息,因此每次重新启动时都会使它们消失。不幸的是,默认情况下,某些Linux发行版安装脚本仍会在存储设备上创建/tmp。如果您的系统发生这种情况,请不要绝望。只需遵循优秀的Arch Wiki上的简单说明,并记住分配给tmpfs的内存不能用于其他目的。换句话说,包含大文件的大型tmpfs会导致系统内存不足并崩溃。
另一个提示:编辑/etc/fstab文件时,请务必以换行符结束,否则系统将无法启动。 (猜猜我怎么知道。)
/proc和/sys
除了/tmp之外,大多数Linux用户最熟悉的VFS是/proc和/sys。 (/dev依赖于共享内存而没有file_operations结构)。为什么有两个?我们来看看更多细节。
Procfs提供了内核的瞬态状态及其控制用户空间的进程的快照。在/proc中,内核发布有关它提供的工具的信息,例如中断,虚拟内存和调度程序。此外,/proc/sys是存储可以使用sysctl命令配置的设置的位置,该命令可供用户空间访问。单个进程的状态和统计信息在/proc /目录中报告。
在Linux中解释虚拟文件系统
/proc/meminfo是一个空文件,但仍包含有价值的信息。
/proc文件的行为表明VFS可能与磁盘上的文件系统不同。一方面,/proc/meminfo包含可由命令free显示的信息。另一方面,它仍然是空的!这怎么样?这种情况让人想起康奈尔大学物理学家N. David Mermin在1985年写的一本名为《没有人看见月亮的情况吗?现实和量子理论》的书。事实是内核在进程从/proc请求数据时收集有关内存的统计信息,当没有人查看它时,/proc中的文件几乎没有。正如梅明所说,“这是一个基本的量子理论。一般来说,测量不会揭示被测属性的预先存在的价值。“(关于月球的问题的答案留作练习。)
当没有进程访问它们时,/proc中的文件为空。 (资源)
procfs的空文件是有意义的,因为那里的可用信息是动态的。 sysfs的情况有所不同。让我们比较/proc和/sys中非空的文件数。在Linux中解释虚拟文件系统
Procfs只有一个非空文件,即导出的内核配置,这是一个例外,因为每个启动只需要生成一次。另一方面,/sys有许多较大的文件,其中大部分由一页内存组成。通常,sysfs文件只包含一个数字或字符串,与通过读取/proc/meminfo等文件生成的信息表形成鲜明对比。
sysfs的目的是将名为“kobject”的内核的读写属性公开给用户空间。 kobject的唯一目的是引用计数:当删除对kobject的最后一个引用时,系统将回收与之关联的资源。但是,/sys构成了内核众所周知的“稳定的用户空间ABI”,并且其大部分内容在任何情况下都不能被“破坏”。但这并不意味着sysfs中的文件是静态的,这与volatile对象的引用计数相反。
内核ABI的稳定性限制了/sys中可能出现的内容,而不是在任何给定时刻实际存在的内容。列出sysfs中文件的权限,以了解如何设置或读取设备,模块,文件系统等的可配置,可调参数。从逻辑上强调,procfs也是内核ABI稳定性的结论,尽管内核的文档没有明确说明它。
在Linux中解释虚拟文件系统
sysfs中的文件确切地描述了实体的每个属性,并且可以是可读的,可写的或两者兼而有之。文件中的“0”表示SSD不是可移动存储设备。
使用eBPF和密件抄送工具了解VFS内部情况
了解内核如何管理sysfs文件的最简单方法是查看它是如何工作的。在ARM64或x86_64上观看的最简单方法是使用eBPF。 eBPF(扩展伯克利数据包过滤器
扩展的伯克利包过滤器
它由在内核中运行的虚拟机组成,特权用户可以从命令行进行查询。内核源代码告诉读者内核可以做什么;在启动的系统上运行eBPF工具会显示内核实际执行的操作。
好消息是,使用eBPF开始使用bcc工具很容易,eBPF可以在主要的Linux发行版中使用,并且已经由Brendan Gregg完整记录。 bcc工具是一个Python脚本,带有一小块嵌入式C语言片段,这意味着熟悉这两种语言的人都可以轻松修改它们。根据目前的统计数据,bcc/tools中有80个Python脚本,使系统管理员或开发人员能够找到与她/他的需求相关的现有脚本。要了解VFS如何在正在运行的系统上运行,请尝试使用简单的vfscount或vfsstat脚本,该脚本显示每秒都会发生数十次对vfs_open()及其关联调用的调用。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部