Linux 软硬链接对比

来源:互联网 发布:js获取文本框输入的值 编辑:程序博客网 时间:2024/04/27 20:59

http://blog.csdn.net/zsuguangh/article/details/6452838

linux系统下提供ln指令来进行文件链接。文件链接主要分为硬链接和软链接。

硬链接
由于linux下的文件是通过索引节点(inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配inode。每添加一个一个硬链接,文件的链接数就加1。

备注:inode :它是UNIX内部用于描述文件特性的数据结构。我们通常称inode为文件索引结点INDEX NODE(信息结点)。inode含有关于文件的大部分的重要信息,包括文件数据块在磁盘上的地址。每一个inode有它自己的标志号,我们称为文件顺序号。inode包含的信息 1.文件类型 2.文件属主关系 3.文件的访问权限 4.文件的时间戳。

 

可以用:ln命令来建立硬链接。语法:
ln [options] existingfile newfile
ln[options] existingfile-list directory
用法: 第一种:为”existingfile”创建硬链接,文件名为”newfile”。第二种:在”directory”目录中,为 ”existingfile-list”中包含的所有文件创建一个同名的硬链接。常用可选[options] –f 无论”newfile”存在与否,都创建链接。-n 如果”newfile”已存在,就不创建链接。

 

例子:
$ ls -il
393250 -rw-r--r-- 1 root root 6 2011-05-29 10:27 test1
使用ln -d 为test 创建一个硬链接 test2
$ ln -d test1 test2
$ ls -il
393250 -rw-r--r-- 2 root root 6 2011-05-29 10:27 test1
393250 -rw-r--r-- 2 root root 6 2011-05-29 10:27 test2
由上面结果可得test1跟test2都指向inode393250,但是计数(第3列)由1变成2。实际上可以说test1跟test2是同一个文件的两个名字,它们具有相同的索引号。对test1做修改即是对test2修改。如:
$ cat test1
hello
$ cat test2
hello
修改test1后,得
$ cat test1
hello world
$ cat test2
hello world
删除文件的时候,每次指向inode的链接数会减1,当链接数为0的时候,内核才会把文件的内容从磁盘删除掉。删除原来的文件test1,有
$ rm test1
$ cat test2
hello world
$ ls -il
393250 -rw-r--r-- 1 root root 6 2011-05-29 10:27 test2
这时候再重新建一个test1,但是其与test2没有任何关联,test1跟test2是两个独立的文件,因为它们的inode不一样
$ touch test1
ls -il
393298 -rw-r--r-- 1 root root 0 2011-05-29 10:39 test1
393250 -rw-r--r-- 1 root root 6 2011-05-29 10:27 test2
$ cat test1
test1
$ cat test2
hello world

 

不足:
尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一下不足之处:(1)不可以在不同文件系统的文件间建立链接(2)只有超级用户才可以创建硬链接(3)不能给目录创建硬链接。此处的原因在文章的最后探讨

 

软链接(符号链接)
软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建符号链接并且可以为目录创建符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。

 

如果给ln命令加上- s选项,则建立软链接。如果[链接名]已经存在但不是目录,将不做链接。[链接名]可以是任何一个文件名(可包含路径),也可以是一个目录,并且允许它与 “目标”不在同一个文件系统中。如果[链接名]是一个已经存在的目录,系统将在该目录下建立一个或多个与“目标”同名的文件,此新建的文件实际上是指向原 “目标”的符号链接文件。

 

例子:
$ ls -il
393298 -rw-r--r-- 1 root root 0 2011-05-29 10:39 test1
393250 -rw-r--r-- 1 root root 6 2011-05-29 10:27 test2
$ ln -s test1 test3
$ ls -il
393298 -rw-r--r-- 1 root root  6 2011-05-29 10:40 test1
393250 -rw-r--r-- 1 root root 12 2011-05-29 10:40 test2
393432 lrwxrwxrwx 1 root root  5 2011-05-29 10:53 test3 -> test1
虽然创建了test1的软链接test3,但与硬链接不同的是test3与test1不共用一个inode,它们有不同的inode
$ cat test3
test1
修改test3后
$ cat test3
test1 test3
$ cat test1
test1 test3
软链接实际上可以理解为文件名称的指针,当源文件test1改名或者被删除后,test3将访问不了
$ mv test1 test
$ cat test3
cat: test3: No such file or directory
软链接的一个特点是可以对一个不存在的文件进行链接,如上面的test3,当软链接指向的文件名存在的时候才可以再次访问test3,哪怕新创建的test1已不是原来的test1,因为软练级是指向文件名称的
$ ls -il
393298 -rw-r--r-- 1 root root 12 2011-05-29 11:02 test
393444 -rw-r--r-- 1 root root 11 2011-05-29 11:11 test1
393250 -rw-r--r-- 1 root root 12 2011-05-29 10:40 test2
393432 lrwxrwxrwx 1 root root  5 2011-05-29 10:53 test3 -> test1
$ cat test3
test112233
软链接可以对目录进行链接
$ mkdir ggh
$ touch ggh/ggh.txt
$ ls ggh
ggh.txt
$ ln -s ggh ggh.link
$ ls -il
393449 drwxr-xr-x 2 root root 4096 2011-05-29 11:16 ggh
393487 lrwxrwxrwx 1 root root    3 2011-05-29 11:17 ggh.link -> ggh
393298 -rw-r--r-- 1 root root   12 2011-05-29 11:02 test
393444 -rw-r--r-- 1 root root   11 2011-05-29 11:11 test1
393250 -rw-r--r-- 1 root root   12 2011-05-29 10:40 test2
393432 lrwxrwxrwx 1 root root    5 2011-05-29 10:53 test3 -> test1
$ ls ggh.link
ggh.txt

 

不足:
因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径

 

总结(软硬链接对比)
(1)软链接可以跨文件系统 ,硬链接不可以。实践的方法就是用共享文件把windows下的 aa.txt文本文档链接到linux下/root目录 下 bb,cc . ln -s aa.txt /root/bb 链接成功 。ln aa.txt /root/bb 失败 。
(2)关于 inode的问题 。硬链接不管有多少个,都指向的是同一个inode,会把inode链接数增加 ,只要inode的链接数不是 0,文件就一直存在,不管你删除的是源文件还是链接的文件。只要有一个存在,文件就存在(其实也不分什么 源文件链接文件的,因为他们指向都是同一个 inode)。 当你修改源文件或者链接文件任何一个的时候 ,其他的文件都会做同步的修改。软链接不直接使用inode号作为文件指针,而是使用文件路径名作为指针(软链接跟源文件的inode不一样)。所以删除链接文件对源文件无影响,但是删除源文件,链接文件就会找不到要指向的文件 。软链接有自己的inode,并在磁盘上有一小片空间存放路径名.
(3)软链接可以对一个不存在的文件名进行链接 。
(4)软链接可以对目录进行链接。

 

关于硬连接不能跨越文件系统的原因:
不同的文件系统可能具有相同的inode号,假设可以在A系统中创建B系统的硬连接,例如B系统的文件Bb的硬连接Ab,则它们理论上应该具有相同的inode号(如111111),但是此时A系统本来就可能存在inode号为111111的文件,那此时想访问inode号为111111的文件的时候,内核就不能判断是访问A系统还是B系统的文件

关于硬连接不能链接到目录的原因:
系统在遍历文件夹的时候,假设可以创建目录的硬链接,则因为系统不能识别出该硬连接是链接还是文件本身,因此会无穷递归下去。而软链接可以被系统识别出,因为不会产生无穷递归。


0 0
原创粉丝点击