LWN:文件系统格式算是ABI吗?

ext4文件系统文件定位流程 以uboot中的ext4文件系统为例,解析文件系统挂载的原理及文件定位的流程 阅读详情

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

The ABI status of filesystem formats

By Jonathan Corbet
October 8, 2020
DeepL assisted translation
https://lwn.net/Articles/833696/

Linux 内核开发有一个关键原则,那就是内核和用户空间之间的 ABI 不能被破坏。任何改动如果破坏了以前能正常工作的程序的话(除了特殊情况外)都会被 revert 掉,恢复原状。这个规则似乎很明确了,但是在确定到底什么是内核 ABI 的时候,却存在着分期。tracepoints 就是一个经常被拿出来说的例子。最近的一次讨论让另一个有歧义的地方暴露了出来:Linux 文件系统在磁盘上的存放格式。

那些报告了 kernel 功能回退的用户,会根据这个回退问题发生的位置而得到不同程度的同情。对于那些使用了系统调用 API 的、正常的用户空间程序来说,几乎绝对会得到同情,那些破坏了这部分的改动将会需要重新实现。ABI 的概念也延伸到了虚拟文件系统上,比如/proc 和 sysfs 这些由内核 export 出来的文件系统。如果只有一个程序使用了某个接口,而且这个程序也被相应地更新了,那么这种内核改动可能会被允许。此外,没有人会关注那些导致内核树外的模块(out-of-tree kernel modules)不能用了的改动,因为它们用到的接口被认定是内核内部接口,不会保证今后不改变。

但这些并不是 user space 和内核的唯一接口。Josh Triplett 报告的这次回退时间就是个例子。看起来 5.9-rc2 中合入的一个 ext4 文件系统 bug fix,破坏了他需要用到的一些 ext4 文件系统的 mount 功能。

这些文件系统是用一个未发布的内部工具来创建的,主要针对一些特定的内部使用目的。这种文件系统使用场景是完全只读的,所以永远不会有需要(或能力)在其中创建新文件。这个工具为了节省空间,就将所有的 block bitmap 和 inode bitmap 都 overlay 到同一个 block 上,并把所有 bit 都置为 1,表示所有的 block 和 inode 都已经分配完毕。这个工具会用一个特殊的标志(EXT4_FEATURE_RO_COMPAT_SHARED_BLOCKS)来对文件系统打上标记,提示它采取了这种共享 block 的行为。这个 flag 在工具中有定义,但内核并不会使用这个 flag。这个 flag 被放在 read-only 的兼容性标志区域中,这意味内核如果看到文件系统有这个标记的话,就会知道这个文件系统可以安全地进行 mount 操作,但只能是在 read-only 模式下。

