作者:互联网 时间: 2026-09-11 10:40:01
工作中遇到相关需求时,simplefs值得先读说明,因为它主要用于从头开始的简单的内核空间磁盘文件系统。对日常自动化任务来说,输入边界、依赖和失败处理如果不清楚就很难稳定复用往往决定它能否落地,不能只用安装成功来判断。先用一项范围明确的真实任务完成最小试跑更稳妥;过程中要观察配置时间、输出质量、异常信息和维护痕迹,失败也应能解释原因。对愿意先做小范围验证并复查原始文档的团队来说,这个仓库值得继续验证;只求即装即用的人则要先看维护成本。
一个简单的文件系统来理解事物。
这是一项正在进行的工作。暂时不要使用这个。
如果您打算学习文件系统,请从头开始。您可以从该存储库中的第一个提交开始查看并向上移动。
源文件根据知识共享零许可证获得许可。 更多信息请访问:http://creativecommons.org/publicdomain/zero/1.0/ 完整许可文本位于:http://creativecommons.org/publicdomain/zero/1.0/legalcode
simplefs 1.0 架构 + 注释
零块 = 超级块 块一 = Inode 存储 块二 = 由作为 mkfs 一部分创建的初始文件占用。
仅支持有限数量的文件系统对象。 可以创建文件和目录。实现了对 .create 和 .mkdir 的支持。可以创建嵌套目录。 一个文件的增长不能超过一个块。尝试执行此操作时,ENOSPC 将作为错误返回。 目录将子节点编号和名称存储在其数据块中。 读取支持已实现。 实现了基本的写入支持。如果在偏移量中完成写入可能不会成功。当您覆盖整个块时起作用。 锁没有经过深思熟虑。当前的锁定方案有效,但需要更多分析+代码审查。 内存泄漏可能(将会?)存在。
制作人员 最初的源代码由 psankar 编写,补丁由其他 github 成员贡献。 azat 是第一个贡献者。
感谢 VijaiBabu M 和 Santosh Venugopal 的指导。他们关于文件系统的精彩演讲激励我从头开始实现一个文件系统。如果没有他们鼓舞人心的演讲,我就不会专注于文件系统。
非常感谢 kernelnewbies 邮件列表帮助我澄清 Linux 内核的本质,特别是像 Mulyadi Santosa、Valdis Kletnieks、Manish Katiyar、Rajat Sharma 等人。
补丁提交 仅当您准备好在同一知识共享零许可证中发布更改时,才请发送合并请求。
我们希望保持文件系统简单和最小化,以便它可以用作很好的教材。
我们不打算在生产机器中使用这个文件系统。因此,一些设计选择是由 learning/teaching 相对于 performance/scalability 的简单性驱动的。这是故意的。所以不要试图修复这些问题:)
TODO
编译: 安装 Linux 内核源代码并从签出目录运行 make。
测试: 这是 simplefs 的构建环境:https://github.com/azat/simplefs-bld
psankar@linux-9dni:~/src/simplefs> make
psankar@linux-9dni:~/src/simplefs> dd bs=4096 count=100 if=/dev/zero of=image 100+0 条记录 100+0条记录输出 复制了 409600 字节 (410 kB),0.00106827 秒,383 MB/s psankar@linux-9dni:~/src/simplefs> ./mkfs-simplefs 图像 超级块写入成功 根目录inode写入成功 welcomefile inode写入成功 inode 存储已成功写入的填充字节(在两个 inode 之后) 根目录数据块(欢迎文件的名称+inode_no对)写入成功 根目录子目录写入成功后的填充 welcomefilebody 已成功写入
psankar@linux-9dni:~/src/simplefs>
现在作为根用户: linux-9dni:/home/psankar/src/simplefs # insmod simplefs.ko ;安装-o循环-t simplefs图像/home/psankar/src/simplefs/mount/;消息 [41932.281196] 已成功注册 simplefs [41932.284811]磁盘中获得的幻数是:[268640275] [41932.284813] 版本 [1] 的 simplefs 文件系统,格式为在设备中检测到的块大小为 [4096]。 [41932.284823] simplefs 已成功安装在 [/dev/loop16] linux-9dni:/home/psankar/src/simplefs # cd 挂载/ linux-9dni:/home/psankar/src/simplefs/mount # ls 瓦纳卡姆 linux-9dni:/home/psankar/src/simplefs/mount # 猫 vanakkam 爱就是神。神就是爱。安贝·穆鲁甘。 linux-9dni:/home/psankar/src/simplefs/mount # cp vanakkam 你好 linux-9dni:/home/psankar/src/simplefs/mount # 猫你好 爱就是神。神就是爱。安贝·穆鲁甘。 linux-9dni:/home/psankar/src/simplefs/mount # echo "Hello World" > 你好 linux-9dni:/home/psankar/src/simplefs/mount # 猫你好 你好世界 linux-9dni:/home/psankar/src/simplefs/mount # mkdir dir1 linux-9dni:/home/psankar/src/simplefs/mount # cd dir1 linux-9dni:/home/psankar/src/simplefs/mount/dir1 # cp ../hello . linux-9dni:/home/psankar/src/simplefs/mount/dir1 # 猫你好 你好世界 linux-9dni:/home/psankar/src/simplefs/mount/dir1 # echo "一级目录" > hello linux-9dni:/home/psankar/src/simplefs/mount/dir1 # 猫你好 一级目录 linux-9dni:/home/psankar/src/simplefs/mount/dir1 # mkdir dir2 linux-9dni:/home/psankar/src/simplefs/mount/dir1 # cd dir2 linux-9dni:/home/psankar/src/simplefs/mount/dir1/dir2 # 触摸你好 linux-9dni:/home/psankar/src/simplefs/mount/dir1/dir2 # 猫你好 linux-9dni:/home/psankar/src/simplefs/mount/dir1/dir2 # echo "二级目录" > hello linux-9dni:/home/psankar/src/simplefs/mount/dir1/dir2 # 猫你好 二级目录 linux-9dni:/home/psankar/src/simplefs/mount/dir1/dir2 # ... linux-9dni:/home/psankar/src/simplefs/mount # .. linux-9dni:/home/psankar/src/simplefs # 卸载挂载; rmmod simplefs.ko ; linux-9dni:/home/psankar/src/simplefs # insmod simplefs.ko ;安装-o循环-t simplefs图像/home/psankar/src/simplefs/mount/ linux-9dni:/home/psankar/src/simplefs # cd 挂载 linux-9dni:/home/psankar/src/simplefs/mount # ls -lR .: 总计 0 drwxr-xr-x 1 root root 0 八月 5 22:43 dir1 ---------- 1 root root 0 8月5日 22:43 你好 ---------- 1根根 0 八月 5 22:43 vanakkam
./dir1: 总计 0 drwxr-xr-x 1 root root 0 八月 5 22:43 dir2 ---------- 1 root root 0 8月5日 22:43 你好
./dir1/dir2: 总计 0 -rw-r--r-- 1 root root 0 八月 5 22:43 你好 linux-9dni:/home/psankar/src/simplefs/mount # 猫你好 你好世界 linux-9dni:/home/psankar/src/simplefs/mount # cd dir1 linux-9dni:/home/psankar/src/simplefs/mount/dir1 # 猫你好 一级目录 linux-9dni:/home/psankar/src/simplefs/mount/dir1 # cd dir2/ linux-9dni:/home/psankar/src/simplefs/mount/dir1/dir2 # 猫你好 二级目录 linux-9dni:/home/psankar/src/simplefs/mount/dir1/dir2 # ... linux-9dni:/home/psankar/src/simplefs/mount # .. linux-9dni:/home/psankar/src/simplefs # 卸载挂载; rmmod simplefs.ko ; linux-9dni:/home/psankar/src/simplefs # dmesg [41932.281196] 已成功注册 simplefs [41932.284811]磁盘中获得的幻数是:[268640275] [41932.284813] 版本 [1] 的 simplefs 文件系统,格式为在设备中检测到的块大小为 [4096]。 [41932.284823] simplefs 已成功安装在 [/dev/loop16] [41951.102689]找不到文件名的索引节点[你好] [41951.102706]找不到文件名的索引节点[你好] [41951.102724]找不到文件名的索引节点[你好] [41951.102731]新文件创建请求 [41951.102986]写入的新文件大小为:[41],len为:[41] [41961.195423]写入的新文件大小为:[12],len为:[12] [41968.055946] 找不到文件名 [dir1] 的 inode [41968.055959]新目录创建请求 [41980.265026]找不到文件名的索引节点[你好] [41980.265073]找不到文件名的索引节点[你好] [41980.265082]新文件创建请求 [41980.265168]写入的新文件大小为:[12],len为:[12] [41991.857978]写入的新文件大小为:[22],len为:[22] [41999.993579] 找不到文件名 [dir2] 的 inode [41999.993592]新目录创建请求 [42005.461745]找不到文件名的索引节点[你好] [42005.461756]新文件创建请求 [42016.694882]写入的新文件大小为:[23],len为:[23] [42024.480843] simplefs 超级块被破坏。卸载成功。 [42024.485339] 成功取消注册 simplefs [42031.157983] 已成功注册 simplefs [42031.162331]磁盘中获得的幻数是:[268640275] [42031.162334] 版本 [1] 的 simplefs 文件系统,格式为在设备中检测到的块大小为 [4096]。 [42031.162360] simplefs 已成功安装在 [/dev/loop17] [42104.389807] simplefs 超级块被破坏。卸载成功。 [42104.395575] 成功取消注册 simplefs linux-9dni:/home/psankar/src/simplefs #