Skip to content

Instantly share code, notes, and snippets.

@ibreathebsb
Last active August 24, 2018 01:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ibreathebsb/57794d4a32be3dd81e2db4d05ce57d43 to your computer and use it in GitHub Desktop.
Save ibreathebsb/57794d4a32be3dd81e2db4d05ce57d43 to your computer and use it in GitHub Desktop.

组成

  1. inode 用于记录文件的权限信息,以及对应的data block编号,每个文件占用一个inode
  2. data block 用于存放文件的内容,每个文件至少占用一个
  3. superblock 用于记录整个文件系统的inode block用量以及文件系统相关信息

索引式文件系统,inode和block都有自己的编号,可以根据inode直接获取所有data block 的编号并直接访问,访问效率高

filesystem = boot sector + block group * n

block group = super block + filesystem description + data block bitmap + inode bitmap + inode table + data block

data block

  1. data block的数量格式化后就不能改变了
  2. 每个data block只能存放一个文件的信息,若文件较大会占用多个block,若较小则该data block剩余容量会浪费掉

inode table

  1. inode中记录了文件的meta信息,包括: rwx权限信息,用户和群组,时间相关atime ctime mtime,文件大小,data block的位置,以及特殊权限SUID、SGID、SBIT,特殊属性a: apppend only, i: imuatable等
  2. inode的数量在文件系统格式化时确定
  3. 每个inode的大小为128Bytes
  4. 每个文件占用一个inode,因而文件系统支持的文件数量在格式化时就已经确定了
  5. 用户在访问文件是,首先根据文件名获取到inode编号,进而获取inode上的权限信息,如果权限符合才能继续操作

inode结构

|--- 权限等meta信息 ---|---直接记录区 X 12---|---简介记录区 X 1--|--双间接记录区 X 1---|--三间接记录区 X 1---|

inode上每个记录区占用4Bytes,假设我们的文件系统data block大小为1k

直接记录区 : 直接指向data block,每个直接记录区所能代表的文件大小为1k

间接记录区 :inode直接指向的data block不是用于记录数据信息,而是用于记录真是存储数据的data block的位置, 这样的话,间接记录区直接指向的data block被当作指针,由于每个记录占用4Bytes,一个间接记录区所能代表的文件的大小为

1024 / 4 * 1k = 256k

双间接记录区 : 双间接记录区能够记录的文件大小 256 * 256 * 1k

三间接记录区 :三间接记录区能够记录的文件大小 256 * 256 *256 * 1k

这样,该文件系统的单文件大小最大为:(12 + 256 + 256^2 + 256^3)* 1k

super block

super block大小通常为1k,其中记录了:

  1. inode和data block总量
  2. 已经使用和未使用的 inode 和 data block数量
  3. inode(128 Bytes)和data block(1k, 2k, 4k)大小
  4. 文件系统最近读取,写入和磁盘校验的时间
  5. 文件系统的挂载状态,valid bit为0表示未挂载,为1表示已挂载

此外,我们注意到文件系统的每个block group都有superblock,其实都是第一个block group中superblock的备份

filesystem description

记录了当前block group中不同区段的划分, superblock,inode bitmap, block bitmap,inode table, data block的起始编号

block bitmap

记录哪些data-block已经被使用,哪些未被使用

inode bitmap

记录哪些inode已经被使用,哪些未被使用

文件访问流程

  1. 获取目录的inode号
  2. 根据目录的inode判断对目录是和否有x权限,若有权限则在目录的中 查找文件名对应的inode号码
  3. 根据文件的inode判断对文件的权限,有权限再去读取对应的data block

文件创建流程

  1. 判断对目录是否有wx权限
  2. 在inode bitmap中查找空闲的inode号,并更新权限信息
  3. 在block bitmap中查找空闲block并将数据写入,然后更新对应的inode信息,将inode中的记录区指向该block
  4. 更新superblock
@ibreathebsb
Copy link
Author

ibreathebsb commented Aug 24, 2018

Hard link

假设有文件 /a/b/c/d, 他们是一对hard link 那么二者的关系如图:

/a  => inode.a => block.a => {b :  inode.b} => | inode.real |<= {d: inode.d} <= block.c  <= inode. c <= /c 
                                                      

不会创建新的文件,只会在目录的data block下添加一笔记录

  1. 无法跨文件系统,因为是在目录的block下添加一笔文件名到inode的记录
  2. 无发链接目录,因为必须为目录下的每个文件创建链接,太复杂

@ibreathebsb
Copy link
Author

ibreathebsb commented Aug 24, 2018

Symbolic / Soft link

会使用新的inode创建文件,文件内容就是目标文件的完整路径

@ibreathebsb
Copy link
Author

ibreathebsb commented Aug 24, 2018

新创建的空目录link count为2,因为

/parent/child都指向/parent/child/.该目录的inode

此外parent的link count会加1,因为

/parent/child/.. 指向 /parent 的inode

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment