type
status
slug
date
summary
tags
category
password
icon

实验

实现系统调用sys_linkat

这是创建一个文件的硬链接

硬链接

硬链接要求两个不同的目录项指向同一个文件,在我们的文件系统中也就是两个不同名称目录项指向同一个磁盘块。
notion image
notion image
notion image
对于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),用于定位其他连续区域的位置,检查文件系统合法性。
  • 第二个区域是一个索引节点位图,长度为若干个块。它记录了索引节点区域中有哪些索引节点已经被分配出去使用了。
  • 第三个区域是索引节点区域,长度为若干个块。其中的每个块存储了若干个索引节点
  • 第四个区域是一个数据块位图,长度为若干个块。它记录了后面的数据块区域中有哪些已经被分配出去使用了。
  • 最后的区域则是数据块区域,其中的每个被分配出去的块保存了文件或目录的具体内容。
notion image

超级块:

超级块 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))
notion image

文件系统的定义

文件系统负责将逻辑上的目录树结构(包括其中每个文件或目录的数据和其他信息)映射到持久存储设备上,决定设备上的每个扇区应存储哪些内容。反过来,文件系统也可以从持久存储设备还原出逻辑上的目录树结构。
代码里面,创建文件系统的时候需要传入的参数是:
在easy-fs-fuse里面,会调用这个接口:
let efs = EasyFileSystem::create(block_file, 16 * 2048, 1);
而open就是打开一个已存在的文件系统:
 
 
rcoreLab-ch5rcoreLab-ch8
Loading...
liamY
liamY
Chasing Possible
最新发布
Enter AMX (Advanced Matrix Extensions)
2025-3-17
ktransformers相关内容学习
2025-2-16
sglang_benchmark
2025-2-7
SnapKV: LLM Knows What You are Looking for Before Generation
2024-12-12
数字电路复习
2024-12-11
CacheBlend: Fast Large Language Model Serving with Cached Knowledge Fusion论文学习
2024-11-23
公告
🎉Liam’s blog🎉
-- 全新上线 ---
👏欢迎comment👏
⚠️由于浏览器缓存的原因,有些内容是更新了的但是需要手动刷新3次左右,页面才会显示更新内容