1. 程式人生 > >linux 軟連接和硬鏈接的區別

linux 軟連接和硬鏈接的區別

限制 linux下 文本 linux系統中 文件路徑 文件顯示 txt 包含 結構

linux 軟連接和硬鏈接的區別

2011-06-27 zale的圖... 閱 3345 轉 23 轉藏到我的圖書館 微信分享:
4點不同 :
(1)軟連接可以 跨文件系統 ,硬連接不可以 。實踐的方法就是用共享文件把windows下的 aa.txt文本文檔連接到linux下/root目錄 下 bb,cc . ln -s aa.txt /root/bb 連接成功 。ln aa.txt /root/bb 失敗 。
(2)關於 I節點的問題 。硬連接不管有多少個,都指向的是同一個I節點,會把 結點連接數增加 ,只要結點的連接數不是 0,文件就一直存在 ,不管你刪除的是源文件還是 連接的文件 。只要有一個存在 ,文件就 存在 (其實也不分什麽 源文件連接文件的 ,因為他們指向都是同一個 I節點)。 當你修改源文件或者連接文件任何一個的時候 ,其他的 文件都會做同步的修改 。軟鏈接不直接使用i節點號作為文件指針,而是使用文件路徑名作為指針。所以 刪除連接文件 對源文件無影響,但是 刪除 源文件,連接文件就會找不到要指向的文件 。軟鏈接有自己的inode,並在磁盤上有一小片空間存放路徑名.(這一段是個什麽意思?)
(3)軟連接可以對一個不存在的文件名進行連接 。
(4)軟連接可以對目錄進行連接。

備註:I節點 :它是UNIX內部用於描述文件特性的數據結構.我們通常稱I節點為文件索引結點(信息結點).i節點 含有關於文件的大部分的重要信 息,包括文件數據塊在磁盤上的地址.每一個I節點有它自己的標誌號,我們稱為文件順序號.I節點包含的信息 1.文件類型 2.文件屬主關系 3.文件的訪問權限 4.文件的時間截. 一直以來,對Linux的鏈接都有點懵懵懂懂的,使用上也存在一些問題,這兩天仔細上網查了查資料,仔細了解了Linux上的硬鏈接和軟鏈接。

鏈接---------是一種在共享文件和訪問它的用戶的若幹目錄項之間建立聯系的一種方法。

Linux中包括兩種鏈接:硬鏈接(Hard Link)和軟鏈接(Soft Link),軟鏈接又稱為符號鏈接(Symbolic link)。

我們首先來了解一下幾個名詞。

索引節點(inode)

要了解鏈接,我們首先得了解一個概念,叫索引節點(inode)。在Linux系統中,內核為每一個新創建的文件分配一個Inode(索引結點),每個文件都有一個惟一的inode號,我們可以將inode簡單理解成一個指針,它永遠指向本文件的具體存儲位置。文件屬性保存在索引結點裏,在訪問文件時,索引結點被復制到內存在,從而實現文件的快速訪問。系統是通過索引節點(而不是文件名)來定位每一個文件。

硬鏈接(Hard Link)
硬鏈接說白了是一個指針,指向文件索引節點,系統並不為它重新分配inode。
可以用:ln命令來建立硬鏈接。
引用 ln [options] existingfile newfile
ln [options] existingfile-list directory
用法:
第一種為”existingfile”創建硬鏈接,文件名為”newfile”。
第二種在”directory”目錄中,為” existingfile-list”中包含的所有文件創建一個同名的硬鏈接。
常用可選[options]:-f 無論”newfile”存在與否,都創建鏈接。-n 如果”newfile”已存在,就不創建鏈接。

軟鏈接(Soft Link)

軟鏈接又叫符號鏈接,這個文件包含了另一個文件的路徑名。可以是任意文件或目錄,可以鏈接不同文件系統的文件。和win下的快捷方式差不多。
可以用:ln -s 命令來建立軟鏈接。
引用 ln -s existingfile newfile
ln -s existingfile-list directory

下面我們用一個實例來說明硬鏈接和軟鏈接。

現在目錄下有兩個文件,一個名為AAA,一個名為BBB。
引用 $ ls -il
963922 -rw-r--r-- 1 ocean ocean 92 2007-05-18 15:46 AAA
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB

首先先做一個AAA的硬鏈接。
引用 $ ln AAA AAAhard
$ls -il
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
這裏我們註意在創建鏈接前,AAA顯示的鏈接數目為1,創建鏈接後
1.AAA和AAAhard的鏈接數目都變為2。
2.AAA和AAAhard的inode號是一樣的,都是963922。
3.AAA和AAAhard顯示的文件大小也是一樣,都是92B。
可見進行了ln命令的操作結果:AAA和AAAhard是同一個文件的兩個名字,它們具有同樣的索引節點號和文件屬性,建立文件AAA的硬鏈接,就是為AAA的文件索引節點在當前目錄上建立一個新指針。你可以刪除其中任何一個,如rm AAA,每次只會刪除一個指針,鏈接數同時減一,只有將所有指向文件內容的指針,也即鏈接數減為0時,內核才會把文件內容從磁盤上刪除。
盡管硬鏈接節省空間,也是Linux系統整合文件系統的傳統方式,但是存在一些不足之處:
1.不允許給目錄創建硬鏈接。
2.不可以在不同文件系統的文件間建立鏈接。

接著我們做一個指向BBB的軟鏈接,軟鏈接克服了硬鏈接的不足,沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接。因而現在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網絡對文件進行鏈接。
引用 $ ln -s BBB BBBsoft
$ ls -il
總用量 0
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
963924 lrwxrwxrwx 1 ocean ocean 3 2007-05-18 15:47 BBBsoft -> BBB
從上面鏈接後的結果可以看出來軟鏈接與硬鏈接,區別不僅僅是在概念上,在實現上也是完全不同的。
區別:
1.硬鏈接原文件/鏈接文件公用一個inode號,說明他們是同一個文件,而軟鏈接原文件/鏈接文件擁有不同的inode號,表明他們是兩個不同的文件;
2.在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈接沒有寫出來,因為在本質上硬鏈接文件和原文件是完全平等關系;
3.鏈接數目是不一樣的,軟鏈接的鏈接數目不會增加;
4.文件大小是不一樣的,硬鏈接文件顯示的大小是跟原文件是一樣的。而這裏軟鏈接顯示的大小與原文件就不同了,BBB大小是95B,而BBBsoft是3B。
總之,建立軟鏈接就是建立了一個新文件。當訪問鏈接文件時,系統就會發現他是個鏈接文件,它讀取鏈接文件找到真正要訪問的文件。
當然軟鏈接也有硬鏈接沒有的缺點,因為鏈接文件包含有原文件的路徑信息,所以當原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統就找不到了,而硬鏈接就沒有這個缺陷,你想怎麽移就怎麽移;還有它要系統分配額外的空間用於建立新的索引節點和保存原文件的路徑。

連接計數count
前面我們介紹了,文件的鏈接計數域表明本系統中共有幾個文件目錄項的inode和本文件相同,也就是本文件共有幾個硬鏈接。如上面的例子中AAA和AAAhard文件的count值都是2。

那麽對於目錄,其count域的含義是什麽呢?目錄的count同樣表示共有多少個目錄項指向此目錄,不過要詳細說明必須進一步解釋VFS文件系統的結構,為簡單起見,只要這樣理解就行了:(count-2)等於本目錄包含的直接子目錄數(就是只包括兒子,不包括孫子)。

例如:如果一個目錄/ln的count域為5,那麽/ln目錄一定包含3個子目錄。

linux 軟連接和硬鏈接的區別