linux文件系统基础--磁盘布局以及创建文件及目录的流程

一、物理磁盘到文件系统

文件系统用来存储文件内容、文件属性、和目录。这些类型的数据如何存储在磁盘块上的呢?unix/linux使用了一个简单的方法。如图所示.

它将磁盘块分为4个部分(上图有问题):

0)引导扇区,是文件系统的第一个块,引导扇区一般是512字节,前面448字节存储xxx,后面64字节存储xxx(这个我有点忘记了);虽然它占据了512字节,但是文件系统的一个块一般都是1024左移k位(一般是4096字节)的大小,因此,引导扇区实际占用的大小一般为1个block(也有的说是1024个字节,无论块大小是否为1024)。这里引导扇区是必须预留的,即使不打算从此文件系统引导系统启动,也要预留。
1)超级块,文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。

2)inode map,占用一定量的块,这个map你可以当做一个很长的数组,数组的长度是占用的块的数量*块大小*8,它是元素值只有0和1,其中1表示这个下标对应的inode号已经被占用了(一般而言,0号inode默认被占用,也不知道谁用了它,1号inode预留给了文件系统的根目录)。

3)block map,占用一定量的块,这个也可以当做一个数组,这个数组里存放的还是0和1,其下标表示后面对应的数据区的块是否被占用(0号也是默认被占用,不知谁用了,1号预留给根目录)
4) inode表。每个文件(包括目录)都有一些属性,如文件的大小、文件所有者、和创建时间等,这些性质被记录在一个称为inode的结构中。所有inode都有相同的大小,并且inode表是这些结构的一个列表,文件系统中每个文件在该表中都有一个inode。
5)数据区。文件的内容保存在这个区域。磁盘上所有块的大小都一样。如果文件包含了超过一个块的内容,则文件内容会存放在多个磁盘块中。一个较大的文件很容易分布上千个独立的磁盘块中.

二、创建一个文件的过程
我们现在知道文件的内容和属性是分开存放的,那么又是如何管理它们的呢?现在我们以创建一个文件为例来讲解。在命令行输入命令:
$ who > userlist
当完成这个命令时。文件系统中增加了一个存放命令who输出内容的新文件,那么这整个过程到底是怎么回事呢?
文件的属性和内容:内核将文件内容存放在数据区,文件属性存放在inode,文件名存放在目录。下图显示了创建一个文件的例子,假如这个新文件要3 个存储块来存放内容。

包括如下四个步骤:

1)存储属性 也就是文件属性的存储,内核先找到一块空的inode。图中,内核找到inode号47。内核把文件的信息记录其中。如文件的大小、文件所有者、和创建时间等
2)存储数据 即文件内容的存储,由于该文件需要3个数据块。因此内核从自由块的列表中找到3个自由块。图中分别为627、200、992,内核缓冲区的第一块数据复制到块627,第二和第三分别复制到200和992.
3)记录分配情况,数据保存到了三个数据块中。所以必须要记录起来,以后再找到正确的数据。分配情况记录在文件的i-节点中的磁盘序号列表里。这3个编号分别放在最开始的3个位置。
4)添加文件名到目录,新文件的名字是userlist,   内核将文件的入口(47,userlist)添加到目录文件里。文件名和i-节点号之间的对应关系将文件名和文件和文件的内容属性连接起来,找到文件名就找到文件的i-节点号,通过i-节点号就能找到文件的属性和内容。

三、创建一个目录的过程

前面说了创建一个文件的大概过程,那么创建一个目录时又是怎么回事呢?
我们知道,目录其实也是文件,只是它的内容比较特殊:包含文件名字列表,列表一般包含两个部分:inode号和文件名。所以它的创建过程和文件创建过程一样,只是第二步写的内容不同。一个目录创建时至少包括两个链接:“.”,“..”
我们可以通过系统命令来查看目录的内容:#ls -lia

   

上图的结果是文件名和对应的inode号,其中“.”表示是当前目录,而“..”是当前目录的父目录。但也有特殊情况,我们查看根目录的情况:

<span style="font-family:Microsoft YaHei;">[root@localhost ~]# ls -i1a /
2 .
2 ..
98305 .autofsck
1310721 backup</span>

我们发现“.”和“..”都指向inode 2.实际上当用mkfs创建一个文件系统时,mkfs会将根目录的父目录指向自己

四、如果有大文件如何实现
文件内容的分配情况是必须记录在inode的磁盘序号列表里的。但是inode只包含一个最多含有x个项的分配链表,如果分配的数据块超过x个块时怎么办?
Linux用到一个间接块来解决此问题,其实就是多级索引的形式来存储。

在NTFS文件系统中,每一个文件或目录都拥有一个MFT记录,MFT记录中记录了文件或目录的基本信息,对于普通文件来说,一般拥有文件序号,文件名,创建时间,文件大小,文件属性,文件数据地址索引等基本文件信息,而一个目录除了拥有基本文件信息,还拥有其目录下的文件索引项信息,文件与其父目录之间通过该文件的MFT记录中的父目录信息和目录中的索引项来建立隶属关系,这两种信息唯一地确定了文件与父目录之间的对应关系,由此可知,要在一个指定目录下生成一个文件,除了要创建目标文件本身的MFT记录,还需在其父目录的MFT记录或者其索引分配中建立目标文件的索引。在NTFS系统中,文件索引是一个比较复杂的内容,文件的索引采用了树型结构,这给NTFS系统带来了查找文件速度快的优点,但却给当索引结点增加或减少时,如何维护树的平衡带来了难题。在NTFS系统中,小目录的索引直接存放在目录本身MFT记录的90H属性中,而大目录的索引则需另外开辟新的索引分配区来存放相关的索引。原程序中只考虑了小目录的情况,即将文件的索引直接存放在90H属性中,并不考虑大目录的索引情况。除此之外,NTFS系统对于每一个文件操作都会写入日志文件中,以便一致性检查,但由于这方面的内容尚未研究清楚,本程序中也未涉及这方面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值