LWN:Rust实现文件系统!

基于Rust编写的一个简单的文件系统,单用户多级目录,用FAT表进行实现 Windows 10 x64 21H1系统。程序运行时会将整个虚拟磁盘的内容全部读取到内存中进行修改,在内存中建立一个字节数组模拟硬盘的状态,仅当程序的开始和结束时加载和保存虚拟磁盘的状态,再将其写入到真实的外存中。因此,需要一个拥有足够内存的计算机,使其能够完全加载预设大小(1MB)的虚拟磁盘。但程序设计过程中没有使用到任何有关于操作系统的特性,因此在其他支持Rust语言的编译和运行的操作系统上理应也能正常运行。 # 使用说明 本程序使用命令行交互界面。目前可以输入以下命令: - `cd <dirname>`: 更改当前目录。 - `mkdir <dir name>`: 新建目录。 - `ls` : 列出当前目录下所有文件和目录。 - `cat <filename>`: 显示文件内容。 - `rm <filename>`: 删除文件。 - `diskinfo` : 显示磁盘统计信息。 - `save` : 保存当前虚拟磁盘到文件 'file-sys.vd'。 - `exit` : 退出系统。 立即下载

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

Rust for filesystems

By Jake Edge
June 21, 2024
LSFMM+BPF
Gemini-1.5-flash translation
https://lwn.net/Articles/978738/

在 2024 年的 Linux 存储、文件系统、内存管理和 BPF 峰会 (Linux Storage, Filesystem, Memory Management, and BPF Summit) 上,Wedson Almeida Filho 和 Kent Overstreet 联合主持了一个关于使用 Rust 开发 Linux 文件系统的存储和文件系统主题的会议。早在 2023 年 12 月,Almeida 就 发布了一个 RFC 补丁集 (RFC patch set),其中包含一些用于文件系统的 Rust 抽象,这引出了 关于这种方法的一些争议。在会议举行的 5 月中旬,他又 发布了 第二版的 RFC 补丁,他希望与其他与 Rust 相关的主题一起讨论。

目标

在向与会者介绍了他的补丁的状态后,Almeida 列出了一些 Rust-for-Linux 项目 (Rust-for-Linux project) 的目标,这些目标体现在他提出的文件系统抽象中。第一个目标是使用 Rust 的类型系统表达更多需求,以便在编译时捕获更多错误。此外,该项目的开发人员希望自动化一些任务,例如清理资源,这些任务在 C 代码中不容易实现。总的来说,他们的目标是拥有更有效率的文件系统开发体验,减少调试编译器可以发现的问题的时间,以及整体上减少与内存相关的漏洞。

8171cf76e1e99d061cb7e8754c1ecdac.png

Overstreet 说他参加过太多为期两周的 bug 查找活动,一直在寻找方法来避免 bcachefs 中出现此类问题。Rust 语言提供了比他在 C 中所能做的更多东西;它消除了未定义的行为,并提供了一些功能来查看代码内部发生了什么情况。“如果你看不见正在发生的事情,你就无法调试。”他相信由于使用了 Rust,内核开发“在未来几十年内将变得容易得多”。将能够证明用 Rust 编写的代码的正确性,这意味着可能破坏功能开发的 bug 将会大大减少。

Almeida 从他的 幻灯片 中展示了一个 Rust 类型系统如何消除某些类型错误的示例。他指出,当前内核中的 iget_locked() 函数有一组复杂的必备条件。调用者必须检查返回值是否为 null,如果不是,则需要检查返回的 struct inode 的内容来确认它是是一个新的还是已存在的 inode。如果它是新的,则需要在使用之前进行初始化;如果失败,则需要调用 iget_failed(),他说。

关于 iget_locked() 的调用者需要执行的操作的一些细节进行了讨论,Al Viro 对 Almeida 幻灯片中的部分内容表示不赞成。他们进行了来回讨论,Overstreet 观察到,通过将规则封装到 Rust 类型和抽象中,可以避免这种类型的讨论/争论;编译器将知道正确的事情。

Overstreet 指出,Christian Brauner 和 Alice Ryhl 在第一次发布之后帮助改进了这些抽象;特别是,他从 Rust 代码中处理引用计数的方式中学到了很多东西。“这将使我们所有人的生活变得容易得多,”Overstreet 说。

Almeida 展示了一张幻灯片,其中包含了 Rust 中 iget_locked() 的等效代码,名为 get_or_create_inode() 。他说,重要的部分在于返回类型;与 C 语言一样,调用者必须检查是否失败,但成功情况大不相同。如果成功,调用者会收到一个可以使用的常规引用计数 inode(当 inode 对象不再被引用时,其引用计数会自动递减),或者它会收到一个新的 inode,如果该 inode 从未被初始化,它会自动调用相当于 iget_failed() 的函数。如果它曾经被初始化(只能被初始化一次),它就会变成一个具有自动引用计数递减的常规 inode。所有这些都是通过类型系统强制保证的。

