LWN:重新思考fsinfo()

FAT32学习笔记(三)文件的删除,目录的删除,FAT32表的用途,FsInfo的作用 文件的删除 在前面已经说过如何通过BPB里的各项参数去找到Data Area,从而得到文件对应的Directory Entry,最后找到文件的内容;对于目录,也是大同小异,不同之处只是更“曲折”一点,会先找到目录,去目录的“内容”里找到文件的Directory Entry,进一步,才可以找到文件内容。那么,在FAT32里,文件如何删除? 实际上非常简单,FAT32文件系统在删除文件的时候,仅仅 阅读详情

关注了就能看到更多这么棒的文章哦~

Rethinking fsinfo()

By Jonathan Corbet
August 21, 2020
原文来自:https://lwn.net/Articles/829212/
DeepL assisted translation

开发者们提出了 fsinfo()这个系统调用,它可以返回关于已经 mount 的文件系统的扩展信息(extended information),一年多前,我们在 LWN(https://lwn.net/Articles/792628,中文版在这里LWN:Linux讨论新加syscall (clone3, fchmodat4, fsinfo))首次对其进行了介绍。在这一年里,fsinfo()的形式没有太大变化,但关于是否合并的争论仍在继续。对一些人来说,fsinfo()是必需的,可以高效获取文件系统信息;对另一些人来说,它是一个不必要的、过度设计的机制。如果这个功能要进入 mainline kernel 的话,很可能需要进行修改。 

Linux 长期以来一直支持 statfs()系统调用(从用户空间通常见到的是 statvfs())作为获取已挂载文件系统信息的一种方式。不过,就像很常见的设计实现方式一样,statfs()的设计者列出了他们认为人们可能感兴趣的那些文件系统属性,限制这个系统调用只能获取这些属性,没有办法增加新的属性来扩展这个系统调用。不过,在 statfs()定型后的几十年里,文件系统设计者们不肯停止设计新的功能,所以现在有很多有用的信息无法从 statfs()中获得。这些细节包括挂载选项(mount options)、时间戳粒度(timestamp granularity)、相关标签(associated labels)和 UUID,以及文件系统是否支持扩展属性(extended attributes)、访问控制列表(access-control lists)和大小写不敏感查找(case-insensitive lookups)等功能。

恰好,内核现在通过/proc/mounts 虚拟文件提供了很多信息。除了缺失一部分信息之外,/proc/mounts 还有个缺点在于它的访问效率很低。读取该文件的内容需要 kernel 查询每一个已挂载的文件系统的相关信息,如果系统已经挂载很多文件系统的话,这个操作可能会变得开销很大。特别是运行容器化工作的系统中,可能有大量文件系统 mount 上来,某些情况下可能有数千个,所以读取/proc/mounts 确实很痛苦。也给大家普及一下这个知识:要想了解当前内核下新近挂载的文件系统的唯一方法,就是轮询/proc/mounts 并查找是否有新的条目。

David Howells 提出,用新的通知机制来解决轮询问题,但这个机制又依赖于 fsinfo(),fsinfo()的第 21 次修订版于 8 月 3 日发布。Howells 希望能在 5.9 合并窗口期间,将 notifications 和 fsinfo()这两个功能都合入 mainline,可是他并没有如愿。相反,这个请求导致了关于 fsinfo()当前形式是否合理的又一次讨论。

fsinfo()

fsinfo()的 API 设计时保证了全面性、可扩展性。将来应该永远不需要 fsinfo2()来添加新的属性。但这个 API 也很复杂。表面上看,这个接口是这样的:

int fsinfo(int dfd, const char *pathname, const struct fsinfo_params *params,
     size_t params_size, void *result_buffer, size_t result_buf_size);

int fsinfo(int dfd, const char *pathname, const struct fsinfo_params *params, size_t params_size, void *result_buffer, size_t result_buf_size)。其中 params 结构定义如下:

  struct fsinfo_params {
__u64 resolve_flags;  /* RESOLVE_* flags */
__u32 at_flags; /* AT_* flags */
__u32 flags;    /* Flags controlling fsinfo() specifically */
__u32 request;  /* ID of requested attribute */
__u32 Nth;    /* Instance of it (some may have multiple) */
__u32 Mth;    /* Subinstance of Nth instance */
  };

设计了四种不同的方法来使用 dfd、pathname 和 params->at_flags 指定应该查询哪个文件系统。详情请参见这个 patch 的 changelog (https://lwn.net/ml/linux-kernel/159646180259.1784947.223853053048725752.stgit@warthog.procyon.org.uk/ )。params 结构的其余部分描述了实际请求哪些信息;结果最终会在 result_buffer 中获取到。

params->request 支持很多内容,包括:

  • FSINFO_ATTR_STATFS 返回与 statfs()相同的信息。

  • FSINFO_ATTR_LIMITS 返回文件系统的各种限制,包括最大文件大小、inode 号、用户 ID 号、文件的硬链接、文件名长度等。这些都是以 fsinfo_limits 结构返回的。

  • FSINFO_ATTR_TIMESTAMP_INFO 以一组 binary structure 的形式取得这些文件的时间戳信息;这些信息包括时间戳的最大值和粒度,以内核从来没用过的 mantissa-and-exponent format 来表示。

  • FSINFO_ATTR_MOUNT_POINT 生成一个字符串,显示文件系统的挂载位置。

  • FSINFO_ATTR_MOUNT_CHILDREN 给出了一个结构数组,用来标识 mount 在被查询的文件系统下面的文件系统。完整的可能请求列表比上面的更长。每个请求都以不同的格式返回数据,通常是请求信息的特定二进制结构。对于某些属性,查询可能会返回许多元素,在这种情况下,可以使用 fsinfo_params 结构中的 Nth 和 Mth 字段来确定应该返回哪些。这个 patch(https://lwn.net/ml/linux-kernel/159646187933.1784947.10955424144341330111.stgit@warthog.procyon.org.uk/ )包含了一个示例程序,它使用了一些 fsinfo()的特性,生成了一个显示当前系统的挂载拓扑图的列表。

Complaints and alternatives

fsinfo()的这个提案面临几点阻力。首先是是否真的有这个需要。Linus Torvalds 称它是 "engineering for its own sake, rather than responding to actual user concerns",并想知道为什么 Linux 这么多年都不需要这么个 API,而现在需要了。Torvalds 不太喜欢增加那些最终没人使用的系统调用,所以他通常都会需要人们给出增加新接口的理由。没过多久,就有潜在用户明确表达了他们的需求。Steven Whitehouse 这样说:

The overall aim is to solve some issues relating to scaling to large numbers of mount in systemd and autofs, and also to provide a generically useful interface that other tools may use to monitor mounts in due course too. Currently parsing /proc/mounts is the only option, and that tends to be slow and is certainly not atomic. 

译文:总的目标是解决 systemd 和 autofs 中与挂载了大量文件系统有关的一些问题,同时提供一个通用的有价值的接口,其他工具也可以在适当的时候用来监控挂载情况。目前,解析/proc/mounts 是唯一的选择,但这往往很慢,而且肯定不是原子操作。

util-linux 软件包的维护者 Karel Zak 介绍了拥有数千个挂载点的系统的需求。Lennart Poettering 提供了一长串他想了解的文件系统属性,以及为什么它们会有用。所有这些讨论的最终结果表明人们确实需要某种系统调用来提供文件系统的信息。

不过 fsinfo()的复杂性还是让一些开发者感到担心;对他们来说,它看起来就像是又一个试图做许多种工作的多路系统调用(multiplexer system call)。但也没有人提出一个更好的替代设计方案。有一个简短的题外话,Torvalds 建议了一个 API,在这个 API 中,一个文件的属性可以直接被 open 调用,就好像该文件是一个目录一样。因此,open(当然要用一个特殊的 flag)foo/max_file_size 将可以获取到存放 foo 这个普通文件的文件系统所能支持的最大文件 size。这个想法与 2004 年 reiser4 文件系统对 metadata 的争议性做法(https://lwn.net/Articles/100148/ )非常相似,在讨论中指出这一点似乎也并不是一个政治性的决策。

人们指出,实现这种机制有许多实际困难。甚至精确定义它的语义,看起来也很困难。因此,这个想法被搁置了。估计几年之后肯定有人会再次提出来。

这样一来,这个问题(获取文件系统信息的新 API 应该是什么样子的)就没有结论了。Torvalds 称 fsinfo() 是"confusing and over-engineered",并问道。"我们能不能做一个简单的扩展的 statfs()就完事了,而不是做一个非常复杂的东西,用同一个接口做五件不同的事,结果让它变得非常不合群?" 他进一步建议,fsinfo()使用的一些二进制结构可以用 ASCII 数据代替。他指出,一些文件系统接口已经在使用 ASCII 来处理更复杂的属性,并表示希望一个以 ASCII 导出信息的内核接口能让现在从/proc/mounts 中解析这些信息的代码实现时更轻松。

所以这次讨论的最终结果很可能是试图按照这些思路重新设计 fsinfo()。但这里有一个问题:所需要的信息,就像它所代表的系统一样,本质上是很复杂多样的。等到设计出一个类似于 statfs()的 API,并且可以表达所有这些信息,也可以在未来进行扩展的时候,这个设计有可能会开始看起来很像现在的 fsinfo()。用 ASCII 码代替一些二进制结构似乎不太可能对这种情况有显著帮助。整个工作的最终结果可能是与当前设计非常相似的东西。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

FAT32文件系统的数据隐写 其中第0个簇号和第1个簇号为0x0FFFFFF8 0xFFFFFFFF为FAT表起始位置,紧跟着的0x0FFFFFFF一般为根目录的所在簇,由于不足4k(一个簇单元大小),故一个簇就够了,所以第2个簇号中为结束符号。首先,最开始没使用破解版,所以在打开时是没有FAT索引的,并且也无法保存,也就是功能不全,故本次FAT表的寻找均是依靠BPB结构中的特定字段来寻找偏移的,使用最笨的方法,后来使用的是破解版。同时下一个可用簇为0x000001DF,十进制为479,本次实验0x01DF即为我们要写入数据的空间。 阅读详情

相关推荐

深入了解FAT文件系统

FAT文件系统由于其简单性和兼容性,仍然在许多领域广泛应用。了解其内部结构和工作原理有助于更好地管理和维护存储设备,同时在需要时也可以进行数据恢复和故障排除。希望这篇博客能够帮助你更好地理解FAT文件系统的运作机制。

qq_52010229的博客 3689

文件系统 -- 磁盘基础知识和FAT32文件系统详细介绍

主要介绍了磁盘的基本知识和详细介绍了FAT32文件系统

积木的笔记 4944

FAT32 文件系统 · 入门

最近写了个分析FAT32文件系统根目录文件信息的程序,现在小记一下。 一、结构分析 先上结构图如下: 图(1)、FAT文件系统结构图 注: 第一个保留区大小N(单位:扇区):由MBR中 0x1c6~0x1c9(454开始)的四个字节决定。 第二个保留区大小M(单位:扇区):由DBR中 0x0e~0x0f(14开始)的两个字节决定。 每个FAT表大小K(单位:扇...

s9wmu_f的博客 1034

FAT学习笔记(三)--FSInfo

1,FSInfo region一般是紧跟着boot sector,以下是FSInfo的详细信息: Name Offset Size Description FSI_LeadSig 0 4 固定值0x41615252 FSI_Reservedl 4 480

知了112的专栏 3317

S型速度曲线进阶:基于Sin²(x)的PLC平滑运动控制实践(以伺服/步进系统为例)

本文深入探讨了基于Sin²(x)的S型速度曲线在PLC平滑运动控制中的实践应用,特别针对伺服/步进系统。通过对比传统梯形曲线和七段S曲线,详细展示了Sin²(x)曲线在加速度连续性、计算效率和参数自适应性方面的优势,并结合博图平台的具体实现技巧和实战案例,为精密运动控制提供了优化方案。

weixin_28718793的博客 242

「点燃我,温暖你」用Python制作一个动态爱心效果

最近「点燃我,温暖你」这部剧非常火,讲述的是程序员的爱情故事。其中陈飞宇饰演的男主李峋,在剧中用程序做出的爱心跳动效果,非常炫。

Modeler_xiaoyu的博客 1万+

FAT32基础知识

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。

dkmknjk的博客 7737

GPU加速的容器化AI开发:AnolisOS/CentOS8中的NVIDIA驱动与CUDA最佳实践

本文详细介绍了在AnolisOS/CentOS8系统中配置NVIDIA驱动与CUDA的最佳实践,涵盖驱动安装、CUDA工具链配置、容器运行时设置及性能优化等关键步骤。特别针对容器化AI开发场景,提供了GPU透传和资源管理的实用方案,帮助开发者构建高效的GPU加速开发环境。

weixin_27791839的博客 339

数据恢复 Winhex FSINFO扇区数据结构解析

向下跳转6个扇区(2054扇区)这就是备份DBR的位置了,备份DBR的下一个扇区也是一个FSINFO扇区,但是这个FSINFO的值是不相同的,但是它们的结构是一样的,所以这个FSINFO扇区是备份扇区.从图中的信息我们可以获得以下信息:签名标志为rrAa,空闲簇数的大小,和下个可用簇的值,以及在结尾有一个55AA标识,这就是一个FSINOFO扇区的信息。偏移地址是相对于逻辑驱动器的偏移地址并不是物理驱动器的偏移地址。它的ASCII码值为RRaA,它的作用是扩展引导标志“RRaA”扩展引导标志“RRaA”

GOOGXVII的博客 786

从外包到转正:一个华为OD亲历者的真实工作体验与避坑指南

本文分享了一位华为OD员工从外包到转正的真实经历与实用建议。通过详细解析华为OD的日常工作、转正核心指标、机试备考技巧及职场突围策略,为读者提供了一份全面的避坑指南。特别针对机试E卷的高频考点和刷题方法,给出了具体的数据分析和实战经验。

weixin_33686714的博客 692

别再傻傻分不清了!Anaconda和Miniconda到底选哪个?附保姆级安装与镜像源配置(Windows/Mac)

本文详细解析了Anaconda和Miniconda的核心差异,包括体积、预装内容、系统资源占用等关键维度,并提供了针对不同需求的决策框架。附有Windows和Mac双平台的详细安装与配置指南,帮助用户根据实际需求选择最适合的conda工具,提升开发效率。

weixin_30315723的博客 426

【FatFs】FAT32文件系统协议原理讲解(以U盘为例)

了解FAT32文件系统的具体工作原理

bfkjabfkjab的博客 4546

MSVS C# Matlab的混合编程系列2 - 构建一个复杂(含多个M文件)的动态库:

本节我们尝试将一个有很多函数和文件的Matlab算法文件集成到C#的项目里面。

山云的专栏 2068

linux系统下对硬盘自定义分区格式化的分析与实现

前言: 在这个数据爆炸的时代,数据存储也显得尤为的重要。存储形式从原来的U盘,SD卡硬盘发展到现在的网络存储,云存储。存储空间也是从原来的M大小到现在动辄T为单位的大容量存储。因为工作关系有接触数据存储方案,这里就对我们常用的磁盘分区、磁盘格式化做一个介绍。磁盘分区格式化以及硬盘的结构特性这些内容网上已经有一大堆,这里不做常规介绍。本文是想从一个程序员的角度来分析分区格式化,从而可以在不............

Biao 5787

YOLOv11改进 | Mamba-YOLOv11-L:基于SSM的高效全局建模,精度与效率的双重突破

摘要: 本文提出Mamba-YOLOv11-L,通过集成状态空间模型(SSM)改进YOLOv11的全局建模能力。针对YOLOv11在复杂场景中全局依赖缺失、精度-效率矛盾等问题,SSM以$O(N)$计算复杂度实现长程语义捕捉。改进后的模型在工业缺陷检测(Recall↑12%)、边缘设备部署(内存↓16%)、多尺度目标检测(小目标mAP↑9%)等场景表现优异,推理速度保持>40 FPS。核心创新包括轻量化SSM模块设计(稀疏状态转移+局部上下文融合)及与YOLOv11骨干的深度集成,代码实现展示了SSM

走向CTO的路上... 566

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IO问题及原因

1.有些U盘/SD卡只有设备节点没有分区节点而有些U盘/SD卡即有设备节点又有分区节点? 这是MBR导致的,有些U盘/SD卡没有MBR,所以只有设备节点,而有些是有MBR的,所以即有设备节点和分区节点 2.在Windows下删除U盘里的文件后在linux下查看U盘剩余容量时获取上来的值仍然后在Windows下删除文件之前的值? U盘使用的是fat32文件系统,fat32中有个fsin

wangar的专栏 933

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

FAT32

FAT32 DBR及保留扇区 FAT1 FAT2 数据区 DBR及保留扇区:DBR的含义是DOS引导记录,也称为操作系统引导记录,在DBR之后往...

pnzrk的博客 3951

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

FAT文件系统详解

微软FAT文件系统详解bytefilesectorclusterpartitionvolume。

surfaceyan的博客 1962

FAT32笔记

文件系统,fat32

weixin_45283799的博客 1687

Zynq Fatfs文件系统应用笔记

    Zynq Fatfs文件系统应用笔 Hello,panda          笔记介绍基于所描述的Zynq Fatfs基于Xilinx xilffsv3.0和Sdpsv2.4,文件系统采用在Bare-Metal和轻量级操作系统中常用的FatFs,版本为v0.10b。 在开始介绍FatFs文件系统在Zynq实现之前一定要先对FAT32文件系统有一个清晰的了解。 1 FAT32文件...

haoxingheng的专栏 9267

watch_mount(), watch_sb(), and fsinfo() (again)

关注了就能看到更多这么棒的文章哦~watch_mount(), watch_sb(), and fsinfo() (again)ByJonathan CorbetFebruary 24...

Linux News搬运工 404

android usb挂载分析---FAT文件系统原理详细介绍

FAT文件起源于70年代末80年代初,用于微软的MS-DOS操作系统。它开始被设计成一个简单的文件系统用于小于500K的软件盘。后来被功能被大大增强用于支持越来越大的媒质。现在的文件系统有FAT12,FAT16和FAT32三种子类。 FAT12是最早的一版,主要用于软盘,它对簇的编址采用12bit宽度的数,所以称为FAT12。12bit的地址可以寻址4096个簇,事实上在FAT12中只能寻址

new_abc的专栏 5946

微软EFI白皮书 Microsoft Extensible Firmware Initiative FAT32 File System Specification

https://msdn.microsoft.com/zh-cn/windows/hardware/gg463080 微软EFI白皮书 Microsoft Extensible Firmware Initiative FAT32 File System Specification HardwareWhite Paper              Designing Hard

xcntime的专栏 1万+
上一篇: LWN: Linux desktop环境下的资源管理!
下一篇: LWN: realtime的未来计划!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值