图解符号链接和硬链接的区别和i节点的介绍

来源:互联网 发布:r语言编程艺术 pdf 编辑:程序博客网 时间:2024/03/29 01:42
我们先来介绍一些linux文件系统的知识。
我们知道 linux中一个文件具有很多属性,uid,gid,文件大小,访问权限,文件内容block位置等。这些内容是和文件中的实际内容分开放的。
文件的属性是放在叫做 i节点的结构中 ,而文件内容则放在数据块中。
这个 inode(i节点) 和block(数据块)是文件系统一开始就规划好的,并且不会改变(除非你格式化)。


那么这个i 节点和block是怎么来作用的呢。上面说了i节点除了包含文件的一些属性,还有存放文件内容的block的位置。
也就是说文件内容是通过i节点来索引的,就像下图所示






小节一下:
i节点存放的是文件(或目录)的属性,并不存放文件或目录的实际内容(目录的内容就是一般文件或子目录,也就是说一般文件的文件名和子目录名也是存放在block中的)
block快用来存放具体的内容,他通过i节点中的记录来索引。






那么下面我们来说说访问一个文件时的具体流程。
对于一个目录来说,他有一些 权限,大小等属性,他们是放在i节点中的。目录中的目录项名即是
该目录中存放的内容(每个文件或目录都是在一个目录中,那么他们就是我们所说的 目录项。)
,既然他们是目录中存放的内容。从上面我们的介绍,我们应该能知道
 目录项名(即目录中的文件名或目录名)是放在block中的。
 如果我们要访问一个目录中的目录项的内容。那么就可以通过该目录的i节点找到存放该目录名的block块。
那么找到存放该目录名的block后,又怎么获得这个目录项的真正内容呢?通过i节点啊!那i节点在哪我们怎么知道呢?
其实block中同时也记录了i节点编号,就是和目录名放在一起。那么也是说,我在block中找到了和我要找的目录项
的名字相符的block,那么也就找到了i节点编号。然后我们通过这个i节点编号就找到了这个目录项自己的i节点。然后我们就能
通过这个i节点来访问这个目录项的属性和实际内容。


有点晕。废话说多了,我们来看个例子吧:


比如我现在要读/honme/feg/a 这个文件的内容,那么系统是怎么读取他的内容的呢。


1.系统先通过 根目录 / 的挂载点 找到他的inode编号(从下面输出中我们看到是2)
feng@ubuntu:~$ ll -di /
2 drwxr-xr-x 24 root root 4096 Apr  9 01:59 //
我这里 inode 是2


2.找到编号为2的i节点,然后从该i节点中找到 存放 / 目录中目录项名的block,从这些block中找到内容有home的block,然后也就找到了home目录项的inode编号(目录项名,和inode是放在一起的)(262145)
feng@ubuntu:/home$ ll -di /home
262145 drwxr-xr-x 3 root root 4096 Jun 20  2012 /home/


3 找到 编号为262145的i节点,然后从i节点中找到 存放 /home 目录中目录项名的block,从这些block中找到内容有feng的block,然后也就找到了feng目录项的inode编号(312874)
feng@ubuntu:/home$ ll -di /home/feng
312874 drwxr-xr-x 33 feng feng 4096 May 16 01:30 /home/feng/


4 找到编号为 312874这个i节点,然后从i节点中找到存放/home/feng 目录中目录项名的block,从这些block中找到内容有a的block,然后也就找到了a目录项的inode编号(305152)
feng@ubuntu:/home$ ll -di /home/feng/a
305152 -rw-rw-r-- 1 feng feng 0 May 13 05:56 /home/feng/a


5 找到 305152 这个编号的 i节点,然后从后i节点中找到存放 a 文件内容的block.


6 然后将找到的block中的内容读出来

我们用个图来表示上面的过程:





了解了上面这些,硬链接和软连接的细节方面我们就能容易理解了




假设两个用户A和B 分别有自己的工作目录 /home/A 和/home/B
因为一些需要现在A需要访问B拥有的x文件。如果用绝对路径或相对路径访问的话,那么A每次访问
B中X时都 需要 以/home/B/x 或是../B/x 当然你可能觉得这样也可以。但是如果目录层次非常深
那么再用这种方式来访问B中的文件 ,你可能就接受不了了。
linux提供了两种方式来解决这个问题。一种是符号链接。一种是硬链接。


我们先来看一下一个忽略了一些细节的关于符号连接和硬链接的图
矩形为目录,圆形为文件,三角形为内存块


如上图所示。A在自己的目录下建立一个与B下x的同名文件。
符号链接:如图中黄色箭头所示,让B中的x实际上指向A中的x
硬链接:如图中红色箭头所示,他是直接指向B中x的实际内存中的内容。而不通过A中的x


从上图我们很容易看出 符号链接和硬链接的区别:
符号链接可以说的间接访问。他通过A中的x才能访问到内存中x的内容。那么如果 我把B中的x目录项删掉,那么A中的x也就不能在访问到x的内容了。
因为他是同过B中的x来访问的。
那么硬链接就可以说是直接访问。他直接指向A中x在内存中的内容。那么现在就算A中的x目录项被被删掉了。我们任然可以通过B中的x来访问他。


上面的图只是一个忽略了一些细节的概念上的图。如果细究,就要知道他们的inode 和block的组织方式


现在我们来看看硬链接的情况中,inode和block组织方式

我们假设/home/A的 inode 编号为5     /home/B的 inode 编号为6

而 记录 B中x的数据block 分布的 inode编号为7 
那么硬链接的情况如下






那符号链接也就容易理解了。如图


根据上面的两幅图,我们总结一下:

    如果创建 /home/A/x 到/home/B/x的硬链接,那么A中的x目录项的i节点是指向  指向B中x的实际内容的i节点的
    如果创建/home/A/x 到/home/B/x的符号链接,那么A中的x目录项的i节点是指向  指向B中/home/B/x的i节点的
0 0
原创粉丝点击