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=direct
64+0 records in
64+0 records out
65536 bytes (66 kB, 64 KiB) copied, 0.195595 s, 335 kB/s
3.2 格式化为Minix文件系统
minix fs有三个版本,下面我们通过“-1”指定使用v1版本来格式化
# mkfs.minix -1 minix.disk
32 inodes
64 blocks
Firstdatazone=5 (5)
Zonesize=1024
Maxsize=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-root
minix-root
├── 2.txt
├── 3.txt
└── dir
└── 1.txt
1 directory, 3 files
3.4 通过hexdump查看二进制组成
# hexdump -C minix.disk
各部分含义如下: