详解 Linux 中的虚拟文件系统
procfs 的空文件是有原理的,由于哪里可用的信息是动态的。sysfs 的环境则差异。让我们较量一下 /proc 与 /sys 中不为空的文件数目。 procfs 只有一个不为空的文件,即导出的内核设置,这是一个破例,由于每次启动只必要天生一次。另一方面,/sys 有很多更大一些的文件,个中大大都由一页内存构成。凡是,sysfs 文件只包括一个数字或字符串,与通过读取 /proc/meminfo 等文件天生的信息表格形成光鲜比拟。 sysfs 的目标是将内核称为 “kobject” 的可读写属性果真给用户空间。kobject 的独一目标是引用计数:当删除对 kobject 的最后一个引用时,体系将接纳与之关联的资源。然而,/sys 组成了内核闻名的“到用户空间的不变 ABI”,它的大部门内容在任何环境下都没有人能“粉碎”。但这并不料味着 sysfs 中的文件是静态,这与易失性工具的引用计数相反。 内核的不变 ABI 限定了 /sys 中也许呈现的内容,而不是任何给按时候现实存在的内容。列出 sysfs 中文件的权限可以相识怎样配置或读取装备、模块、文件体系等的可设置、可调参数。逻辑上夸大 procfs 也是内核不变 ABI 的一部门的结论,尽量内核的文档没有明晰声名。 sysfs 中的文件确切地描写了实体的每个属性,而且可所以可读的、可写的,或两者兼而有之。文件中的“0”暗示 SSD 不行移动的存储装备。 用 eBPF 和 bcc 器材一窥 VFS 内部 相识内核怎样打点 sysfs 文件的最简朴要领是调查它的运行环境,在 ARM64 或 x86_64 上寓目标最简朴要领是行使 eBPF。eBPF(扩展的伯克利数据包过滤器 extended Berkeley Packet Filter )由在内核中运行的假造机构成,特权用户可以从呼吁行举办查询。内核源代码汇报读者内核可以做什么;而在一个启动的体系上运行 eBPF 器材会表现内核现实上做了什么。 令人兴奋的是,通过 bcc 器材入门行使 eBPF 很是轻易,这些器材在首要 Linux 刊行版的软件包中都有,而且已经过 Brendan Gregg 给出了充实的文档声名。bcc 器材是带有小段嵌入式 C 说话片断的 Python 剧本,这意味着任何对这两种说话认识的人都可以轻松修改它们。据当前统计,bcc/tools 中有 80 个 Python 剧本,使得体系打点员或开拓职员很有也许可以或许找到与她/他的需求相干的已有剧本。 要相识 VFS 在正在运行中的体系上的事变环境,请实行行使简朴的 vfscount 或 vfsstat 剧本,这可以看到每秒城市产生数十次对 vfs_open() 及其相干的挪用。 vfsstat.py 是一个带有嵌入式 C 片断的 Python 剧本,它只是计数 VFS 函数挪用。 作为一个不太重要的例子,让我们看一下在运行的体系上插入 USB 影象棒时 sysfs 中会产生什么。 用 eBPF 调查插入 USB 影象棒时 /sys 中会产生什么,简朴的和伟大的例子。 在上面的第一个简朴示例中,只要 sysfs_create_files() 呼吁运行,trace.py bcc 器材剧本就会打印出一条动静。我们看到 sysfs_create_files() 由一个 kworker 线程启动,以相应 USB 棒的插入变乱,可是它建设了什么文件?第二个例子声名白 eBPF 的强盛手段。这里,trace.py 正在打印内核回溯(-K 选项)以及 sysfs_create_files() 建设的文件的名称。单引号内的代码段是一些 C 源代码,包罗一个易于识此外名目字符串,所提供的 Python 剧本引入 LLVM 即时编译器(JIT) 来在内核假造机内编译和执行它。必需在第二个呼吁中重现完备的 sysfs_create_files() 函数署名,以便名目字符串可以引用个中一个参数。在此 C 片断中堕落会导致可识此外 C 编译器错误。譬喻,假如省略 -I 参数,则功效为“无法编译 BPF 文本”。认识 C 或 Python 的开拓职员会发明 bcc 器材易于扩展和修改。 插入 USB 影象棒后,内核回溯表现 PID 7711 是一个 kworker 线程,它在 sysfs 中建设了一个名为 events 的文件。行使 sysfs_remove_files() 举办响应的挪用表白,删除 USB 影象棒会导致删除该 events 文件,这与引用计数的设法保持同等。在 USB 棒插入时代(未表现)在 eBPF 中调查 sysfs_create_link() 表白建设了不少于 48 个标记链接。 无论怎样,events 文件的目标是什么?行使 cscope 查找函数 __device_add_disk()表现它挪用 disk_add_events(),而且可以将 “mediachange” 或 “ejectrequest” 写入到该文件。这里,内核的块层关照用户空间该 “磁盘” 的呈现和消散。思量一下这种搜查 USB 棒的插入的事变道理的要领与试图仅从源头中找出该进程的速率有多快。 只读根文件体系使得嵌入式装备成为也许 确实,没有人通过拔出电源插头来封锁处事器或桌面体系。为什么?由于物理存储装备上挂载的文件体系也许有挂起的(未完成的)写入,而且记录其状态的数据布局也许与写入存储器的内容差异步。当产生这种环境时,体系全部者将不得不在下次启动时守候 fsck 文件体系规复器材 运行完成,在最坏的环境下,现实上会丢失数据。 然而,狂热喜爱者会传闻很多物联网和嵌入式装备,如路由器、恒温器和汽车此刻都运行着 Linux。很多这些装备险些完全没有效户界面,而且没有步伐干净地让它们“扫除启动”。想一想启动电池耗尽的汽车,个中运行 Linux 的主机装备 的电源会不绝加电断电。当引擎最终开始运行时,体系如安在没有长时刻 fsck 的环境下启动呢?谜底是嵌入式装备依靠于只读根文件体系(简称 ro-rootfs)。 ro-rootfs 是嵌入式体系不常常必要 fsck 的缘故起因。来历:https://tinyurl.com/yxoauoub (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |