转自:http://www.cnblogs.com/yfanqiu/archive/2012/06/11/2545556.htmlhtml
Linux 系统中有软连接和硬连接两种特殊的“文件”。node
软连接能够看做是Windows中的快捷方式,可让你快速连接到目标档案或目录。linux
硬连接则透过文件系统的inode来产生新档名,而不是产生新档案。网络
建立方法都很简单:3d
inode指针
要解释清楚二者的区别和联系须要先说清楚 linux 文件系统中的 inode 这个东西。当划分磁盘分区并格式化的时候,整个分区会被划分为两个部分,即inode区和data block(实际数据放置在数据区域中)这个inode便是(目录、档案)文件在一个文件系统中的惟一标识,须要访问这个文件的时候必须先找到并读取这个文件的 inode。 Inode 里面存储了文件的不少重要参数,其中惟一标识称做 Inumber, 其余信息还有建立时间(ctime)、修改时间(mtime) 、文件大小、属主、归属的用户组、读写权限、数据所在block号等信息。htm
一般会根据分区的用途来安排inode的数量(这是另一个话题了),好比文件数量不少而文件都很小,则须要调增inode较大,以便能索引所有文件。不然将会出现这个分区并无写满而没法写入任何文件的状况。blog
目录文件与档案文件索引
目录文件:记录该目录下的文件名get
档案文件:记录实际文件数据
inode自己并不记录文件名,文件名记录在目录文件的block当中,因此新增、删除、更改文件名与目录的W权限有关。所以当咱们要读某个档案时,就务必通过其目录的inode和block,而后才可以找到待读取档案的inode号,最终才会读到正确的档案block内的数据。系统是经过索引节点(而不是文件名)来定位每个文件。
目录inode(知足权限?) => 目录block => 档案inode(知足权限?) => 档案block
硬连接
多个档名对应同一个inode,硬连接只是在某个目录下新增一笔档名连接到某个inode号码的关联记录而已。若是将上图中任何一个档名删除,档案的inode与block都还存在,依然还能够经过另外一个档名来读取正确的档案数据。此外,不论用哪个档名来编辑,最终的结果都会写入相同的inode和block中,所以均能进行数据的修改。
软链接
软链接就是创建一个独立的文件,而这个文件会让数据的读取指向它link的那个档案的档名,因为只是做为指向的动做,因此当来源档案被删除以后,软链接的档案没法开启,由于找不到原始档名。连结档的内容只有档名,根据档名连接到正确的目录进一步取得目标档案的inode,最终就可以读取到正确的数据。若是目标档案的原始档名被删除了那么整个环节就进行不下去了。
下面用一个实例来讲明硬连接和软连接。
如今目录下有两个文件,一个名为AAA,一个名为BBB。
引用
$ ls -il
963922 -rw-r--r-- 1 ocean ocean 92 2007-05-18 15:46 AAA
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
首先先作一个AAA的硬连接。
引用
$ ln AAA AAAhard
$ls -il
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
这里咱们注意在建立连接前,AAA显示的连接数目为1,建立连接后
1.AAA和AAAhard的连接数目都变为2。
2.AAA和AAAhard的inode号是同样的,都是963922。
3.AAA和AAAhard显示的文件大小也是同样,都是92B。
可见进行了ln命令的操做结果:AAA和AAAhard是同一个文件的两个名字,它们具备一样的索引节点号和文件属性,创建文件AAA的硬连接,就是为 AAA的文件索引节点在当前目录上创建一个新指针。你能够删除其中任何一个,如rm AAA,每次只会删除一个指针,连接数同时减一,只有将全部指向文件内容的指针,也即连接数减为0时,内核才会把文件内容从磁盘上删除。
尽管硬连接节省空间,也是Linux系统整合文件系统的传统方式,可是存在一些不足之处:
1.不容许给目录建立硬连接。
2.不能够在不一样文件系统的文件间创建连接。由于 inode 是这个文件在当前分区中的索引值,是相对于这个分区的,固然不能跨越文件系统了。
接着咱们作一个指向BBB的软连接,软连接克服了硬连接的不足,没有任何文件系统的限制,任何用户能够建立指向目录的符号连接。于是如今更为普遍使用,它具备更大的灵活性,甚至能够跨越不一样机器、不一样网络对文件进行连接。
引用
$ ln -s BBB BBBsoft
$ ls -il
总用量 0
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
963924 lrwxrwxrwx 1 ocean ocean 3 2007-05-18 15:47 BBBsoft -> BBB
从上面连接后的结果能够看出来软连接与硬连接,区别不只仅是在概念上,在实现上也是彻底不一样的。
区别:
1.硬连接原文件/连接文件公用一个inode号,说明他们是同一个文件,而软连接原文件/连接文件拥有不一样的inode号,代表他们是两个不一样的文件;
2.在文件属性上软连接明确写出了是连接文件,而硬连接没有写出来,由于在本质上硬连接文件和原文件是彻底平等关系;
3.连接数目是不同的,软连接的连接数目不会增长;
4.文件大小是不同的,硬连接文件显示的大小是跟原文件是同样的。而这里软连接显示的大小与原文件就不一样了,BBB大小是95B,而BBBsoft是3B。由于BBB共有3个字符
5.软连接没有任何文件系统的限制,任何用户能够建立指向目录的符号连接
总之,创建软连接就是创建了一个新文件。当访问连接文件时,系统就会发现他是个连接文件,它读取连接文件找到真正要访问的文件。
固然软连接也有硬连接没有的缺点:由于连接文件包含有原文件的路径信息,因此当原文件从一个目录下移到其余目录中,再访问连接文件,系统就找不到了,而硬连接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于创建新的索引节点和保存原文件的路径。