首先是名字上的区别,硬连接:hard link,软连接:symbolic link
再分别叙述:
首先是hard link,大家都知道cp的用法,即cp oldfile newfile,这样一来就比较浪费空间,假设oldfile有600M,拷贝出来的newfile(也即 oldfile的副本)也同样要占距600M的空间,这对于我的LINUX系统来说简直就是噩梦,居然两个文件就站了1G多!有没有一种方法能够即节省空间又能相互连接呢?答案是有的,大家回想一下自个儿在WINDOWS下有没有类似的解决方法?对了,就是建立快捷方式嘛!hard link就是相 当于建立一个文件的快捷方式,还是迷茫?
呵呵,举个例子吧:
假设用户romeo在/tmp的目录下有个文件love,此时给love文件设置权限为:"rw-r-r",恰好系统内另一名用户juliet也要用这个文件,那么她就 只需建立一个到/tmp/love的link即可:
[juliet@redhat9 juliet]$ ln /tmp/love JulietLink
这样就在用户juliet的目录下(/home/juliet)建立了一个hard link,其文件名为:JulietLink,这时执行:
$ ls -l /home/juliet
发现如下信息:
-rw-r--r-- 2 romeo romeo 5096 ....... JulietLink
可以得知文件的链接数是:2,表明该文件除了本身外还有另一个副本.如果再切换一个用户对这个文件进行链接,则链接数继续增加.同时发现建立链接后文件的属主和属组仍是:romeo
接下来查看链接文件和原文件的索引节点编号:
$ ls -s JulietLink
24340 JulietLink
$ ls -s /tmp/love
24340 /tmo/love
可知,这两个文件的索引节点编号是一致的,如果用复制而不是链接的话,就会产生两个不相干文件,各自拥有不同的索引节点编号:
$ cp /tmp/love JulietLink
$ ls -l JulietLink
37027 JulietLink
正如你发现的:37027!=243430
最后,我们来看一下symbolic link:
其用命令ln -s创建:
$ln -s /tmp/love SysLink
再:$ls -l /home/juliet
lrwxrwxrwx 1 juliet juliet ...... SysLink->love
由首项"l"发现这是一个链接文件,由"1"得知love和SysLink的链接数没有改变,(想想为什么 ) 由权限"rwxrwxrwx"知道文件的真正权限要以所指文件为准,软链接本身不做任何限制。软链接本身不保存文件的数据,其真正内容是指向原来的文件,如果将文件love删除或改名,则SysLink会指向一个不存在的文件,其内容变成空白;但是它会占用一个索引节点,并拥有自己的索引节点编号,不信你试试:
$ls -i SysLink
其显示的索引节点编号一定不同于love的索引节点编号
总结:
hard link所创建的文件和原文件的索引节点编号相同,相当于一个原文件有多个别名。
symbolic link所创建的链接和原文件的索引节点编号不同,相当于指向原文件的位置。
PS:hard link 和 symbolic link创建后均可以用rm命令删除。
简单的说:
硬连接是给文件一个副本,同时建立两者之间的连接关系。修改其中一个,与其连接的文件同时被修改。如果删除其中任意一个其余的文件将不受影响。
软连接也叫符号连接,他只是对源文件在新的位置建立一个“快捷(借用一下wondows常用词)”,所以,当源文件删除时,符号连接的文件将成为无源之水->仅仅剩下个文件名了,当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。
软连接与windows下的快捷方式类似。
至于硬连接,举个例子说吧,你把dir1/file1硬连接到dir2/file2,就是在dir2下建立一个dir1/file1的镜像文件file2,它与file1是占用一样大的空间的,并且改动两者中的一个,另一个也会发生同样的改动。
首先要弄清楚,在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
注意在创建链接前,file1 显示的链接数目为1,创建链接后(1)file1和file1hard的链接数目都变为2(2) file1和file1hard在inode号是一样的(3) file1和file1hard显示的文件大小也是一样。可见进行了ln命令的 *** 作结果:file1和file1hard是同一个文件的两个名字,它们具有同样的索引节点号和文件属性,建立文件file1的硬链接,就是为file1的文件索引节点在当前目录上建立一个新指针。如下图,你可以删除其中任何一个,如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都试过,在其他系统中不知道是不是可以。
二、软链接(符号链接)
符号链接是对一个文件的间接指针。硬链接直接指向文件的i节点。
软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
建立软链接,只要在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来学习。
硬链接就是同一个文件使用了多个别名(他们有共同的 inode)。硬链接可由命令 link 或 ln 创建,如:
link oldfile newfile
ln oldfile newfile
由于硬链接是有着相同 inode 号仅文件名不同的文件,因此,删除一个硬链接文件并不影响其他有相同 inode 号的文件。
硬链接不能对目录进行创建,只可对文件创建。
软链接(也叫符号链接)与硬链接不同,文件用户数据块中存放的内容是另一文件的路径名的指向。软链接就是一个普通文件,只是数据块内容有点特殊。
软链接可对文件或目录创建。
ln -s old.file soft.link
ln -s old.dir soft.link.dir
加-s选项表示创建的是软链接。
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接就变成了死链接。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)