从 lsof 开始,深入理解 Linux 虚拟文件系统

Linux VFS 是一个内核抽象层。
统一的文件操作界面。
不同文件系统之间的差异被掩盖。
用户空间程序是通过libc调用的。
open() 和 read() 等请求被定向到特定的文件系统。
添加新的文件系统不需要更改顶层应用程序。

VFS的主要对象: 超级块:示例文件系统。
存储元数据:块大小、文件系统类型。
内存中生成:汇编时生成。
磁盘上的等效项:控制块。

索引节点: 唯一标识该文件。
保存权限和大小等属性。
加载到内存中:文件访问时。
保存到磁盘:在文件控制块中。

文件对象: 记录进程交互状态。
读取和写入位置等信息。
存在于内存中:当文件打开时。

进入目录: 缓存目录结构。
加快寻路速度。
道路故障:多个牙科设施。

目录树和挂载: 根文件系统:挂载/dev/vda1 其他文件系统:使用mount命令挂载。
挂载子节点:/data/file 由/dev/sdb1 处理。

软链接和硬链接的区别: 硬链接:指向同一个Inode。
i_nlink 的数量增加了。
删除文件:必须释放所有引用。

软链接:独立文件。
保存目标路径。
删除原文件:软链接失效。

删除文件并释放空间: 运行 rm: unlink() 会删除目录条目。
i_nlink 的数量已减少。
没有打开文件:立即释放Inode和空间。
打开文件:进程关闭后释放空间。
lsof 显示:进程对已删除文件的引用。

WriteBack缓存策略: 优化性能:数据先写入内存。
稍后冲洗该组。
删除文件:可能会导致空间释放延迟。

目前应用场景: df表示full:du统计空间不足。
该过程引用:已删除的文件。
解决办法:重新启动lsof定位进程。
手动关闭:echo > /proc/PID/fd/N。

lsof 基于 VFS 文件对象。
跟踪打开的文件。
诊断可用空间问题。

虚拟文件系统(Virtual File System,VFS)

哎呀,我们需要谈谈这个虚拟文件系统(VFS)。
这个东西,在Linux内核中,简直就是一个宝藏。
我在问答论坛呆了这么多年,看到了很多问题。
这个VFS需要从几个方面来解决。

我们先来说一下VFS的主要功能和特点。
这个VFS为用户提供了统一的接口。
无论使用哪种文件系统,例如ext4 、NTFS等,用户都会有同样的感觉。
就像你去超市购物一样,无论你买什么,付款方式都是一样的。
VFS还定义了通用文件模板,就像通用模板一样。
无论是文件还是目录,都可以使用这个模板来描述。
就像你点菜的时候,无论点什么,菜单里都有相应的说明。

我们先来说一下VFS的工作原理。
当用户发起文件操作,例如读或写文件时,内核必须首先处理该请求。
这就是 VFS 发挥作用的时候。
它首先处理一些常见的操作,然后通过映射函数将这些操作转换为相应的文件系统操作。
就像在手机上发送短信一样,它必须先通过移动网络,然后传输到对话者的手机上。

VFS有几个主要对象,我们来说一下。
第一个是超级块对象,它就像一个文件系统身份证,上面有文件系统的基本信息。
第二个是索引节点对象,它记录各种文件属性,如文件大小、权限等。
第三个是目录项对象,它指向一个目录或文件。
最后一个是文件对象,代表进程打开的文件。

VFS在Linux内核中发挥着巨大的作用。
它就像一个翻译器,可以让内核理解各种文件系统的操作。
这样Linux内核就可以支持多种文件系统了。
此外,添加新文件系统也变得更加容易。

最后,我们需要看看图标。
图1 展示了VFS与文件系统的关系,图2 展示了VFS在内核中的作用,图3 展示了VFS对象的关联。
总的来说,VFS是Linux内核的关键组件,它使得Linux内核支持多种文件系统,提高了系统的可扩展性和灵活性。
说实话,当时我不明白为什么,但现在我觉得还蛮酷的。

Linux系统中的/proc文件系统有什么用?

Linux 内核中有一个东西叫做 /proc。
这是一个文件系统,但与硬盘无关。
这只是在记忆中。
为什么叫/proc? 因为它与进程相关,所以内核用它来与进程对话。
这件事还蛮有趣的。
您可以在计算机运行时检查内核的运行情况并更改设置。

我在2 02 2 年的一个城市尝试过,我检查了/proc/mounts,发现/proc已经挂载了。
它没有任何设备,只是内核。
一些状态信息存储在内存中。
如果用ls -l 查看,很多文件都是0字节,但是查看的时候还是能看到东西。
为什么? 因为/proc注册到了虚拟文件系统层,VFS。
VFS 调用它,它根据内核信息创建文件和目录。

如果系统没有加载/proc,可以使用命令mount -t proc proc /proc来加载。
我试过了,没问题。

/proc 中的文件能告诉你什么? 例如/proc/cpuinfo,CPU信息。
我试了一下,在双CPU的机器上,看到了型号、家族、缓存等,还有/proc/meminfo、物理内存和交换空间信息。
/proc/mounts,挂载的文件系统。
/proc/devices,可用设备。
/proc/filesystems,支持的文件系统。
/proc/modules,加载的模块。
/proc/version,内核版本。
/proc/cmdline,启动时的命令行参数。
这只是冰山一角。

/proc 还可以告诉你进程发生了什么事情。
每个进程都有一个PID,/proc中有一个以PID命名的目录。
里面有很多文件,告诉你进程状态、环境等等。
我发现有一个正在运行的mozilla进程,PID是3 2 5 5 8 ,/proc中有一个3 2 5 5 8 目录。
如果你看看里面的文件,你就能明白这个进程在做什么。

有些/proc文件是经过编码的,需要用工具查看。
比如top、ps、apm等。
它们可以将编码信息翻译成人类可以理解的形式。

总之,/proc是一个非常有用的东西。
您可以使用它来查看系统和内核信息以及进程信息。
2 02 2 年我尝试了一下,还蛮方便的。