File system
Contents
这个实验是关于文件系统的,要实现大文件存储和符号链接功能。
我们首先来看一下 xv6 文件系统的结构。
xv6 文件系统分层结构如下图所示,Disk 层负责读写硬件设备,Buffer cache 层缓存磁盘块,负责同步缓存的更改到磁盘,确保在某一时刻只有一个进程对特定的磁盘块更改。Logging 层确保上层能对磁盘块进行事务操作,例如对几个磁盘块的更改要么都成功要么都失败。Inode 层提供了一个个独立的文件,每个文件都被表示为一个 inode, inode 拥有唯一编号以及存储文件内容的数据块 。Pathname 层提供了对文件按层级递归访问的能力,File descriptor 层将 unix 资源如:管道、设备、文件等抽象为文件系统接口。
文件系统必须规划好磁盘哪里存 inodes 哪里存数据块,因此 xv6 将磁盘分成了下图所示的部分,block 0 为启动块,文件系统不会使用 block 0 ,block 1 称为超级块,它包含了文件系统的元信息,例如:文件系统中每个块的大小,有多少个块,inodes 的个数,log 有多少个块。从 block 2 开始存储 log,log 后面是存储 inodes,一个块里会存储多个 inodes,接下来是 bitmap 记录了哪些数据块是已经被使用了的,最后是数据块,要么是 bitmap 标记为空闲的数据块,或者是存储了文件和目录的内容的数据块。
Large files
在这个练习中,将增加 xv6 文件的最大大小。目前 xv6 文件限制为 268 个块,或 268*BSIZE 字节(在 xv6 中 BSIZE 为 1024)。这个限制来自这样一个事实,一个 xv6 inode 包含 12 个直接块号和一个间接块号,一个块最多可以容纳 256 个块号,总共 12+256=268 块。
我们要做的就是实现两级间接块号来使 一个 inode 能存储更大的文件。
实现:
|
|
Symbolic links
实现符号链接。符号链接(或软链接)是指通过路径名链接的文件;当一个符号链接被打开时,内核会跟随链接指向被引用的文件。符号链接类似于硬链接,但硬链接仅限于指向同一磁盘上的文件,而符号链接可以跨磁盘设备。
实现,基本上按照提示走就可以了。
|
|
总结
这个实验让我熟悉了 xv6 文件系统的结构,以及文件存储,访问在内核中是如何进行的。实验难度来讲是比较容易的,主要是加深对文件系统的理解。这里还有一个插曲是跑测试的过程中发现了 docker volume 的性能很差,因为我用的是将代码放在本地编写修改,通过 docker volume 的方式映射到一个 ubuntu 的容器内跑测试,结果发现测试一直跑不过,都是因为超时退出,但是在一个一个测试跑又都能跑过,就开始怀疑是不是 docker 环境的问题,结果网上一查确实有这个问题,就写了测试代码试了一下,发现确实是环境的问题。无奈又在 mac 上装了一套环境,顺利跑过测试。