Viro 对此在实践中如何运作表示怀疑。他想知道这些约束是在源代码的什么地方定义的。Almeida 说,核心想法是从 Viro 以及其他的文件系统开发人员那里确定约束是什么,然后创建可以强制执行这些约束的类型和抽象。

脱节(Disconnect)

Dave Chinner 提出了 C API 和 Rust API 中名称之间的脱节问题,这意味着开发人员无法查看 C 代码并知道等效的 Rust 调用是什么。他说,应该使用相同的名称,否则对于现有的开发社区来说将完全陌生。此外,当 C 代码发生变化时,Rust 代码需要随之变化,但谁来做这项工作呢?Almeida 同意这是一个需要讨论的问题。

就重命名的函数而言,他不反对将名称改为与 C API 相匹配,但他认为 iget_locked() 不是一个特别好的名称。也许可以利用这个机会创建更好的名称。

他们对这个例子进行了一些进一步的讨论,Viro 说这不是一个好的选择,因为 iget_locked() 是一个库函数,而不是 superblock 对象的成员函数。Almeida 说 get_or_create_inode() 可以变成一个库函数;他的例子只是为了展示如何将约束编码到类型之中。

Brauner 说,需要决定 Rust 抽象是否将是通用的,旨在用于所有内核文件系统,或者是否只关注用 Rust 编写更简单的文件系统所需的函数。在处理 get_or_create_inode() 等函数比 iget_locked() 编码了更多约束的情况时,还存在一个长期问题。随着 C 代码的演变(至少在最初,这方面的变动将比 Rust 代码更快),需要保持两个 API 同步。

Overstreet 说,这归结为一个问题,即重构和清理是否将作为添加 Rust 抽象的一部分进行;他坚信这是必需的。但 James Bottomley 说,不仅仅是这些。对象生命周期正在被编码到 Rust API 中,但在 C 中没有等效的代码;如果有人在一边改变了对象的生命周期,另一边就会出现 bug。

Chinner 说,也存在一些问题,因为 inode 对象的生命周期有时是跟具体文件系统相关的。将单一生命周期理解编码到 API 中意味着其函数将不适用于某些文件系统。Overstreet 说,不使用 VFS API 的文件系统将无法从中受益,但 Chinner 说,VFS inode 只是一个结构,由文件系统管理其生命周期。Almeida 说,这个例子只会被当前调用 iget_locked() 并可以从中受益的文件系统使用。Rust 开发人员并不试图强迫文件系统改变它们的工作方式。

分配痛苦

Ted Ts'o 说,问题的一部分是有人试图让“每个人都转而信奉”Rust 宗教;他说,这不会发生,因为 Linux 中有 50 多个不同的文件系统不会立即被转换。C 代码将继续改进,如果这破坏了 Rust 绑定,就会破坏依赖它们的那些文件系统。在可预见的未来,Rust 绑定将是二等公民,他说;损坏的 Rust 绑定是 Rust-for-Linux 开发人员的问题,而不是整个文件系统社区的问题。

他建议继续开发 Rust 绑定,同时继续发展 C 代码。随着这些变化的发生,“我们将找出将大量语义编码到类型系统中这个概念是好是坏”。他认为,一两年后,这个问题的答案会变得很清楚;但实际上,这将归结为一个“痛苦分配问题(where does the pain get allocated)”。在他看来,像这样的重大改变几乎总是归结为一个“痛苦分配问题(pain-allocation question)”。

Almeida 说,他并不是试图使 C API 固定下来不可以演进了;他的目标是让文件系统开发人员解释 API 的语义,以便他们可以将这些语义编码到 Rust 中。Bottomley 说,随着更多这些语义被编码到绑定中,它们在同步方面会变得更加脆弱。一些人表示不同意,以各种“不”或类似的回复来表达。Almeida 说,任何 API 的用户都是一样的;如果 API 发生改变,用户需要更新。但 Ts'o 语重心长地说,不是每个人都会学习 Rust;如果他进行了一些更改,他会修复所有受影响的 C 代码,但是,“因为我不懂 Rust,我不会修复 Rust 绑定,抱歉”。

