type
status
slug
date
summary
tags
category
password
icon
实验
实现系统调用sys_linkat
这是创建一个文件的硬链接
硬链接
硬链接要求两个不同的目录项指向同一个文件,在我们的文件系统中也就是两个不同名称目录项指向同一个磁盘块。
对于unlink的过程,我同样借鉴:
这会将该文件占据的索引块和数据块回收。
问答题
1.
在我们的easy-fs中,root inode起着什么作用?如果root inode中的内容损坏了,会发生什么?
root inode存储了所有文件的inode的指针(对应的block_id),我们查找文件的方式就是从root inode开始,根据名称查找对应的inode(核心是block_id,查找目录项是和查找文件一样,direct indirect1 indirect2直到找到或者遍历完),从inode里面(分成direct indirect1 indirect2)找文件实体存储的block_id。
如果root inode损坏了,可以说大部分的文件内容都找不到了,当然,严格来说,我们可以从索引块依次按照inode的大小一个个的翻找inode来找文件,但是这部分我们没有提供api,所以就用户层面来讲,是没有方法再找到文件了(损坏的root inode所造成的无法找到的目录项),
所以root inode在我们的easy-fs的实现里面很重要,就是好比一本很大的书的目录(大到没有目录就很难看书),没了它,你很难找到对应的文件的内容。
笔记补充,非实验部分
磁盘布局
easy-fs 磁盘按照块编号从小到大顺序分成 5 个连续区域:
- 第一个区域只包括一个块,它是 超级块 (Super Block),用于定位其他连续区域的位置,检查文件系统合法性。
- 第二个区域是一个索引节点位图,长度为若干个块。它记录了索引节点区域中有哪些索引节点已经被分配出去使用了。
- 第三个区域是索引节点区域,长度为若干个块。其中的每个块都存储了若干个索引节点。
- 第四个区域是一个数据块位图,长度为若干个块。它记录了后面的数据块区域中有哪些已经被分配出去使用了。
- 最后的区域则是数据块区域,其中的每个被分配出去的块保存了文件或目录的具体内容。
超级块:
超级块
SuperBlock
的内容如下:inode
在文件系统的底层实现中,并不是直接通过文件名来索引文件,而是首先需要将文件名转化为文件的底层编号(也就是inode),再根据这个编号去索引文件。
每个文件/目录在磁盘上均以一个
DiskInode
的形式存储。其中包含文件/目录的元数据: size
表示文件/目录内容的字节数, type_
表示索引节点的类型 DiskInodeType
,目前仅支持文件 File
和目录 Directory
两种类型。其余的 direct/indirect1/indirect2
都是存储文件内容/目录内容的数据块的索引,这也是索引节点名字的由来。这里28个直接索引(28个512字节块),对应大小:28*512 = 14KB
比较大,用到1级,指向一个块(512字节,可u32索引放128个,对应128*512字节块=64KB)
二级不太一样,u32指向1级,所以128个块都是1级(128*64KB=8MB)
磁盘上的
DiskInode
只有128字节(我们设计的),一个块512字节,则每个块正好能够容纳 4 个 DiskInode
get_block_id
方法体现了 DiskInode
最重要的数据块索引功能,它可以从索引中查到它自身用于保存文件内容的第 block_id
个数据块的块编号,这样后续才能对这个数据块进行访问:
PS: 后面的indirect1指向的block_id是属于数据块的,同样indirect2也是
位图
BitmapBlock是64个u64数组(1个u64有64位,64个64位就是=4096个位置,占据大小为512字节,也就是4096个block(1个block为512字节对应2MByte))
文件系统的定义
文件系统负责将逻辑上的目录树结构(包括其中每个文件或目录的数据和其他信息)映射到持久存储设备上,决定设备上的每个扇区应存储哪些内容。反过来,文件系统也可以从持久存储设备还原出逻辑上的目录树结构。
代码里面,创建文件系统的时候需要传入的参数是:
在easy-fs-fuse里面,会调用这个接口:
let efs = EasyFileSystem::create(block_file, 16 * 2048, 1);
而open就是打开一个已存在的文件系统:
- 作者:liamY
- 链接:https://liamy.clovy.top/article/OS_Tutorial/lab6
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。