不能理解软链接。和硬链接到底什么区别

发表于:2007-07-04来源:作者:点击数: 标签:
如题。望指点,谢谢 阿旺 回复于:2004-12-07 09:02:43 打个比方吧,假设一个文件为A,B是它的一个软链接,C是它的一个硬链接,那么如果你删除B,则对A没有什么影响,但如果你删除了C,则文件A也删除了.不知道这样的解释能不能让你满意.:) hdqqq 回复于:2004-12-07

如题。望指点,谢谢

 阿旺 回复于:2004-12-07 09:02:43
打个比方吧,假设一个文件为A,B是它的一个软链接,C是它的一个硬链接,那么如果你删除B,则对A没有什么影响,但如果你删除了C,则文件A也删除了.不知道这样的解释能不能让你满意.:)

 hdqqq 回复于:2004-12-07 09:06:02
c. tks!!!

 hdqqq 回复于:2004-12-07 09:08:45
不知道这样理解对不对:软链接是通过字符的间接链接而硬链接是直接连接??

 Linux@初学者 回复于:2004-12-07 09:28:57
软:相当于MS下的快捷方式,不占用INODE
硬:相当于一个文件的考贝!占用INODE

 Linux@初学者 回复于:2004-12-07 09:32:19
[quote:8aa149d7f5="阿旺"]打个比方吧,假设一个文件为A,B是它的一个软链接,C是它的一个硬链接,那么如果你删除B,则对A没有什么影响,[color=red:8aa149d7f5]但如果你删除了C,则文件A也删除了[/color:8aa149d7f5].不知道这样的解释能不能让你满意.:)[/quote:8aa149d7f5]

红色部分不正确
你删除一个硬连接并不会使原文件删除

如果你删除了原文件,软连接会提示原文件丢失!

 hdqqq 回复于:2004-12-07 09:36:53
硬:相当于一个文件的考贝!
多出一个副本???????????????????
如果你删除了原文件,软连接会提示原文件丢失!
为什么会有这样的提示??????????

 sakulagi 回复于:2004-12-07 09:55:57
假设有文件src,hl是它的一个hardlink,那么会新建一个文件索引,和src使用同一个i-node,当src被删除之后,仍然可以通过hl来访问文件内容。实际上当hl已经建立了以后,hl和src完全是等同的,你甚至可以说src是hl的一个hardlink。

建立一个src的symbol link,名字是sl,那么sl只是一个特殊的文件,里面记录了src的文件名和路径(具体内容取决于执行ln命令的参数)。sl有自己的i-node。当src被删除的时候,sl就失效了。

 Linux@初学者 回复于:2004-12-07 10:01:19
[quote:bcd1c6f9b9="hdqqq"]硬:相当于一个文件的考贝!
多出一个副本???????????????????
如果你删除了原文件,软连接会提示原文件丢失!
为什么会有这样的提示??????????[/quote:bcd1c6f9b9]

就相当于你在MS下把一个执行文件删除了,当你运行它的快捷方式时,肯定找不到原来的执行文件呀。

 chenzq1604 回复于:2004-12-07 10:10:01
终于搞懂了,谢谢楼上的几位和班班

 tianci3982730 回复于:2004-12-07 10:32:42
诶。好好研究吧。还有别的区别呢

 sakulagi 回复于:2004-12-07 11:21:29
比如hardlink是不可以跨文件系统的。symbollink可以、

 joyaid 回复于:2004-12-07 11:22:10
楼上各位说的都对.

 bluejava 回复于:2004-12-07 13:42:28
K,这么多的知识

 prowoo 回复于:2004-12-07 14:11:38
"K,这么多的知识",看来你是已经服了!!:)

 網中人 回复于:2004-12-07 16:41:27
嗯... 感覺上前面的都沒說得很精確...

我記很久之前, 我在本版討論過這個問題, 
還記得有朋友還找到了 ibm 網站的文件來幫忙說明. 很優秀的!
只是一時間找不回來了...  >_<

或許, 先讀一下如下兩篇(如果連得上的話):
http://phorum.study-area.org/viewtopic.php?t=12235&highlight=hard+link
http://phorum.study-area.org/viewtopic.php?t=17506&highlight=hard+link

 zythuman 回复于:2004-12-07 18:48:19