Viro 回到他对提议的 iget_locked() 替代品的异议。他认为的根本问题是依赖方法(methods)而不是函数(functions);使用方法不是正确的前进方向,因为参数没有明确指定。但 Overstreet 说,对方法的抱怨来自像 C++ 这样的语言,这些语言过于依赖继承,这“是一个糟糕的想法”。Rust 没有这样做;Rust 中的方法基本上只是一个语法元素。

他们对究竟是什么被编码到类型中进行了一些讨论。Jan Kara 说,inode 有一些与之相关的行为,比如它的引用计数及其处理方式,但还有其他行为是 iget_locked() 函数固有的。Overstreet 和 Almeida 说,这两个部分都编码到类型中,但分开编码;使用 inode 类型的其他函数可能具有具有不同属性的返回值。

Viro 阐述了他对 inode 在 VFS 中的工作方式的一些理由。他同意从小处开始,看看事情会走向何方。Overstreet 建议,也许使用的例子不是一个好的起点,“因为这是复杂的情况”。“哦,不,不是的,”Viro 笑着回答,会议结束。

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

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

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

d61261e4bfde35d5e5013d4179fa4a99.jpeg

基于Rust的分布式文件系统项目介绍.zip 基于Rust的分布式文件系统项目介绍 随着大数据和云计算技术的快速发展,分布式文件系统作为存储和管理海量数据的关键技术之一,受到了越来越多的关注。Rust作为一种安全、高效且并发性能出色的编程语言,为构建高性能、高可靠性的分布式文件系统提供了有力的支持。本项目旨在利用Rust语言,结合分布式系统的设计理念,开发一个稳定、可扩展的分布式文件系统。 一、项目背景与目标 在当前的信息化社会中,数据量呈现爆炸式增长,传统的文件系统已经无法满足大规模数据的存储和管理需求。分布式文件系统通过将数据分散存储在网络中的多个节点上,实现了数据的高可靠性、高可扩展性和高性能。然而,目前市面上的分布式文件系统大多采用C++或Java等语言开发,虽然性能出色,但存在内存安全问题或并发性能不足等缺陷。Rust语言以其内存安全、并发性能和零成本抽象等特点,为构建高性能、高可靠性的分布式文件系统提供了新的选择。 本项目的目标是利用Rust语言,结合分布式系统的设计理念,开发一个稳定、可扩展的分布式文件系统。该系统将提供文件存储、文件访问、数据备份和恢复等功能,支持海量数据的存储和管理,并具备高并发、高可靠性 立即下载

相关推荐

高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下...

oxoo123的专栏 4276

rust 介绍及开发环境配置(linux+windows)

rust开发环境搭建和简单介绍

ziqibit的博客 1万+

基于Dify构建银行智能客服:从意图识别到多RAG架构的实战解析

本文深入解析了如何利用Dify平台构建银行智能客服系统。从传统客服痛点出发,详细阐述了基于意图识别精准分类用户需求,并通过多RAG架构解决知识混淆问题,实现高效、准确的业务响应。文章重点介绍了结合工具调用实现业务流程自动化,并强调了数据本地化部署、内容安全过滤等银行级安全合规实践,为金融行业AI应用提供了实战指南。

yog99的博客 926

使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令

Rust 已经听了无数遍,我很清楚它很强!但我也刚了解到它比较难学!那么加上 ChatGPT 呢?下面的代码就是在 ChatGPT 加持下写出来的,我只起到了辅助作用!只能说它们都很厉害!Rust(又称为 Rust programming language)是一种系统编程语言,主要用于开发底层系统和应用程序,如操作系统、网络协议、编译器等。

訾博(ZiBo)的博客 2644

银河麒麟V10-ARM架构-postgresql安装与部署指南

本文详细介绍应用源码进行pgsql的安装步骤,本文以postgresql-12.0为例。提示:以下是本篇文章正文内容,下面案例可供参考银河麒麟系统安装程序比较繁琐,潜在问题比较多,个人建议均通过源码自定义编译安装。国产系统还需努力啊!

idols_man的博客 1万+

Kaggle | 总奖池超200万美金的数学竞赛AIMO2冠军方案

••••结论1:通过结合高质量大规模数据集、工具集成推理和生成式选择方法,可以构建在挑战性数学问题上达到最先进水平的语言模型。本文的方法在 AIMO-2 竞赛中的胜利以及在多个数学基准上的 SOTA 结果验证了这一策略的有效性。结论2:发布 OpenMathReasoning 数据集、OpenMath-Nemotron 模型和代码是社区的宝贵财富。

hxshine的博客 1194

在Linux环境下运行Rust程序

Linux环境下运行Rust程序。

m0_54880288的博客 2023

3D视觉引导技术在机器人焊接中的应用