在 5.9-rc2 版本之前,mainline 内核都可以正常 mount 这些文件系统。Triplett 指出这个提交(https://git.kernel.org/linus/e7bfb5c9bb3d )产生了变化,在 mount 时的 ext4 verifier 代码中增加了一些检查,以确保文件系统镜像是有效的。这些新的检查会检测到上述的重叠的 bitmap,内核会报错,这些 mount 文件系统的操作相应地都会失败。一些以前能用的东西就不再能用了,这也就是人们所说的发生了回退(regression)。Triplett 在他报告这个问题的邮件中加入了一个小 patch,当 EXT4_FEATURE_RO_COMPAT_SHARED_BLOCKS 标志存在时,该 patch 就会禁用检查,从而使他的文件系统重新可以 mount。

这个改动很可能会被合并,但文件系统开发者并没有因此而放心,相反他们认为这是一个错误的做法。XFS 维护者 Darrick Wong 认为,不应该支持 "非官方(unofficial)" 的文件系统变体。

我不同意。这样会为现有的 ondisk format 创建出一种文档中未记载的变种(尤其是在正常工具中会看到不一致的 metadata),当这种不兼容的变种与正常的规范实现产生冲突时,会给未来的用户和维护者带来很大的麻烦。

Triplett 回应认为,文件系统镜像(filesystem images)应该属于内核 ABI 的范畴。

我一般认为,mount 现有的根文件系统(root filesystem)的行为,属于 kernel<->userspace 或 kernel<-> existing-system boundary (现有系统边界)的范畴,这是由现在内核可以接受、并且用户空间已经成功使用的内容所定义的,升级内核应该可以让现有的用户空间程序和系统都能正常工作。我没听说过还有其他什么特有规则在文件系统这方面。

Ext4 维护者 Ted Ts'o 表示,他并不反对 Triplett 的补丁,但估计后续进一步支持这个工具的 patch 可能不会收到热烈欢迎。随后他讲述了 make_ext4fs 工具的故事,这是一个独立开发的 ext4 文件系统创建工具,Android 有许多年都在使用它。但是它产生了许多的兼容性和文件损坏问题,耗费了几年时间才解决。第三方文件系统工具很容易出现这样的问题,他说:

在我看来,这不仅仅是磁盘上文件系统格式的问题,也是跟官方发布的用户空间工具有关。如果你创建了一个内核可以接受的文件系统镜像,但是并不是用官方的用户空间工具创建的,那么因为文件系统中有许多种状态和变体,所以出现错误结果(mischief)的可能性就很大。

文件系统开发者对 "mischief " 天生相当反感,因此,Ts'o 的观点(希望这些外部工具根本不要存在)也就不足为奇了。他建议,未来的规则至少应该规定,只有由官方指定的工具来创建和管理的镜像,碰到了 filesystem-image regression,才需要解决。他要求 Triplett 想办法能摆脱他的特制工具。

Triplett 不同意这个规则,他说更合理的做法是,任何能通过 e2fsck checker 的文件系统映像都应该得到支持。并非所有使用 ext4 格式的工具都得放在 e2fsprogs 仓库中的。他补充说,如果不这样做,就等于说有 ext4 文件系统驱动的 FreeBSD 内核也应该放在 e2fsprogs 中。按 Triplett 的描述来看,本文中讨论到的这个工具,似乎也是不适合放在 e2fsprogs 仓库中的。

Triplett 在那封邮件的最后重申了他的要求:

我在这里唯一的要求就是 "不要破坏已经能正常工作功能"。除了这个特定需求以外,我也愿意将目标缩小到 "不要破坏 e2fsck 之前认可的东西"。

Ts'o 的回应明确表明他并不愿意实现这个需求。他说,这将导致无法修复那些与无效的(invalid)文件系统映像相关的安全问题,而这种问题有很多。许多这些无效的映像–通常是由模糊工具或攻击者产生的——都可以通过 e2fsck 的检查,直到人们发现并修复这些问题。因此,他说,将任何通过 e2fsck 的镜像都判定为需要支持的话,就是在要求需要永远支持那些无效的文件系统。最后,他对解决 Triplett 问题提出了一些其他的建议,并要求 Triplett 在未来能与 ext4 开发者更紧密地合作。

讨论目前就到此为止了。Ts'o 愿意打上这个 fix patch 来解决眼前的问题,这意味着并不需要马上来解决这些文件系统的回归相关的更大范畴的问题。但是这又意味着这个问题很可能在某个时候再次出现。内核 ABI 是一个庞大而且尚未明确定义的东西,很多边界,哪怕用最乐观的词汇来说也都是模糊的(fuzzy)。文件系统这里的边界则是又一个尚未被充分探索的领域。很可能有人后续在不经意间会再次碰到错误。

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

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

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

从分立到集成:深入解析Buck电路的核心模块与设计权衡 本文深入解析Buck电路的核心模块与设计权衡,从分立到集成方案的优缺点对比。详细探讨Buck电路的高效能量转换、小型化设计及灵活电压调节能力,并结合实际案例分享分立方案中的PWM生成、反馈环路设计及保护电路优化经验,为工程师提供实用设计参考。 阅读详情

相关推荐

node-red 可视化探索

配置socket选择配置流程产生url。

weixin_44133581的博客 3412

ext4文件系统中super_block、ext4_super_block、ext4_sb_info

超级块代表了整个文件系统,超级块是文件系统的控制块,有整个文件系统信息,一个文件系统所有的inode都要连接到超级块上,可以说,一个超级块就代表了一个文件系统。 各种文件系统都必须实现超级快对象,该对象用于存储特定文件系统的信息,通常对应于存放在磁盘特定扇区中的文件系统超级块或文件系统控制块。对于ext4文件系统,它的超级块信息与结构体super_block、ext4_super_block、e...

SweeNeil 3015

简易电梯控制系统设计(两层楼)(

(电子科技大学 数字系统实验二 结课验收项目 ) 题目要求:

m0_48801027的博客 1万+

Ext4 超级块详解

转载:http://blog.youkuaiyun.com/sunlei0625/article/details/79011946先上图:The Super Block The superblock records various information about the enclosing filesystem, such as block counts, inode counts, supported ...

小郑的博客 8276

Docker 安装 CentOS7

本文主要介绍了docker 下安装centos7。访问 CentOS 镜像库地址:https://hub.docker.com/_/centos?tab=tags&page=1。可以通过 Sort by 查看其他版本的 CentOS 。默认是最新版本 centos:latest 。 使用以下命令来查看是否已安装了 centos7: 启动centos容器,并把docker上centos的22端口映射到本机60001端口(端口号可以自己指定) 3、进入到Centos容器 4.安装ssh服务和网络必须软件

折腾java的博客 1万+

基于TI MSPM0的PS2双轴按键摇杆模块ADC+GPIO驱动移植实战

本文详细介绍了在TI MSPM0微控制器上驱动PS2双轴按键摇杆模块的完整实战流程。通过SysConfig图形化工具配置ADC与GPIO引脚,并编写了包含ADC采样、按键检测及数据处理的驱动代码,实现了对摇杆X/Y轴模拟量及按键数字量的稳定读取,为嵌入式控制项目提供了可直接移植的解决方案。

weixin_42465140的博客 83

Linux应用程序——用户层操作GPIO

stm32mp157 盘古开发板 Linux内核版本4.19 目录 1、拜兔核i2SOM的wiki上关于gpio应用的说明 2、gpio操作相关的数据结构 3、测试代码: 4、参考链接 1、拜兔核i2SOM的wiki上关于gpio应用的说明 链接:http://wiki.i2som.com/pages/viewpage.action?pageId=22479311 以下是链接中的复制内容: GPIO操作在Linux系统上是常用功能,STM32MP1芯片平台也同样支持。从Linu...

fang_yang_wa的博客 4560

SQL 通过sum() over(order by ,rownum)实现财务现金日记账实例

SELECT 类型,to_char(发生日期,'yyyy-MM-dd') 发生日期,期初余额,借方金额,贷方金额, (CASE WHEN 借方金额>0 THEN '借' WHEN 贷方金额>0 THEN '贷' ELSE '平' END) 方向, sum(收支金额) over(order by 发生日期, rownum) 余额 FROM( SELECT LX 类型,账户,账号,摘要,发生日期,单据ID, ...

qq_41451794的博客 1021

一点点读懂regulator(一)

目录 1、关于 2、命名法 2.1 Regulator 2.2 PMIC 2.3 Consumer 2.4 Power Domain 2.5 Constraints 3、Design 3.1 Consumer driver interface 3.2 Regulator driver interface 3.3 Machine interface 3.4 Userspace ABI 1、关于 此框架旨在提供一个标准内核接口来控制电压和电流调节器。 其目的是允许系统动态控制调

小小小小的专栏 7191

Python pydub实现语音停顿切分

将pcm文件批量处理成wav文件 import wave import os filepath = "data/" # 添加路径 filename = os.listdir(filepath) # 得到文件夹下的所有文件名称 #f = wave.open(filepath + filename[1], 'rb') #print(filename) for i in range(len(fi...

wangqianqianya的博客 1万+

Windows 2000系统下载与全套镜像安装:从镜像校验到驱动兼容性实战指南

操作系统镜像文件是安装系统的核心载体,其完整性直接影响部署成败。哈希校验作为验证文件一致性的基础手段,能有效避免因镜像损坏导致的安装中断。对于已停止支持的操作系统,如Windows 2000,其镜像获取与安装更具挑战性,但它在工业控制、专用终端及怀旧技术研究中仍有不可替代的价值。通过理解镜像命名规则、服务包等级(如SP4)及引导方式,结合虚拟机或老硬件平台,可以顺利完成部署。同时,驱动兼容性是老系统运行的关键瓶颈,需针对性解决网卡、显卡等外设驱动问题。本文从镜像下载、校验到安装配置,系统梳理了Windows

weixin_32050773的博客 341

ABI EABI

http://blog.youkuaiyun.com/commshare/article/details/6621227   http://bbs.chinaunix.net/thread-1950213-1-1.html 这个是友善之臂的linux内核移植里头提到的那篇文章,我以前也转载过,不过好像没找到这么全的出处。 ABI和API是不一样的,ABI是强调的是B,也就是二进制级别的兼容

adaptiver的专栏 11万+

基于YOLOv26的卫星遥感环境监测系统

本文介绍了一个基于YOLOv26的卫星遥感环境监测系统。该系统采用分层架构设计,包含数据采集、预处理、目标检测、图像分析、变化检测等核心模块。技术栈包括YOLOv26、PyTorch、OpenCV等深度学习框架和图像处理工具,以及GDAL、rasterio等地理信息处理库。系统支持获取多种卫星数据源(如Sentinel、Landsat、MODIS)的遥感图像,并进行时间序列分析。通过代码示例展示了数据采集模块的实现,包括卫星图像获取和模拟生成功能。该系统可应用于环境要素检测、变化监测等场景,为环境监测提供智

一键难忘的博客 934

LWN:ELF hash table的ABI!

关注了就能看到更多这么棒的文章哦~The ABI status of ELF hash tablesBy Jonathan CorbetAugust 19, 2022DeepL assisted translationhttps://lwn.net/Articles/904892/确实有一些项目比其他项目会更关注 ABI 的兼容性;GNU C Library(glibc)这个项目在投入了大量精力来...

Linux News搬运工 480

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LWN:pidfdfs 带来的另一个意外!

关注了就能看到更多这么棒的文章哦~One more pidfdfs surpriseBy Jonathan CorbetMay 31, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/976125/“pidfdfs” 虚拟文件系统 (virtual filesystem) 在 6.9 内核版本中被添加,其目的是为了向用户空间 (us...

Linux News搬运工 714

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LWN:Rust 的近期重要改动!

关注了就能看到更多这么棒的文章哦~Some recent and notable changes to RustDecember 11, 2023This article was contributed by Daroc AldenGemini translationhttps://lwn.net/Articles/954033/Rust 项目每六周进行一次增量发布,这个做法很容易让人忽略该语言即...

Linux News搬运工 1086

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LWN:不再export kallsyms_lookup_name()!

关注了就能看到更多这么棒的文章哦~Unexporting kallsyms_lookup_name()ByJonathan CorbetFebruar...

Linux News搬运工 4687

LWN:kernel API 规范和验证

API 还有其他方面,例如 `/proc` 或 `/sys` 中的文件,由 perf-events 子系统 (perf-events subsystem) 或 io_uring 创建的内存映射区域,以及任何给定类型文件描述符可用的操作集。然而,总得有个开始。未来的计划包括与静态分析 (static analysis) 集成以验证 API 规范,与模糊测试工具 (fuzzing tools) 集成以进行更智能的测试,以及可在生产内核中启用的低开销运行时验证 (run-time validation)。

Linux News搬运工 2374

LWN:快速、低开销的堆栈跟踪工具SFrame!

关注了就能看到更多这么棒的文章哦~SFrame: fast, low-overhead stack tracesBy Jake EdgeAugust 8, 2023OSSNAChatGPT assisted translationhttps://lwn.net/Articles/940686/获取运行中程序的 stack trace 在很多场景下都非常有用:跟踪(tracing)、性能分析(pro...

Linux News搬运工 1071

LWN:有助于内核加固的GCC功能!

关注了就能看到更多这么棒的文章哦~GCC features to help harden the kernelBy Jonathan CorbetOctober 5, 2023CauldronChatGPT translationhttps://lwn.net/Articles/946041/加固Linux内核是一项无休止的任务,需要在多个方面努力推动。有时,并不需要在内核本身里进行修改,而是通过...

Linux News搬运工 782

LWN:对print()输出消息生成索引列表!

关注了就能看到更多这么棒的文章哦~printk() indexingBy Jonathan CorbetMay 27, 2021DeepL assisted translationhttp...

Linux News搬运工 250

ftrace介绍

Kernel trace 工具的发展历史   Linux 跟踪工具在内核的发展就像是肥皂剧一样,剧情婉转,主题反复,并且相互竞争。本章试图总结当前Linux 众多跟踪工具的现状和历史原因,并最终引出 ftrace 工具。   编者对于以下内容并非亲历者(主要来自 LWN 和 maillist),如有歪曲请拍砖。以下部分虽属八卦,但是,学习一些模块的设计方案和历史进程是我们学习方法论的一部分,从这些纠结的方案和博弈中可以看到很多权衡和利弊,帮助更好的获得其中的思想。 Why Trace the kernel

weixin_39247141的博客 1954

C语言为何仍是操作系统内核开发的首选?内存管理与硬件交互的绝对优势

在计算机系统编程领域,内存管理和硬件交互是两大核心基础概念。内存管理涉及程序如何分配、使用和释放内存资源,直接关系到程序的性能和稳定性;硬件交互则决定了软件能否直接、高效地控制底层硬件设备。这些底层技术原理构成了操作系统、驱动程序和嵌入式系统等关键基础设施的基石,其技术价值在于实现对计算资源的极致控制和高效利用。在操作系统内核、嵌入式固件、高性能中间件等对性能、资源消耗和确定性要求极高的应用场景中,开发者需要一种能够提供直接内存访问、最小运行时开销和高效硬件抽象的语言。C语言凭借其指针操作、内存布局控制和贴

android_mylove的专栏 442

EXT4 超级块介绍

The Super Block The superblock records various information about the enclosing filesystem, such as block counts, inode counts, supported features, maintenance information, and more. If the sparse_supe

星空探索 2010

EXT4文件系统之间接块的ext4_get_block()

static int ext4_alloc_branch(handle_t *handle, struct inode *inode, ext4_lblk_t iblock, int indirect_blks, int *blks, ext4_fsblk_t goal, ext4_lblk_t *offsets, Indirect *branch)

lieye_leaves的专栏 1229

ext4之super.c

super.c是ext4里非常重要的文件,挂载时候运行的代码基本上都在super.c里边,如果super.c有一点代码上的bug的话,那么一个块设备就不能被以ext4文件系统挂载。我在比较重要的地方都加了注释讲解,如果有认为我没写详细或者写错的朋友们欢迎指出。 /*  *  linux/fs/ext4/super.c  *  * Copyright (C) 1992, 1993, 1994

love coding 5319
上一篇: LWN:把NAPI轮询改为使用kernel threads!
下一篇: LWN:进一步分析PyPI上的软件恶意命名攻击!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值