http://www.linuxsir.org/main/?q=node/196
在Unix世界里有两个’link’(链接)概念,一般称之为硬链接和软链接。
在学习link之前,先了解一下inode和block的概念。inode 译成中文就是索引节点。每个存储设备或存储设备的分区(存储设备是硬盘、软盘、U盘 ... ... )被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件的类型和权限属性,属主,属组,文件大小,修改日期等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据inode值能最快的找到相对应的文件。
用ls可以查看文件的inode值
代码: 全选
$ touch goodluck
$ ls -li
32908 -rw-r--r-- 1 ubuntu ubuntu 0 2007-01-12 00:20 goodluck
硬链接
一个硬链接仅仅是一个文件名。(一个文件可以有好几个文件名,只有将 最后一个文件名从磁盘上删除,才能把这个文件删掉。文件名的个数是由 ls(1)来确定的。所有的文件名都处于同一个状态,也就没有什么源名字 之说。通常文件系统里的一个文件的所有名字包含着一样的数据信息,不 过这样也不是必需的。)
在Linux 文件系统中,inode值相同的文件是硬链接文件,也就是说,不同的文件名,inode可能是相同的,一个inode值可以对应多个文件。
代码: 全选
$ ls -li
32908 -rw-r--r-- 1 ubuntu ubuntu 0 2007-01-12 00:20 goodluck
$ ln goodluck goodluck1
$ ls -li
32908 -rw-r--r-- 2 ubuntu ubuntu 0 2007-01-12 00:20 goodluck
32908 -rw-r--r-- 2 ubuntu ubuntu 0 2007-01-12 00:20 goodluck1
代码: 全选
$ echo 'hello world!'>goodluck
$ cat goodluck1
hello world!
$ ls -li
35159 -rw-r--r-- 2 ubuntu ubuntu 13 2007-01-12 14:06 goodluck
35159 -rw-r--r-- 2 ubuntu ubuntu 13 2007-01-12 14:06 goodluck1
代码: 全选
$ rm goodluck1
$ ls -li
35159 -rw-r--r-- 1 ubuntu ubuntu 13 2007-01-12 14:06 goodluck
另外注意:硬链接不可以跨文件系统,而且只可以对文件做链接,不可以对目录做链接。
软链接
软链接(也叫符号链接)是 一个包含了路径信息的小小的指定文件。因此,软链接可以指向不同文件系统里的文件(比如由NFS装载的不同机器文件系统上的文件),甚至可以 指向一个不一定确实存在的文件。在软链接文件被访问(系统调用open(2) 或stat(2))的时 候, 操 作 系 统 用 该 文件所包含的路径替换该文件的访问介 入点,从而实现对所指文件的访问。(用命令rm(1)和unlink(2)可以删除 链接,但不是删除该文件所指向的文件。系统指定调用lstat(2)和readlink(2) 来读取链接文件与其所指文件的状态。到底是对软链接文件操作,还是对被 指向文件操作,由于不同操作系统件存在不同的系统调用,而存在着差异。)
代码: 全选
$ touch goodluck
$ ln -s goodluck goodluck2
$ ls -li
36277 -rw-r--r-- 1 ubuntu ubuntu 0 2007-01-12 14:06 goodluck
36279 lrwxrwxrwx 1 ubuntu ubuntu 8 2007-01-12 14:26 goodluck2 -> goodluck
当符号链接文件发生改变时,源文件也会跟着改变,但是如果源文件被删除了,符号链接也就不存在意义了,也就是所谓的断链。
代码: 全选
$ echo 'hello world!'>goodluck2
$ cat goodluck
hello world!
$ ls -l
-rw-r--r-- 1 ubuntu ubuntu 13 2007-01-12 14:39 goodluck
lrwxrwxrwx 1 ubuntu ubuntu 8 2007-01-12 14:38 goodluck2 -> goodluck
$ rm goodluck
$ cat goodluck2
cat: goodluck2: No such file or directory
lrwxrwxrwx 1 ubuntu ubuntu 8 2007-01-12 14:38 goodluck2 -> goodluck
注意:符号链接不仅可以对文件做链接,同样也适用于目录。要特别注意,对目录做符号链接跟对文件做符号链接有一点不同,当把符号链接目录中的文件删除了,也就是把源文件给删除了。而对于文件做的符号链接,删除符号链接文件并不会对源文件有任何影响。
代码: 全选
$ mkdir goodluck
$ cd ./goodluck
$ touch goodluck1 goodluck2
$ cd ..
$ln -s ./goodluck/ ./luckgood
$ ls -li
36562 drwxr-xr-x 2 ubuntu ubuntu 4096 2007-01-12 14:52 goodluck
36657 lrwxrwxrwx 1 ubuntu ubuntu 11 2007-01-12 14:54 luckgood -> ./goodluc
$ rm ./luckgood/goodluck1
$cd ./goodluck
$ls -l
goodluck2