当前位置: 首页 > news >正文

一个简单的文件系统(MinixFS)实现解析

1. Minix文件系统概要

Minix file system 是 Andrew S. Tanenbaum 在 1980 年代发明的文件系统, 并随着 Minix 操作系统一起于 1987 年发布。

Linus 编写 Linux 内核第一个版本的时候, 使用的也是 Minix FS, Linux 至今依然提供了对 Minix FS 的支持。Minix FS 结构简单, 易于理解。

2. Minix文件系统的组成

Minix 文件系统由 6 个部分组成:引导块、超级块、i 节点位图块、逻辑块位图块、i 节点块、数据区。对于一个普通的磁盘块设备来说,这 6 个部分的分布如下:

图片

Minix 文件系统的最小分配单位是 zone, 可以把它叫做虚拟块, 一个虚拟块的大小是 1024 byte, 而磁盘的物理扇区大小常常是 512 byte。

引导块

占用一个数据块,用于操作系统启动时使用,我们可以忽略。

超级块

占用一个数据块,用于保存文件系统的信息,Minix 文件系统使用 minix_super_block 对象来保存文件系统的信息,其定义如下:

struct minix_super_block {      __u16 s_ninodes;       // inode个数      __u16 s_nzones;        // 数据块zone个数(v1版本)      __u16 s_imap_blocks;   // inode位图占用的数据块数量      __u16 s_zmap_blocks;   // 数据块位图占用的数据块数量      __u16 s_firstdatazone; // 第一个数据块起始号      __u16 s_log_zone_size; // 数据块大小, log2(zone/block)      __u32 s_max_size;      // 文件最大尺寸      __u16 s_magic;         // 魔数(用于识别minix文件系统及版本)      __u16 s_state;         // 文件系统状态      __u32 s_zones;         // 数据块列表的元素个数(v2版本)};

inode节点位图

占用若干个数据块,用于描述 inode表 中哪些成员已经被使用,每个位表示一个 inode 的使用情况。

逻辑块位图

用若干个数据块,用于描述 数据块列表 中哪些成员已经被使用,每个位表示一个逻辑块的使用情况。

i节点表

占用若干个数据块,由多个 minix_inode 对象组成,每个 minix_inode 对象表示一个文件或目录,其定义如下:

struct minix_inode {    __u16 i_mode;    // 文件类型及属性(rwx)    __u16 i_uid;     // 文件所属用户id    __u32 i_size;    // 文件大小,单位字节    __u32 i_time;    // 修改时间(自1970.1.1以来的秒数)    __u8  i_gid;     // 文件所属组id    __u8  i_nlinks;  // 链接数(有多少文件目录项指向该i节点)    __u16 i_zone[9];  // 文件所占用的磁盘逻辑块号数组};

其中i_zone[9]定义如下:

  • zone[0] - zone[6]指向的虚拟块直接储存了文件的数据

  • zone[7]指向的虚拟块储存的是更多的虚拟块号码, 就是一个二级表

  • zone[8] 指向一个双重间接块

图片

因此Minix FS 支持的最大文件大小为 (7 + 1024/2 + 1024/2*1024/2) * 1024 byte = 256 MB。

3. Minix磁盘布局

Minix整体布局如下图所示:

图片

下面手动创建一个Minix磁盘,来具体的分析布局组成:

3.1 通过dd命令创建一个64k的二进制磁盘

# dd if=/dev/zero of=minix.disk bs=1k count=64 oflag=direct64+0 records in64+0 records out65536 bytes (66 kB, 64 KiB) copied, 0.195595 s, 335 kB/s

3.2 格式化为Minix文件系统

minix fs有三个版本,下面我们通过“-1”指定使用v1版本来格式化​​​​​​​

# mkfs.minix -1 minix.disk32 inodes64 blocksFirstdatazone=5 (5)Zonesize=1024Maxsize=268966912

3.3 挂载文件系统,并创建几个测试文件​​​​​​​

# mount minix.disk minix-root# cd minix-root# mkdir dir# echo "hello, world!" > dir/1.txt# echo "minix fs test" > 2.txt# echo "xyz" > 3.txt# tree minix-rootminix-root├── 2.txt├── 3.txt└── dir └── 1.txt1 directory, 3 files

3.4 通过hexdump查看二进制组成

# hexdump -C  minix.disk

各部分含义如下:

图片

图片

图片

图片

图片

http://www.lryc.cn/news/155945.html

相关文章:

  • 地图投影-2亚当斯方形
  • atcoder库中类欧(类欧几里得算法)floor_sum用法
  • 后端面试话术集锦第 十一 篇:mybatis面试话术
  • SpringBoot运维实用篇、打包、运行、高级配置、多环境开发、日志
  • springdoc-openapi-ui 整合 knife,多模块分组,脚手架
  • 04-MySQL02
  • 实现跨境电商测评和采退、LU卡、LU货最安全的系统方案
  • 软件生命周期及流程
  • nginx使用详解
  • YOLOV7 添加 CBAM 注意力机制
  • 【SpringSecurity】七、SpringSecurity集成thymeleaf
  • Go语言中的数组、切片和映射解析
  • MySql学习笔记03——DQL(数据查询)基本命令
  • 操作系统的四大特性
  • 旅游攻略APP外包开发功能
  • Apollo在Java中的使用
  • Elasticsearch 全文搜索引擎 ---- IK分词器
  • Layer 2盛夏已至,StarkNet如何实现价值跃迁?
  • KaiwuDB 受邀亮相 2023 中国国际“软博会”
  • RS-485/RS-422收发器电路 DP3085 国产低成本替代MAX3085
  • R-which函数(带有arr.ind参数)
  • 单片机通用学习-什么是时钟?
  • PCL入门(二):初识点云数据
  • LeetCode 面试题 03.01. 三合一
  • 【WebSocketIndexedDB】node+WebSocketIndexedDB开发简易聊天室
  • 【01】弄懂共识机制PoW
  • QT C++ 基于TCP通信的网络聊天室
  • SpringMVC入门详细介绍
  • R3LIVE源码解析(9) — R3LIVE中r3live_lio.cpp文件
  • 如何高效的解析Json?