软连接又叫符号连接是用 ln -s  命令创建的类似windows下的快捷方式
硬链接文件的内容和原文件一样指向同一个索引节点

 sujw 回复于:2004-12-07 19:49:50
软连接相当于windows下的快捷方式,
硬连接就是文件的镜象

 wingger 回复于:2004-12-07 20:14:39
http://bbs.chinaunix.net/forum/viewtopic.php?t=434579&show_type=&postdays=0&postorder=asc&start=30
俺的贴子里有这段,摘抄过来

符号链接 

存在两种不同类型的链接,软链接和硬链接。修改其中一个,硬连接指向的是节点(inode),而软连接指向的是路径(path) 



软链接文件 

  软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己。类似于编程语言中的递归。 

命令格式: 
代码: 
ln [-s] source_path target_path 


硬链接文件 

  info ln 命令告诉您,硬链接是已存在文件的另一个名字,硬连接的命令是 

代码: 
ln -d existfile newfile 


引用: 
硬链接文件有两个限制 

  1、不允许给目录创建硬链接; 
  2、只有在同一文件系统中的文件之间才能创建链接。 


  对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。修改其中一个,与其连接的文件同时被修改 


代码: 
$umask 022 
$ cp /etc/httpd/conf/httpd.conf /usr/sam 

原来前面做的试验,改变了系统默认的umask值,现在改回来为022, 
举个httpd.conf文件做例 子 

代码: 
$ ln httpd.conf httpd1.conf 
$ ln -s httpd.conf httpd2.conf 


第一条为硬链接,第二条为软链接 

代码: 
$ ls -li 

代码: 
总用量 80 
1077669   -rw-r--r--    2 sam      adm         34890 10月 31 00:57 httpd1.conf 
1077668  lrwxrwxrwx    1 sam      adm            10 10月 31 00:58 httpd2.conf -> httpd.conf 
1077669  -rw-r--r--    2 sam      adm         34890 10月 31 00:57 httpd.conf 


可以看到,使用ls -li,软连接只产生了10字节的快捷而已,硬连接却实实在在的的拷贝。最前面的inode硬链接和源文件是一样的,而软链接不一样,具体看一下回复 

对http1.conf进行编辑,可以发现httpd.conf也发生了一样的变化 

代码: 
$ rm httpd.conf 


现在删除链接的源文件,来比较不同之处 

代码: 
$ ls -l 
总用量 44 
drw-r--r--    2 sam      adm          4096 10月 30 20:14 file6 
-rw-r--r--    1 sam      adm         34890 10月 31 00:57 httpd1.conf 
lrwxrwxrwx    1 sam      adm            10 10月 31 00:58 httpd2.conf -> httpd.conf 


发现,httpd2.conf实际已经不存在了,是断链,而httpd1.conf变也了普通文件

 cuisharp 回复于:2004-12-07 20:54:44
每一个文件是不是都有一个自己的i-node和block,我想问一下,要是删一个文件,这个文件i-node和block是一起被删掉,还是只删i-node,或者是只删掉block?

 sakulagi 回复于:2004-12-07 21:09:45
每个文件都有自己的i-node,不过不同的文件可以share同一个i-node。
删除一个文件只是把文件名从目录里删掉,如果对应的i-node没有其他的文件指向了,那么i-node会被删掉。不过block里的内容还在,只是已经没有办法访问了。

 cuisharp 回复于:2004-12-07 21:37:04
[quote:cd5e580b51="sakulagi"]每个文件都有自己的i-node,不过不同的文件可以share同一个i-node。
删除一个文件只是把文件名从目录里删掉,如果对应的i-node没有其他的文件指向了,那么i-node会被删掉。不过block里的内容还在,只是已经没有办法..........[/quote:cd5e580b51]

谢谢,那目录和文件一样吗?

那硬链接是一个源文件共享同一个i-node吗?删掉源文件只是删掉的源文件所在目录中的源文件名和他的i-node,所以硬链接还可用,但软链接是指向的源文件所在目录中的源文件的那个i-node,所以链接不能用了?


还有就是软链接会占i-node,硬链接不占。

 dlcat 回复于:2004-12-07 22:54:29
就这样叫解释清楚,除了netman老大其他没有对的,我晕.

每个文件都对应一个i-node指向该文件的block,LINUX通过i-node找到相应的文件.
给文件加一个硬链接就是给这个文件加了一个i-node.这样这个文件就有两个i-node了,都指向同一个block,所以i-node不能跨磁盘分区,也不能指向路径(路径不是block).删除的时候删硬链接的没关系,由于原先的i-node没丢失,linux仍然可以找到该文件,所以不会被删除.

软链接就是快捷方式,所以可以跨分区,也可以指路径,也就是文件夹.

 網中人 回复于:2004-12-07 23:38:53
要談刪除, 就得扯上 link count 了...

 zd724 回复于:2004-12-08 03:04:01
一个占用2个I节点 一个只占用了1个i节点
就这些

 sakulagi 回复于:2004-12-08 07:57:38
[quote:d0d145905c="dlcat"]就这样叫解释清楚,除了netman老大其他没有对的,我晕.

每个文件都对应一个i-node指向该文件的block,LINUX通过i-node找到相应的文件.
给文件加一个硬链接就是给这个文件加了一个i-node.这样这个文件就有两个i-node..........[/quote:d0d145905c]你用ls -i看一下就知道hardlink不增加i-node的.
http://www.ugrad.cs.ubc.ca/~cs219/CourseNotes/Unix/commands-links.html
或者你看下这个文档.

 sakulagi 回复于:2004-12-08 08:02:44
[quote:d49279c499="網中人"]要談刪除, 就得扯上 link count 了...[/quote:d49279c499]嗯,网老大也来了.
 :) 
不知道象ReiserFS这样的文件系统是不是也使这样的?

 hdqqq 回复于:2004-12-08 09:08:01
好像是同一个问题
如果a是b的硬链接,我们好像也可以看作b是a的硬链接。请问如何来辨别谁是谁的链接?

 hdqqq 回复于:2004-12-08 09:09:27
也就是说如何知道谁是连接的源文件

 dlcat 回复于:2004-12-08 11:45:56
[quote:67e843f30a="sakulagi"]阌胠s -i看一下就知道hardlink不增加i-node的.
http://www.ugrad.cs.ubc.ca/~cs219/CourseNotes/Unix/commands-links.html
或者你看下这个文档.[/quote:67e843f30a]
我错了,应该是加一个,计数器+1,删一个-1。同一个i-node

 網中人 回复于:2004-12-08 13:44:40
[quote:b74b86e578="sakulagi"]不知道象ReiserFS这样的文件系统是不是也使这样的?[/quote:b74b86e578]
這個我不確定.
不知這位兄台能否幫大家測測看?

p.s. 
看完這貼, 讓我有些感慨, 覺得有些朋友在做學問的態度上不夠嚴謹, 常犯"想當然"的錯誤.
我個人覺得, 真的學習者, 致少懂得:
1) 鑽研基礎原理
2) 用實作來檢驗
3) 勤於思考, 不滿足單純的解決問題...
若自問不具備以上特質者, 我良心的規勸是: 不要走技術這條路吧, 這會很痛苦的.
或許, 其他的領域更為適合, 更為寬廣...  

啊, 抱歉, 囉唆了... 若聽了不舒服, 那我先賠個不是了...  ^_^

 hdqqq 回复于:2004-12-08 14:08:14
quote:
--------------------------------------------------------------------------------
gehidore@gnortra gehidore $ touch blah
gehidore@gnortra gehidore $ ln blah blah1
gehidore@gnortra gehidore $ ln -s blah blah2
gehidore@gnortra gehidore $ ls -l blah
-rw-r--r-- 2 gehidore users 0 Dec 7 16:44 blah
gehidore@gnortra gehidore $ ls -l blah1
-rw-r--r-- 2 gehidore users 0 Dec 7 16:44 blah1
gehidore@gnortra gehidore $ ls -l blah2
lrwxrwxrwx 1 gehidore users 4 Dec 7 16:44 blah2 -> blah
gehidore@gnortra gehidore $
--------------------------------------------------------------------------------
 
 我实在看不出blah与blash1的特性有什么不同。如果我们不是链接的操作者又怎么来看出硬链接的源文件是哪一个?疑惑的很。谢谢解疑!

 hdqqq 回复于:2004-12-08 14:23:54
[quote:84e9792ef2="網中人"]
這個我不確定.
不知這位兄台能否幫大家測測看?

p.s. 
看完這貼, 讓我有些感慨, 覺得有些朋友在做學問的態度上不夠嚴謹, 常犯"想當然"的錯誤.
我個人覺得, 真的學習者, 致少懂得:
1) 鑽研基礎原理
2) 用實作..........[/quote:84e9792ef2]
学到了才好。相对痛苦而言,知识的获取是一种无上的快乐,不是有一句:痛苦是一把双刃剑 么。
呵呵,扯远了,很感谢你的回复,对inode ,block 有了深刻一点的体验

 wingger 回复于:2004-12-08 14:24:35
:oops:  :oops:  :oops: 

俺没认真看网兄给出的链接,自我批评下,大家看看就都明白了

 網中人 回复于:2004-12-08 14:29:19
ls -li
這是你要的命令...

請稍微修正一下你的觀念:
1) 若談 soft link, 你可引用"源文件"一詞
2) 若談 hard link, 根本沒分哪個是"源", 大家都一樣的平等!
充其量, 你是讓一個文件帶多個名字而已...
若從技術上來說, hard link 是讓兩個 directory's entry 指到同一個 inode 上.

 simonlm 回复于:2004-12-08 14:50:19
昨天刚好看书看完他们的分别,呵呵!

 wingger 回复于:2004-12-08 15:15:17
网中人看看,我的贴子最后还有一个



[b:2fbb34ae99]索引节点、硬连接和连接计数 [/b:2fbb34ae99]

[b:2fbb34ae99]索引节点inode:[/b:2fbb34ae99] 

[quote:2fbb34ae99]Linux为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。[/quote:2fbb34ae99]

例如: 

假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行: 

[code:1:2fbb34ae99]This is my file. [/code:1:2fbb34ae99]

[code:1:2fbb34ae99]1、当然这行文字一定是存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇区号来描述,在本例中假设分别是1、20、30)。 

2、假设其inode是262457,那么系统通过一段标准程序,就能将这个inode转换成存放此文件的具体物理地址(1磁头、20柱面、30扇区),最终读出文件的内容:“This is my file.” 

3、所以inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不同物理数据区的文件必定分别对应着两个不同的inode号码。 [/code:1:2fbb34ae99]

[b:2fbb34ae99]文件拷贝命令与硬链接的区别:[/b:2fbb34ae99] 

[code:1:2fbb34ae99]# cp /home/zyd/mytext newfile [/code:1:2fbb34ae99]

在当前工作目录建立了一个新文件newfile,其实际操作主要包括如下三步:
 
[quote:2fbb34ae99]1、在当前目录中增加一个目录项,其文件名域填入newfile,并分配了一个新的inode,假设是262456。 
2、将原文件(在1磁头、20柱面、30扇区)的内容复制了一份到新的空闲物理块(假设是1磁头、20柱面、31扇区)。 
3、填写一些其他关键信息,使系统通过这些信息及inode号码可以完成物理地址的转换。 [/quote:2fbb34ae99]

所以文件复制要分配新的inode和新的数据区,虽然两个文件的内容是一样的。 


[b:2fbb34ae99]硬连接hardlink:[/b:2fbb34ae99] 

[quote:2fbb34ae99]我们实际使用文件时一般是通过文件名来引用的。通过上面的讨论,我们知道:

1个inode号码肯定和一片完全属于一个文件的数据区一一对应。那么一个文件系统中两个或更多个不同的文件名能否对应同一个文件呢?答案是肯定的。

我们知道inode号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项具有相同的inode值,实际上就使它们对应着同一个文件。

有几个目录项具有相同的inode号,我们就说这个文件有几个硬连接(hardlink),

对于普通文件,ls -l命令的连接计数count域的数值就是本文件拥有的硬连接数。硬连接可以通过ln命令建立,[/quote:2fbb34ae99]

例如: 

[code:1:2fbb34ae99]# ln /home/zyd/mytext hardlink_mytext [/code:1:2fbb34ae99]

就建立了一个新的文件hardlink_mytext,这个文件的inode同样是262457。建立硬连接实际上只是增加了一个目录项,但并复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保证两个文件能同步更新。 

[code:1:2fbb34ae99]'ls -il'可以显示文件的inode(在下面最左边): 

262456 -rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile 
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext 
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext [/code:1:2fbb34ae99]


[b:2fbb34ae99]连接计数count:[/b:2fbb34ae99] 

前面我们介绍了,文件的连接计数域表明本系统中共有几个文件目录项的inode和本文件相同,也就是本文件共有几个硬连接。如上面的例子中hardlink_mytext和mytext文件的count值都是2。 

那么对于目录,其count域的含义是什么呢?目录的count同样表示共有多少个目录项指向此目录,不过要详细说明必须进一步解释VFS文件系统的结构,为简单起见,只要这样理解就行了:(count-2)等于本目录包含的直接子目录数(就是只包括儿子,不包括孙子啦!)。

[code:1:2fbb34ae99]例如:如果一个目录/abc的count域为5,那么/abc目录一定包含3个子目录。[/code:1:2fbb34ae99] 


[quote:2fbb34ae99]进一步说明: 

硬连接文件实际上并不是一种新的文件类型,两个文件互为对方的硬连接。它们应该都是普通文件(谁能告诉我:其它类型的文件可以硬连接吗?)。两个文件除了名称或/和文件目录不同外,其它部分完全相同,更改了一个文件,另一个的文件长度、内容、更改时间等都将相应发生变化,更改了一个文件的权限位mode,另一个也会发生同样的变化。 [/quote:2fbb34ae99]

[quote:2fbb34ae99]注意连接计数字段count,互为硬连接的两个文件的count值都是2,表明有两个inode指向同一文件的inode。
 
当我们删除其中一个文件时,系统首先将(count-1)->count,如果结果是零,就将其目录项和数据区都删除,否则只将本目录项删除,数据区仍然保留,仍然可以通过另外的文件名访问。根据这个特性,可以通过为重要的文件建立硬连接的方法来防止其被误删除。 [/quote:2fbb34ae99]

一个文件系统允许的inode节点数是有限的,如果文件数量太多,即使每个文件都是0字节的空文件,系统最终也会因为节点空间耗尽而不能再创建文件。所以当发现不能建立文件时首先要考虑硬盘数据区是否还有空间(可通过du命令),其次还得检查节点空间。 

[quote:2fbb34ae99]互为硬连接的多个文件必须位于同一个文件系统上。根设备及任何一个需要mount才能挂接进来的分区、软盘、NFS、光驱等都是一个独立的文件系统,每个文件系统有一个相应的设备号,不同文件系统中具有相同inode节 点的文件间没有任何联系。系统则通过设备号和inode号的组合唯一确定一个文件。 [/quote:2fbb34ae99]

Linux之所以能支持多种文件系统,其实是由于Linux提供了一个虚拟文件系统VFS,VFS作为实际文件系统的上层软件,掩盖了实际文件系统底层的具体结构差异,为系统访问位于不同文件系统的文件提供了一个统一的接 口。

实际上许多文件系统并不具备inode结构,其目录结构也和以上的讨论不同,但通过VFS,系统均为其提供了虚拟一致的inode和目录项结构。

所以,'ls -il'命令实际显示的inode应该是VFS inode,也就是说,inode是存在于内存中的数据结构,而不一定是实际的硬盘结构。

但为Linux量身定做的ext2文件系统具备实际的inode和连接型目录项结构,所以,对于ext2文件系统,可以认为我们上面讨论的关于硬连接的概念是完全正确的。

 sakulagi 回复于:2004-12-08 15:39:02
[quote:6a3c3a7clearcase/" target="_blank" >cc9="網中人"]
這個我不確定.
不知這位兄台能否幫大家測測看?

p.s. 
看完這貼, 讓我有些感慨, 覺得有些朋友在做學問的態度上不夠嚴謹, 常犯"想當然"的錯誤.
我個人覺得, 真的學習者, 致少懂得:
1) 鑽研基礎原理
2) 用實作..........[/quote:6a3c3a7cc9] :oops: 俺也不知道怎么测啊。如果ls看到是VFS的结构,那么是不是要有对应的工具,比如debugfs之类的,才能看到实际的磁盘结构?还请网老大指点。

 hdqqq 回复于:2004-12-08 16:10:33
ls -li 
這是你要的命令... 

請稍微修正一下你的觀念: 
1) 若談 soft link, 你可引用"源文件"一詞 
2) 若談 hard link, 根本沒分哪個是"源", 大家都一樣的平等!

---------------感謝回復 
http://justlinux.com/forum/showthread.php?s=&threadid=136015
這上所提到嚴重問題也很值得注意
至於區別上來講,個人感覺還是
“hard link 是讓兩個 directory's entry 指到同一個 inode 上.“這句比較精髓,理解起來更爲合理
無知者無畏,thank godness!
再次感謝!!!

 網中人 回复于:2004-12-08 16:53:36
VFS 是 kernel 較上層的 layer, 
inode 是底下 file system 的東西,
其內容也是存在 block 之內, 只是我們稱為 inode block 而已.

我對 reiserfs 還沒研究過, 因此不很確定其 indexing method 是怎麼實作的.
但我猜, 在實作細節及演算法上或有不同, 但原理應是一致的...

 月眉儿 回复于:2004-12-08 18:30:58
我用ln -f怎么不能删除软连接呢?

 天涯明月刀 回复于:2004-12-08 19:12:13
我觉着书上说的比任何人描述的都清楚!

 SeaKing911 回复于:2004-12-09 17:03:09
嗯,是啊。要好好研究好好演练!

 GoldSn0ke 回复于:2004-12-10 11:39:15
我也搞不懂有什么区别,今早看了篇文章,然后在机器上一试就知道了...哈哈~~~

 lightspeed 回复于:2004-12-10 12:16:46
[quote:cb275b1f8a="sakulagi"]
不知道象ReiserFS这样的文件系统是不是也使这样的?[/quote:cb275b1f8a]

Same. 有的版本有 bug ,  不能做 hard link, 需要 patch.

不过我看到很多讨论并不是有关 link 的基本概念, 而是 hard link
的好处和危害性的。 尤其是有关目录 link 的。

 indigo 回复于:2004-12-11 19:08:28
本来是没有硬连接这个说法的,所谓的硬连接只是相对于软连接而言。楼上有一位说得很对,建立硬连接的两个文件地位是一样的。而软连接就不一样了。 
一定要搞清区分两者的关系,则应该从文件系统的i-node概念出发。不要就是从一些表面的现象入手,这样还是会搞得云里雾里的

 網中人 回复于:2004-12-11 19:58:53
[quote:b51a3c4f3f="lightspeed"]而是 hard link
的好处和危害性的。 尤其是有关目录 link 的。[/quote:b51a3c4f3f]
嗯... 我也很有興趣想知道呢.   ^_^
能否請 lightspeed 兄說說啊, 謝謝囉...

 lightspeed 回复于:2004-12-13 03:06:48
[quote:3435700807="網中人"]
嗯... 我也很有興趣想知道呢.   ^_^
能否請 lightspeed 兄說說啊, 謝謝囉...[/quote:3435700807]

各种讨论很多,  下面是一个 security 方面的例子, 请阅读此帖及其跟帖。

http://lists.virus.org/bugtraq-0311/msg00279.html

 sinozhou 回复于:2005-06-11 13:36:10
http://linuxgazette.net/105/pitcher.html

 sunsroad 回复于:2005-06-11 14:06:40
[quote:c43daa3ced="Linux@初学者"]软:相当于MS下的快捷方式,不占用INODE
硬:相当于一个文件的考贝!占用INODE[/quote:c43daa3ced]

完全错误,软连接是要占用一个Inode,恰恰相反,硬连接才不占用多余的Inode。

 sunsroad 回复于:2005-06-11 14:34:25
[quote:1ea44d715a="dlcat"]就这样叫解释清楚,除了netman老大其他没有对的,我晕.

每个文件都对应一个i-node指向该文件的block,LINUX通过i-node找到相应的文件.
给文件加一个硬链接就是给这个文件加了一个i-node.这样这个文件就有两个i-node..........[/quote:1ea44d715a]

硬连接是不会建立Inode的,他只是在文件原来的Inode link count域再增加1而已,也因此硬链接是不可以跨越文件系统的。相反都是软连接会重新建立一个Inode,当时Inode的结构跟其他的不一样,他只是一个指明源文件的字符串信息,譬如:/usr/bin/ls,然后一旦你在/usr/bin下把ls删除掉,那么软连接将变得毫无意义。而硬链接删除的时候,系统调用会检查link count的数值,如果他大于1,那么Inode不会被回收。因此文件的内容没有不会被删除。

网老大的说法是正确的,不过太过简单。


我认为如果你真正想要了解这些东西,最好对file system有一个清楚的了解,只有你真正了解文件系统的具体的结构,这些问题就会迎刃而解,根本就不会再什么理解上的困难。造成这个困惑的主要原因还是对文件系统的概念及结构认识太过模糊。

 honbj 回复于:2005-06-29 10:56:15
不知这个解释会否有帮助

主要区别如下:
1.硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i来查看一下,这两个文件的inode号是同一个,说明它们是同一个文件;而软链接建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。
2.硬链接只能用于文件,不能用于目录;软链接可以为目录建链接。
3.硬链接不能跨文件系统操作。

 yenakata 回复于:2005-06-29 14:04:49
[quote:521dc8eef5="sinozhou"]http://linuxgazette.net/105/pitcher.html[/quote:521dc8eef5]

建议大家都去看看由sinozhou提供的页面。



我的理解如下,请指正 :P 。



unix里文件由两部分组成,data part为数据部分,filename part为文件名部分。data part有一个概念为inode,inode指向文件在磁盘的存储位置block,以及文件的权限等信息。filename part里有文件名和相关的inode。

可以有多个文件名都指向同一inode,于是这些文件名被称为hard link。

另外,还有一种特殊类型的文件,它的data part为一path,该path指向另一个文件。操作系统把对该特殊文

件的操作如打开、读、写等都redirect到该特殊文件所指向的那个文件。于是该特殊文件被称为symbolic link

 netbee 回复于:2005-06-29 15:40:09
[quote:5b6b45b3ab="月眉儿"]我用ln -f怎么不能删除软连接呢?[/quote:5b6b45b3ab]

-f的意思是在建立连接时,如果目标文件存在,就强制性的覆盖它。也可以是说先删除已存的文件,然后建立新文件。

 gunguymadman 回复于:2005-06-29 16:59:54
[quote:ef0c5a252b="sunsroad"]

硬连接是不会建立Inode的,他只是在文件原来的Inode link count域再增加1而已,也因此硬链接是不可以跨越文件系统的。相反都是软连接会重新建立一个Inode,当时Inode的结构跟其他的不一样,他只是一个指明源文件?..........[/quote:ef0c5a252b]nod

 tonera 回复于:2005-07-15 11:57:12
我想问一下,如果一个硬链接的源文件内容发生变动.(文件名不变),那么这个硬链接指向的文件内容是否会同步变动?还是生成一个原来文件的拷贝?

 doni 回复于:2005-07-15 13:40:55
[quote:e47d02ef1a="tonera"]我想问一下,如果一个硬链接的源文件内容发生变动.(文件名不变),那么这个硬链接指向的文件内容是否会同步变动?还是生成一个原来文件的拷贝?[/quote:e47d02ef1a]

前面实际上已经讲到,无所谓硬链接,只是相对软链接而言.
所谓硬链接的各个文件,实际是同一个文件,所以修改一个,当然都变.

 tonera 回复于:2005-07-18 11:57:23
[quote:7dfa210e46="doni"]

前面实际上已经讲到,无所谓硬链接,只是相对软链接而言.
所谓硬链接的各个文件,实际是同一个文件,所以修改一个,当然都变.[/quote:7dfa210e46]

我实际应用的时候不是这样.

修改源文件,硬链接文件内容并不改变.

 B.net 回复于:2005-07-18 17:01:45
精彩`~~~偶有收获~~~就是INODE的概念~~~
基础~~~那个重要滴~~~~
顺便顶一下让更多的人看到这种文章~~~
不仅是技术上的进步呀~~~ :twisted:  :twisted:  :twisted:  :twisted:
关注一下楼上应用中的实际不一样`~~

原文转自:http://www.ltesting.net