来自http://blog.csdn.net/u012243115/article/details/41983509
硬链接与软链接是 Linux 文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称 inode),而索引节点对象是 Linux 虚拟文件系统 (VFS) 的四个基本概念之一。通过剖析硬链接与软链接的联系与区别,我们可更好的了解 Linux 中 VFS 这一通用文件模型。并让 Linux 普通用户和系统管理员正确使用硬链接与软链接,帮助文件系统开发者获取 inode 的相关知识。
我们知道文件都有文件名与数据,这在Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
如下图所示通过文件名访问文件
链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。
(1)file1和file1hard的链接数目都变为2;
(2) file1和file1hard在inode号是一样的
(3) file1和file1hard显示的文件大小也是一样。
可见进行了ln命令的操作结果:file1和file1hard是同一个文件的两个名字,它们具有同样的索引节点号和文件属性,建立文件file1的硬链接,就是为file1的文件索引节点在当前目录上建立一个新指针。 链接数同时减一,只有将所有指向文件内容的指针,也即链接数减为0时,内核才会把文件内容从磁盘上删除。 还可以在不同目录,但同一文件系统中建立文件的硬链接。设file1、file2在目录/root/apue/12/test中,下面的命令,在/root/apue/12/test2中建立file2的硬链接。
[cpp] view plain copy [root@localhost test2]# ln/root/apue/12/test/file2 file2hard [root@localhost test2]# ll -i 总计 4 1848717 -rw-r--r-- 2 root root 320 01-0717:09 file2hard
下面的程序,是将/root/apue/12/test目录中所有文件,在目录/root/apue/12/test2中建立硬链接
[cpp] view plain copy [root@localhost test2]# ln/root/apue/12/test/* . [root@localhost test2]# ll -i 总计 16 1848715 -rw-r--r-- 4 root root 759 01-0717:09 file1 1848715 -rw-r--r-- 4 root root 759 01-0717:09 file1hard 1848717 -rw-r--r-- 3 root root 320 01-0717:09 file2 1848717 -rw-r--r-- 3 root root 320 01-0717:09 file2hard 如果使用了 ln –f existingfile newfile,如果newfile已经存在,则无论原来newfile是什么文件,只要当前用户对它有写权限,newfile就成为exisitngfile的硬链接文件。尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一下不足之处:
(1)不可以在不同文件系统的文件间建立链接 (2)不能为目录创建硬链接,硬链接不能对目录创建是受限于文件系统的设计。
总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。 当然软链接也有硬链接没有的缺点,因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了。
简而言之,软链接相当于windows中的快捷方式,硬链接相当于一个灾备系统,数据存放在两处,与复制不同的是两处之间存在同步机制,一处数据的改变会实时同步到另一处,另外,一处数据如果被删除了,不会影响到另一处的数据。
