1. 程式人生 > >linux 軟連線和硬連結的區別

linux 軟連線和硬連結的區別

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 ln 建立連結文中提到了在linux下如何建立硬連結和軟連線,但是仍然有很多童鞋不知道硬連結和軟連線的區別.

所以呢,今天Redhat有必要詳細介紹下linux 下硬連線與軟連線的區別.

首先我們需要了解linux下硬連結以及軟連線的基本概念.

硬連結:新建的檔案是已經存在的檔案的一個別名,當原檔案刪除時,新建的檔案仍然可以使用.

軟連線:也成符號連結,新建的檔案以“路徑”的形式來表示另一個檔案,和Windows的快捷方式十分相似.

下面詳細介紹一下硬連結和軟連線之間的區別.

1.硬連結和原來的檔案沒有什麼區別,而且共享一個 inode 號(檔案在檔案系統上的唯一標識);而軟連結不共享 inode,也可以說是個特殊的 inode,所以和原來的 inode 有區別。

2.若原檔案刪除了,則該軟連線則不可以訪問,而硬連線則是可以的。

3.由於符號連結的特性,導致其可以跨越磁碟分割槽,但硬連結不具備這個特性.

另外在轉載一下網上的介紹.

硬連結(hard link)

   UNIX檔案系統提供了一種將不同檔案連結至同一個檔案的機制,我們稱這種機制為連結。它可以使得單個程式對同一檔案使用不同的名字。這樣的好處是檔案系統只存在一個檔案的副本。系統簡單地通過在目錄中建立一個新的登記項來實現這種連線。該登記項具有一個新的檔名和要連線檔案的inode號(inode與原檔案相同)。不論一個檔案有多少硬連結,在磁碟上只有一個描述它的inode,只要該檔案的連結數不為0,該檔案就保持存在。硬連結不能對目錄建立硬連結!

   硬連線是直接建立在節點表上的(inode),建立硬連線指向一個檔案的時候,會更新節點表上面的計數值。舉個例子,一個檔案被連線了兩次(硬連線),這個 檔案的計數值是3,而無論通過3個檔名中的任何一個訪問,效果都是完全一樣的,但是如果刪除其中任意一個,都只是把計數值減1,不會刪除實際的內容的, (任何存在的檔案本身就算是一個硬連線)只有計數值變成0也就是沒有任何硬連線指向的時候才會真實的刪除內容。

軟連結(symbolic link)

   我們把符號連結稱為軟連結,它是指向另一個檔案的特殊檔案,這種檔案的資料部分僅包含它所要連結檔案的路徑名。軟連結是為了克服硬連結的不足而引入的,軟連結不直接使用inode號作為檔案指標,而是使用檔案路徑名作為指標(軟連結:檔名 + 資料部分-->目標檔案的路徑名)。軟體有自己的inode,並在磁碟上有一小片空間存放路徑名。因此,軟連結能夠跨檔案系統,也可以和目錄連結!其二,軟連結可以對一個不存在的檔名進行連結,但直到這個名字對應的檔案被建立後,才能開啟其連結。

==============================================================

linux系統下提供ln指令來進行檔案連結。檔案連結分為硬連結和軟連結兩種。

硬連結Hard link

由於linux下的檔案是通過索引節點(inode)來識別檔案,硬連結可以認為是一個指標,指向原檔案inode的指標,系統並不為它重新分配inode和建立檔案;即硬連結檔案和原檔案其實是同一個檔案,只是名字不同。每新增一個硬連結,檔案inode的連結數就加1;刪除一個硬連結,inode的連結數減1,檔案內容依然存在,直到inode的連結數為0,才刪除inode對應的檔案。

可以用ln命令來建立硬連結。語法:

1 2 ln [options] existingfile newfile ln [options] existingfile-list directory

用法:

  • 第一種:為 existingfile 建立硬連結,檔名為 newfile 。
  • 第二種:在 directory 目錄中,為 existingfile-list 中包含的所有檔案建立一個同名的硬連結。

常用選項[options]

  • -f 無論 newfile 存在與否,都建立連結。
  • -n 如果 newfile 已存在,就不建立連結。

例子:

1 2 3 4 5 6 7 8 $ 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時,系統才會把檔案內容從磁碟上刪除。

硬連結的不足:

  1. 不可以在不同檔案系統的檔案間建立連結
  2. 只有超級使用者才可以為目錄建立硬連結

軟連結Soft link(符號連結symbolic link)

軟連結也叫符號連結,它是指向另一個檔案的特殊檔案,這種檔案的資料部分僅包含它所要連結檔案的路徑名。軟連結是為了克服硬連結的不足而引入的,軟連結不直接使用inode號作為檔案指標,而是使用檔案路徑名作為指標軟連結:檔名+ 資料部分–>目標檔案的路徑名)。軟連結有自己的inode,並在磁碟上有一小片空間存放路徑名。因此,軟連結能夠跨檔案系統,也可以和目錄連結!其二,軟連結可以對一個不存在的檔名進行連結,但直到這個名字對應的檔案被建立後,才能開啟其連結。

軟連結克服了硬連結的不足,沒有任何檔案系統的限制,任何使用者可以建立指向目錄的符號連結。因而現在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網路對檔案進行連結,如同Windows下的快捷方式。

給ln命令加上-s選項,則建立軟連結。如果[連結名]已經存在但不是目錄,將不做連結。[連結名]可以是任何一個檔名,也可以是一個目錄,並且允許它與原檔案不在同一個檔案系統中。如果[連結名]是一個已經存在的目錄,系統將在該目錄下建立一個或多個與原檔案同名的檔案,此新建的檔案實際上是指向原檔案的符號連結檔案。

例子:

01 02 03 04 05 06 07 08 09 10 $ 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”的大小。
  • 在同一檔案系統下,可以建立軟連結或硬連結(同文件系統不同目錄下也可以)。

操作實驗

以下晴楓做了個實驗,把上文提到的硬連結和軟連結的區別體驗了一遍,明白上面的原理也就很容易理解下面操作的結果了

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 $ echo "in a.txt" > a.txt $ cat a.txt in a.txt $ $ ln a.txt b.txt $ echo "add to b.txt" >> b.txt $ cat a.txt in a.txt add to b.txt $ cat b.txt in a.txt add to b.txt $ $ ls -li total 8 20327264 -rw-r--r-- 2 znan sybase 22 Nov  9 00:54 a.txt 20327264 -rw-r--r-- 2 znan sybase 22 Nov  9 00:54 b.txt $ $ ln -s a.txt c.txt $ ls -li total 8 20327264 -rw-r--r-- 2 znan sybase 22 Nov  9 00:54 a.txt 20327264 -rw-r--r-- 2 znan sybase 22 Nov  9 00:54 b.txt 20327265 lrwxrwxrwx 1 znan sybase  5 Nov  9 00:55 c.txt -> a.txt $ $ echo "add to c.txt" >> c.txt $ cat a.txt in a.txt add to b.txt add to c.txt $ cat b.txt in a.txt add to b.txt add to c.txt $ cat c.txt in a.txt add to b.txt add to c.txt $ $ mv a.txt d.txt $ ls -li total 8 20327264 -rw-r--r-- 2 znan sybase 35 Nov  9 00:56 b.txt 20327265 lrwxrwxrwx 1 znan sybase  5 Nov  9 00:55 c.txt -> a.txt 20327264 -rw-r--r-- 2 znan sybase 35 Nov  9 00:56 d.txt $ cat b.txt in a.txt add to b.txt add to c.txt $ cat c.txt cat: c.txt: No such file or directory $ $ echo "add to d.txt" >> d.txt $ cat b.txt in a.txt add to b.txt add to c.txt add to d.txt $ $ rm b.txt $ ls -li total 4 20327265 lrwxrwxrwx 1 znan sybase  5 Nov  9 00:55 c.txt -> a.txt 20327264 -rw-r--r-- 1 znan sybase 48 Nov  9 00:58 d.txt