免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 807 | 回复: 0
打印 上一主题 下一主题

Linux硬/软链接详解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-09 14:12 |只看该作者 |倒序浏览

                首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。


链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。


一、硬链接

硬链接说白了是一个指针,指向文件索引节点,系统并不为它重新分配inode。可以用:ln命令来建立硬链接。语法:
ln [options] existingfile newfile
ln[options] existingfile-list directory

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

下面举一些例子:
$ ls –il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 1 longcheng longcheng 57 8月 5 16:40 file2
$ ln file2 file2hard
$ ls –il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard

注意在创建链接前,file2显示的链接数目为1,创建链接后(1)file2和file2hard的链接数目都变为2;(2) file2和file2hard在inode号是一样的(3) file2和file2hard显示的文件大小也是一样。可见进行了ln命令的操作结果:file1和file1hard是同一个文件的两个名字,它们具有同样的索引节点号和文件属性,建立文件file2的硬链接,就是为file2的文件索引节点在当前目录上建立一个新指针。如下图,你可以删除其中任何一个,如rm file2 ,每次只会删除一个指针, 链接数同时减一,只有将所有指向文件内容的指针,也即链接数减为0时,内核才会把文件内容从磁盘上删除。当前目录逻辑结构:(不好意思图没有显示出来)。 还可以在不同目录,但同一文件系统中建立文件的硬链接。设file1、file2在目录/home/longcheng/dir1中,下面的命令在/home/longcheng中建立file2的硬链接。
ln file2 /home/longcheng/file2hard

