aupe学习第九天——文件系统

本文记录的是对昨天第四章内容的补充,来看一下文件系统吧,也就是UNIX怎样存储文件的,这个搞清楚之后,与文件系统相关的函数以及昨天stat结构体中剩下的属性就很容易理解啦!

废话不说,直接看图:

aupe学习第九天——文件系统_第1张图片


OK,从上往下,我们一层层来看!

首先,对于一个磁盘,可以把它分区,也就是partition,每个分区可以包含一个文件系统;通常我们把一个分区格式化的时候,调用了某种类似于mkfs的函数(make file system),将一个分区变成某一种文件系统,这样才可以用来存储文件(可不是全部清空啊,那只是表面现象,我们要透过现象看本质呀!)。这个格式化的过程也就是将管理存储布局的那些信息写到磁盘上罢了,很简单吧!

再看第二行,file system,除了前面的boot block和super block,后面跟着很多cylinder group(柱面组)。文件系统中最小的存储单位就是block,block的大小是格式化时候确定的。

  •     那么,第一个boot block存储的是磁盘分区信息和启动信息,任何文件系统都不能使用启动块;
  •     super block描述整个partition的文件系统信息,比如block size,system version,mount time等,super block在每个group前都有一个copy;
  •     cylinder group是柱面组,也就是存储具体文件的地方啦,这个不细说,它延伸到了第三层,来看吧!

第三行,来了~~首先super block copy,pass;configure info,pass;看block bitmap:关于block bitmap的大小,它当然占一个块,因为块是最小的存储单位了嘛!block bitmap是所有block存储状态的一个映射,当然是0和1,用了就是1,没用就是0,这就把所有block的使用状态统计了出来,所以说用df(display file system)统计存储状态就很快,而du查看一个目录下的已用空间就慢些。i-node map和block bitmap类似,标注着i-node table(也就是下面的i-node array啦)中哪些in use或out of use,当然i-node map刚被创建的时候所有的i-node都是in use的。

好啦,接下来,我们把第三层中的i-nodes+blocks这两部分拆下来放到下面的图中细化,看图:

aupe学习第九天——文件系统_第2张图片


第一个问题,i-node中存放了啥?除了filename和i-node number外,其他的所有文件信息(文件类型、访问权限、长度、指向数据块的指针等等)都放在i-node中。那为什么要这样呢,来看。我们找文件时,实际上是找放在哪个目录下的哪个文件啦(directory is a file),directory entry是文件的一部分,我们找到它,然后通过其中的i-node number才找到了文件具体的信息。所以,如图,可以若干个目录项指向一个i-node,i-node中存放着到底有几个directory entry指向自己。这样,我们通过directory entry找到了i-node,通过i-node找到了具体的文件信息。

所以,删除一个file用的是unlink,而不是delete(只是删除一个directory entry并且i-node链接数减一罢了);mv移动一个文件实际上是改变directory entry,rename也是针对一个directory entry。

第二个问题,对于一个i-node,可能有哪些directory entry指向它呢?答案是,通常系统会维护 . 和 .. 来指向一个i-node(即当前目录和父目录),所以说,如果一个目录是叶目录,那么指向该i-node的数量至少是2;如果不是叶目录,则至少是3(再加一个其子目录的父目录指针)。


最后是关于硬链接和符号链接,即hard link 和 symbolic link。硬链接是指,directory entry指向i-node,i-node直接指向具体内容;而符号链接指一个directory entry指向一个i-node,该i-node中的S_IFLINK表示它是一个符号链接,这就意味着文件中实际存储着一个目录字符串指向其它目录,这是一个间接的过程。


OK,下面是长长的分隔线

————————————————————————————————————————————————

第四章结束,主要讲了文件系统,继续第五章~



你可能感兴趣的:(aupe学习第九天——文件系统)