通过对比传统的2D视觉和3D视觉技术在焊接领域的应用差异,探讨了3D视觉引导技术在提高焊接精度、适应不规则工件形状和增强自适应能力方面的优势。本文对3D视觉引导技术在机器人焊接中的应用进行了深入探讨,总结了其在提高焊接精度、适应不规则工件形状和增强自适应能力方面的优势,并通过应用案例展示了其在焊接路径规划、焊缝检测和焊接质量控制等方面的重要作用。1. 提高焊接精度:3D视觉引导技术能够精确测量焊接工件的三维形状和位置,为机器人提供精准的焊接路径规划和跟踪,从而提高焊接精度。三、3D视觉引导技术概述。

2302_79273122的博客 1835

Rust国内镜像库

步骤三:设置 crates.io 镜像, 修改配置 ~/.cargo/config,已支持git协议和sparse协议,>=1.68 版本建议使用 sparse-index,速度更快。步骤二:安装 Rust(请先完成步骤一的环境变量导入并 source rc 文件或重启终端生效)步骤一:设置 Rustup 镜像, 修改配置 ~/.zshrc or ~/.bashrc。

Europeqqq的博客 1912

Android 默认授予所有应用权限以及特殊权限处理

PackageManagerService作为android的主要系统服务之一,包含处理应用权限相关的职责。源码地址如下:在PMS成功启动时并收到回掉systemReady回进行应用权限授予。DefaultPermissionGrantPolicy为权限处理策略管理类。这里并没有赋予所有系统应用权限,所以当进行应用时还是会显示权限检查的弹框。可通过此方法进行所有应用权限赋予:如果不想所有应用都授予权限,可考虑在system/etc下的权限相关xml文件添加应用包名和所需权限。

Jimmy的专栏 1508

金融科技创新中人工智能的应用:8篇优质论文精选(含2023)

随着科技的飞速发展,金融领域正经历着前所未有的变革。在这个过程中,人工智能技术发挥着越来越重要的作用。为了深入探讨金融人工智能的研究和应用,享享特地整理了几篇金融人工智能方面的论文,大家可以看一下金融人工智能方向最新的研究成果!面向金融领域的大型语言模型本文介绍了BloombergGPT,一个基于广泛金融数据训练的500亿参数模型。基于彭博(Bloomberg)广泛数据来源,建立了一个基于彭博数据的3630亿令牌数据集,并结合了额外3450亿通用数据令牌。

2401_82426425的博客 3210

【Rust】文件系统

本文将介绍Rust的文件系统,涵盖文件读写、目录遍历,并给出代码示例。 文件读写实践: 读取文件的字符串行 避免读取写入同一文件 使用内存映射随机访问文件 目录遍历实践: 过去 24 小时内修改过的文件名 查找给定路径的循环 递归查找重名文件 使用给定断言递归查找所有文件 跳过隐藏文件遍历目录 在给定深度的目录,递归计算文件大小 递归查找所有 png 文件 忽略文件名大小写,使用给定模式查找所有文件

xian0710830114的专栏 2968

基于STM32的家庭环境监测毕业设计(全部资料)

本文设计并实现了一套基于STM32的家庭环境监测系统,具备温湿度、烟雾浓度和PM2.5检测功能,通过OLED屏实时显示数据,并能自动或手动控制风扇、加湿器等设备。系统采用分层架构设计,包含数据采集、处理、显示和控制执行模块,经测试性能稳定可靠。研究结果表明,该系统能有效提升家庭环境监测与控制的智能化水平,但仍存在传感器精度和智能化程度不足等问题,未来可进一步优化硬件配置并引入AI算法提升性能。

3254968421的博客 461

LWN:高效的Rust tracepoint!

关注了就能看到更多这么棒的文章哦~Efficient Rust tracepointsBy Daroc AldenOctober 8, 2024Kangrejos 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/992455/Alice Ryhl 一直致力于将内核中广泛使用的tracepoint(跟踪点)无缝地放入 Rust 代...

Linux News搬运工 1782

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

温度PID控制PLC程序

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

LWN:新的容器文件系统PuzzleFS!

关注了就能看到更多这么棒的文章哦~The PuzzleFS container filesystemBy Jonathan CorbetSeptember 25, 2023KangrejosChatGPT translationhttps://lwn.net/Articles/945320/差不多去年的时候,发布了一些旨在支持容器工作负载(container workload)的新文件系统类型。P...

Linux News搬运工 827

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LWN:内核处理Rust代码的流程!

Hindborg 同意,但他也指出,在块(block)子系统中,开发者进行更改时并不担心 Rust 方面的问题。当他收到问题报告时,他会在一天内修复它,一切都会很好。如果 Rust 代码要通过常规的子系统树(subsystem trees),那么维护者至少应该对这些代码进行构建测试(build tests),并且应该有一个明确的方案来应对构建出错(build break)的情况。在他的结论中,他重申,自 6.10 版本以来,Rust 编译器的最低版本一直保持在 1.78.0,即使较新的版本已经获得了支持。

Linux News搬运工 1659

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Rust日报】 LWN:在 Linux 内核中编写 Rust 系列 - 内核 Rust 代码中的接口绑定

另一方面,Rust 的基础是建立在 unsafe 代码之上的。编译时保证代码的可靠性非常重要。可以大大提高确保代码可靠性的几率,但这取决于测试的质量,因此并非万无一失,这为运行时强制执行留下了空间。在我们的空气质量监测项目中,最终的挑战是蓝牙低功耗(BLE):今天的目标是通过无线方式将二氧化碳浓度(PPM)与运行在 iPhone 上的应用程序共享,使用嵌入式 Rust……:维护《【Rust 性能手册】(https://nnethercote.github.io/perf-book/)》,分享优化经验。

Rust语言学习交流 954

LWN:维护者峰会上讨论Rust in kernel!

关注了就能看到更多这么棒的文章哦~Using Rust for kernel developmentBy Jonathan CorbetSeptember 27, 2021Maintain...

Linux News搬运工 225

LWN:内核热点: folio,多代LRU,以及Rust!

关注了就能看到更多这么棒的文章哦~The kernel radar: folios, multi-generational LRU, and RustBy Jonathan CorbetJ...

Linux News搬运工 1822

LWN:内核要给Rust什么地位?

关注了就能看到更多这么棒的文章哦~Committing to Rust for kernel codeBy Jonathan CorbetNovember 22, 2023Maintainers SummitChatGPT translationhttps://lwn.net/Articles/952029/在过去的几年里,Rust 一直是 Kernel Maintainers Summit 的一...

Linux News搬运工 852

LWN:合入bcachefs!

关注了就能看到更多这么棒的文章哦~Merging bcachefsBy Jake EdgeJune 16, 2023LSFMM+BPFDeepL assisted translationhttps://lwn.net/Articles/934692/bcachefs 文件系统及其推送到 upstream 的过程是 bcachefs 的创建者 Kent Overstreet 在 2023 年 Lin...

Linux News搬运工 1534

LWN:6.14合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~The first part of the 6.14 merge windowBy Jonathan CorbetJanuary 23, 2025Gemini-1.5-flash translationhttps://lwn.net/Articles/1005651/截至本文撰写之时,已有超过 4300 个非合并变更集 (non-merge changeset) ...

Linux News搬运工 963

LWN:6.7合并窗口的第一部分!

关注了就能看到更多这么棒的文章哦~The first half of the 6.7 merge windowBy Jonathan CorbetNovember 3, 2023ChatGPT translationhttps://lwn.net/Articles/949294/自 6.7 合并窗口打开以来,截至本文写作时已有 9,842 个非合并的变更集(non-merge changeset)...

Linux News搬运工 885

LWN:6.9 合并周期的后半部分!

关注了就能看到更多这么棒的文章哦~The rest of the 6.9 merge windowBy Jonathan CorbetMarch 25, 2024Gemini translationhttps://lwn.net/Articles/965541/6.9-rc1内核预发布版本于 3 月 24 日公布,标志着本次开发周期的合并窗口关闭。截至那时,已有 12,435 个非合并变更集(n...

Linux News搬运工 366

LWN: linux-next 的最佳实践

Torvalds 说,这种习惯也会在 linux-next 中引起麻烦,但 Mark Brown 认为,只有在其他人在已变基的仓库基础上进行构建时,变基才会真正成为问题。Jiri Kosina 询问,既然这些仓库应该已经被拉入 linux-next 并在那里进行了构建测试,那么 Torvalds 在提取仓库时遇到的构建问题是如何发生的。当维护者在将提交发送到主线之前对其进行拣选 (cherry-pick) 时,也会产生额外的问题,这使得追踪这些提交在 linux-next 中出现时的状态变得更加困难。

Linux News搬运工 147

LWN:6.14 合并窗口的后续更新!

关注了就能看到更多这么棒的文章哦~The rest of the 6.14 merge windowBy Jonathan CorbetFebruary 3, 2025Gemini-1.5-flash translationhttps://lwn.net/Articles/1006378/在Linus Torvalds 发布 6.14-rc1并关闭了此开发周期的合并窗口时,大约有 9,307 ...

Linux News搬运工 898
上一篇: LWN:pahole 进展!
下一篇: LWN:用Unison进行编程!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值