下面的程序,是将dir1目录中所有文件,在目录dir2中建立硬链接
$mkdir dir2
$ln /home/longcheng/dir1/* /home/longcheng/dir2

如果使用了 ln –f existingfile newfile,如果newfile已经存在,则无论原来newfile是什么文件,只用当前用户对它有写权限,newfile就成为exisitngfile的硬链接文件。

尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一下不足之处:
(1)不可以在不同文件系统的文件间建立链接
(2)只有超级用户才可以为目录创建硬链接。虽然很多树上说root用户可以创建,但是笔者在学习过程中发现即使是root用户也不能创建,我的系统是Redhat,内核2.4、2.6都试过,在其他系统中不知道是不是可以。
二、软链接(符号链接)

软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
建立软链接,只要在ln后面加上选项 –s,下面举个例子
$ ls -il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
$ln –s file1 file1soft
$ls -il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
13061 lrwxrwxrwx 1 longcheng longcheng 5 8月 5 16:58 file1soft->file1

从上面链接后的结果可以看出来软链接与硬链接,区别不仅仅是在概念上,在实现上也是不同的。区别:硬链接原文件&链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件&链接文件拥有不同的inode号,表明他们是两个不同的文件;在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;链接数目是不一样的,软链接的链接数目不会增加;文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的,这用强调,因为是等同的嘛,而这里软链接显示的大小与原文件就不同了,file1大小是48B,而file1soft是5B,这里面的5实际上就是“file1”的大小。


总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。 在不同系统之间建立软链接、对目录建立链接,这里就不举例了,读者可以自己去尝试,我也是在不断实践中学习的。 当然软链接也有硬链接没有的缺点,因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了~~,而硬链接就没有这个缺陷,你想怎么移就怎么移(呵呵);还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。


补充一下:可以通过symlink来查看链接文件,可以用 man symlink来学习。

-----------------------------------------------------------------------------------

深入理解硬链接和软链接
    UNIX和Linux都提供了链接命令ln。顾名思义,ln是将两个文件名(此说法不大准确)彼此链接起来,使得用户无论使用哪一个文件名都可访问到同一文件。这是我们用ln命令所要达到的目的,但是从技术上讲,只有软链接是链接两个文件名,硬链接不在此列之中。要透彻理解链接的含义,就必须要分清文件与文件名的区别。而要区分文件与文件名,我们就得知道文件系统如何管理文件。看似很普通的命令,其技术背景却一点儿也不简单。
    文件系统如何管理文件涉及范围太大,不可能也不必要在此全部叙述,但我们只需知道以下技术要点即可。在Linux中,文件的外延很大,我们常识中的“文件”(例如一篇文档等)是文件, 目录、设备等也都是文件。这些文件种类繁多,数量巨大,万一重名怎么办,文件系统是如何区分并管理它们的呢?限制重名?这当然不行!我们来看看Linux是如何做的。原来Linux的文件系统为每一个文件分配了一个我们称为索引节点(Inode)的数据结构,在这个索引节点内有一个全系统独一无二的索引节点号,文件系统正是靠这个索引节点号来识别一个文件。另外文件系统用来管理文件的所有信息都包含在索引节点之中。
    好了,给每个文件分配一个唯一的number,文件系统就知道某个文件究竟是张三的文件还是李四的文件。但是文件的真正使用者——我们人类也要用该number去识别文件吗?呵呵,若此为真,不知是人玩电脑还是电脑玩人罗。因此我们要用我们的方式去区分各个文件,给每一个文件起一好听易记的名字,同一地点(即同一目录)不能有两个名字一样的文件。地点若不同,允许重名。至此,人类有人类识别文件的方法,电脑(文件系统)有电脑的做法,喔喔,问题又来了,二者是要“水火不容”呢,还是“沟通无限”呢?这还用问,当然是后者啦。
    OK,既然要“沟通”,“链接”自然而然就提出来了。绕了个大圈,终于得以言归正传,有了上述的背景知识,不管是硬链接还是软链接对于我们来说已是板上鱼肉。所谓硬链接(hard link, 也称链接[1])就是一个文件的一个或多个文件名。再说白点,所谓链接无非是把我们人类使用的文件名和电脑(文件系统)使用的节点号链接起来。因此我们可以用多个文件名与同一个文件进行链接,这些文件名可以在同一目录或不同目录。一个文件有几个文件名(用ln命令实现多个文件名),我们就说该文件的链接数为几。由定义可知,此链接数可以是1, 这表明该文件只有一个文件名。
    需要特别指出的是,在info ln的帮助信息中所说的硬链接与我的理解是有差别的,先看info是如何讲硬链接。“A "hard link" is another name for an existing file; the link and the original are indistinguishable.”(一个“硬链接”是一个现有文件的别名;链接文件与被链接文件是无法区别的。)哇喔,好象乱套了,谁对谁错?谁都没错,二者角度不同。Info是就ln命令而论的“硬链接”,注意了,info中的硬链接也是打了双引号的,我估计此有特殊含义。“链接文件与被链接文件是无法区别的”,没错,因为它们都指向同一个索引节点嘛。现在我与info主要差别在于,我认同而info不认同以下观点:对于一个拥有文件名的文件,在没有用过ln命令的情况下,该文件仍存在硬链接,且链接数为1。理论需要实践来证明,在Linux中用ls –l命令获得该目录下文件的详细信息,格式如下:
-rwxr-xr-x              1       root        root        1024       Apr 30 17:06       filename
上述格式中黑体加下划线的“1”代表文件名filename的文件的链接数为1。做个实验,在同一目录(不同目录也行)使用ln命令:
       ln filename filename2
然后再使用ls –l命令,会得到下面的信息:
-rwxr-xr-x              2       root        root        1024       Apr 30 17:06       filename
-rwxr-xr-x              2       root        root        1024       Apr 30 17:06       filename2
   很明显,原来文件名为filename的文件现在拥有了两个文件名,链接数变为2, 除此之外其它一切信息都没变,所以说“链接文件与被链接文件是无法区别的”。下面的事实让我怀疑有没有必要用ln产生新的硬链接:无论使用任一文件名对文件的任何改动,该文件的所有直接或间接[2]链接文件都会随之而改变,最后所有信息都保持一致。
   将文件名与索引节点分开,然后采用硬链接的技术使得管理文件变得更方便,效率更高。例如重命名,进程并不需要打开该文件,只需改动某个目录项的内容即可。还有删除一个文件也是如此,将相应的目录项删除,该文件的链接数减1,如果删除目录项后该文件的链接数为零,这时系统才把真正的文件从磁盘上删除。

认识了硬链接究竟是怎么一回事,理解硬链接的两个限制就容易多了。
1、不允许给目录创建硬链接;
2、只有在同一文件系统中的文件之间才能创建链接。
篇幅关系,不再赘述。

    为了克服以上限制,引入符号链接(symbolic link,也称软链接)。符号链接实际上是一种特殊的文件类型,这种文件包含了另一个文件的任意一个路径名。这个路径名指向位于任意一个文件系统的任意文件,甚至可以指向一个不存在的文件。系统会自动把对符号链接的大部分操作(如读、写等)变为对源文件的操作,但某些操作(如删除等)就会直接在符号链接上完成。在ln中加选项-s便产生一个文件的符号链接。

               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/27493/showart_212553.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP