在读第四章目录和文件的4.14节中,关于目录的i节点描述以及目录的描述,觉得有点纷乱,通过查资料以及自己的理解,写这篇博文。
先把图上来
这两个图,刚开上去有点乱。而且第一感觉分辨不出来什么。我来写一下我对这两个图的认识。
一个磁盘分成一个或者多个分区,就是第一附图第一行的意思。然后,每个分区包含一个文件系统(如图上所说),我们主要分析柱面组(0,n)。没个柱面组前一部分信息不做深究。主要看i节点(i节点数组)和数据块部分(图中所说的)。我们假设成为途中的数据块为数据区(因为数据和目录在用户看来是区分开的,但是对于计算机文件系统来说,都是数据,所以,在概念上总是容易混淆,姑且成为数据区吧,第一部分为inode数组)。
第一部分是i节点数组,存放着所有该柱面组中的inode数据。
一、创建普通文件
其实,当你创建一个文件的时候,按照书中的意思,是先在数据区划分一个数据块(称他为目录块(目录项)),并且为该数据块(目录项)分配一个inode(主要是inode 编号),存放到inode数组中。然后,为该文件分配实际数据块(存放文件内容的),假如需要3个数据块,则为这些数据块分配一个inode(包含inode编号,以及包含该文件的所有数据块的地址列表),将其放入inode数组中,然后再目录块中,存数数据:“inode编号(实际数据存放):文件名"。这样,每次读取文件的时候,过程如下:
文件名----(通过目录项)---->inode编号----(通过inode)----->得到文件的地址(数据块号数组)---->读取文件
当在不更换文件系统的情况下,修改文件名(通常是mv命令),该文件的内容数据并没有发生移动,而是重新建立了一个指向文件inode的心目录项,并解除与旧目录项的连接。
而图中会出现两个目录项连接到一个数据inode,这将增加数据inode的链接数。当连接数不为0时,删除删除文件一次,等于释放了一个链接,而不是物理的从磁盘上删掉该文件。这个涉及到硬链接以及符号链接,一会再讲。
二、创建目录文件
mkdir testdir
上边的命令是在linux/unix中创建一个目录的shell命令。我们还来分析一个柱面区的inode数组和数据区。
当创建一个目录时,仍然是现在数据区分使用一个空数据块,然后对该数据块创建一个inode数组,并且放入到inode数组中。该目录块(目录项)的初始数据如下:
1、本目录目录名和inode编号映射([2549:.],”.“代表本目录在本目录内部的称谓,除了本目录,必须使用testdir代表本目录名)
2、父目录目录名和inode编号映射[1267:..](父目录块的inode编号,”..“代表父目录)
这就是为什么在shell中,输入 cd ..可以返回到上一层目录的缘故。
任何一个叶目录项,的连接数总是2。而非叶目录的链接数至少为3(至少包含一个目录)。父目录的每一个子目录,都会让父目录的链接数加一。
以上是文件和目录的inode的认识。
三、硬链接和软连接
这里参考的文章连接:http://blog.csdn.net/feiyinzilgd/article/details/5609157
你会发现上图中,目录项A和目录项B的i节点指向同一个存储区,其中这个存储区存放的是printf("ha")的数据。
也就是意味着helloA.c和helloB.c的内容是一样的。而helloC.c创建了一个符号链接,只是相当于建立了一个引用,引用了目录项B,而没有创建自己的目录项去指向源文件的inode节点,所以,源文件的inode的链接数没有把HelloC.c算在内,所以,一旦目录项B删除,则符号链接就会失效。
硬链接、符号链接的概念
硬链接 ln -d
符号链接 ln -s。
helloA.c和helloB.c 的关系使用如下命令:
这样,就建立了helloA.c到helloB.c的硬链接
该链接属于硬链接,如果删掉源文件helloA.c(实际是删除helloA所对应的目录项),那么磁盘上数据文件时不会删除的。因为源文件的i节点上记录了该文件的硬链接数。只有硬链接数是0的时候(即同时删除helloA和helloB),删除文件名的时候,该数据在磁盘上才会删除。
例如,我们使用命令:
helloB.c同样可以正常使用,其内容就是printf("ha");
使用如下的命令:
我们就创建了符号链接,符号链接其实是被链接文件的目录项的引用。
当源文件helloB.c删除之后,其实删除的是helloB的目录项,其实际磁盘数据文件还在,但helloC.c无法使用。
符号链接包含了一个文件名的路劲,如果这个文件名被删除,这符号链接自然就不能正常工作了。
PS:本人水平有限,理解能力也有限,所提的观点仅供参考