硬鏈接與軟鏈接的聯系與區別

硬鏈接與軟鏈接的聯系與區別

我們知道文件都有文件名與數據,這在 Linux 上被分成兩個部分:用戶數據 (user data) 與元數據 (metadata)。用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;而元數據則是文件的附加屬性,如文件大小、創建時間、所有者等信息。在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其并不包含文件名,inode 號即索引節點號)才是文件的唯一標識而非文件名。文件名僅是為了方便人們的記憶和使用,系統或程序通過 inode 號尋找正確的文件數據塊。下圖展示了程序通過文件名獲取文件內容的過程。

1. 通過文件名打開文件

                                              1.jpg

硬鏈接

為解決文件的共享使用,Linux 系統引入了兩種鏈接:硬鏈接 (hard link) 與軟鏈接(又稱符號鏈接,即 soft link symbolic link)。鏈接為 Linux 系統解決了文件的共享使用,還帶來了隱藏文件路徑、增加權限安全及節省存儲等好處。若一個 inode 號對應多個文件名,則稱這些文件為硬鏈接。換言之,硬鏈接就是同一個文件使用了多個別名(見  2.hard link 就是 file 的一個別名,他們有共同的 inode)。硬鏈接可由命令 link ln 創建。如下是對文件 oldfile 創建硬鏈接。

 

[root@mutu #2 ~]# ln oldfile newfile

2.jpg

多個檔名對應同一個inode,硬鏈接只是在某個目錄下新增一筆檔名鏈接到某個inode號碼的關聯記錄而已。如果將上圖中任何一個檔名刪除,檔案的inodeblock都還存在,依然還可以通過另一個檔名來讀取正確的檔案數據。此外,不論用哪一個檔名來編輯,最終的結果都會寫入相同的inodeblock中,因此均能進行數據的修改

 

建立硬鏈接

[root@mutu #17 ~]# ln oldfile newfile

[root@mutu #18 ~]# ll oldfile newfile

-rw-r–r–. 2 root root 0 Oct 20 21:19 newfile

-rw-r–r–. 2 root root 0 Oct 20 21:19 oldfile

[root@mutu #21 ~]# ls -li oldfile newfile

68547 -rw-r–r–. 2 root root 0 Oct 20 21:19 newfile

68547 -rw-r–r–. 2 root root 0 Oct 20 21:19 oldfile

 

軟鏈接

3.jpg

多個檔名對應同一個inode,硬鏈接只是在某個目錄下新增一筆檔名鏈接到某個inode號碼的關聯記錄而已。如果將上圖中任何一個檔名刪除,檔案的inodeblock都還存在,依然還可以通過另一個檔名來讀取正確的檔案數據。此外,不論用哪一個檔名來編輯,最終的結果都會寫入相同的inodeblock中,因此均能進行數據的修改盡管硬鏈接節省空間,也是Linux系統整合文件系統的傳統方式,但是存在一些不足之處:
1.不允許給目錄創建硬鏈接。
2.
不可以在不同文件系統的文件間建立鏈接。因為 inode 是這個文件在當前分區中的索引值,是相對于這個分區的,當然不能跨越文件系統了。

2. 軟鏈接的訪問

4.jpg

軟連接就是建立一個獨立的文件,而這個文件會讓數據的讀取指向它link的那個檔案的檔名,由于只是作為指向的動作,所以當來源檔案被刪除之后,軟連接的檔案無法開啟,因為找不到原始檔名。連結檔的內容只有檔名,根據檔名鏈接到正確的目錄進一步取得目標檔案的inode,最終就能夠讀取到正確的數據。如果目標檔案的原始檔名被刪除了那么整個環節就進行不下去了。

 

[root@mutu #30 etc]# ls -li system-release  centos-release

389400 -rw-r–r–. 1 root root 38 Dec  9  2015 centos-release

389411 lrwxrwxrwx. 1 root root 14 Oct 12 01:58 system-release -> centos-release

 

從上面鏈接后的結果可以看出來軟鏈接與硬鏈接,區別不僅僅是在概念上,在實現上也是完全不同的。

區別:

硬鏈接原文件/鏈接文件公用一個inode號,說明他們是同一個文件,而軟鏈接原文件/鏈接文件擁有不同的inode號,表明他們是兩個不同的文件;

2.在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈接沒有寫出來,因為在本質上硬鏈接文件和原文件是完全平等關系;

3.鏈接數目是不一樣的,軟鏈接的鏈接數目不會增加;

4.文件大小是不一樣的,硬鏈接文件顯示的大小是跟原文件是一樣的。而這里軟鏈接顯示的大小與原文件就不同了,centos-release大小是38B,而system-release14B。因為centos-release共有3個字符

5.軟鏈接沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接

總之,建立軟鏈接就是建立了一個新文件。當訪問鏈接文件時,系統就會發現他是個鏈接文

之,建立軟鏈接就是建立了一個新文件。當訪問鏈接文件時,系統就會發現他是個鏈接文

當然軟鏈接也有硬鏈接沒有的缺點:因為鏈接文件包含有原文件的路徑信息,所以當原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統就找不到了,而硬鏈接就沒有這個缺陷,你想怎么移就怎么移;還有它要系統分配額外的空間用于建立新的索引節點和保存原文件的路徑。

原創文章,作者:mutu,如若轉載,請注明出處:http://www.www58058.com/53715

(1)
mutumutu
上一篇 2016-10-23
下一篇 2016-10-23

相關推薦

  • 條件判斷(if,case)和循環(for,until,while等)詳解(附例題正解)

    腳本中的if條件判斷和循環 在linux下,寫腳本是我們必不可少的。在寫腳本的過程中,if判斷和各種的循環是我們常用的。這里,詳細的說一下條件判斷以及循環的使用。 條件判斷:if 和 else 1.if shell程序中的條件分支是通過if條件語句來實現的,其格式一般為if -then -fi ,這樣的是單分支語句,還有的一種就是if-then-else-f…

    Linux干貨 2016-08-18
  • 數據結構知識點(list,tuple,冒泡法)

    分類 數值型 int、float、complex、bool 序列對象 字符串str、列表list、tuple 鍵值對 集合set、字典dict 數值型 complex:有實數和虛數部分組成 float:有整數和小數組成。只有雙精度 類型轉換 int(X) 返回一個整數 float(x) 返回一個浮點數 complex(x)、complex(x,y) 返回一個…

    2017-09-25
  • N23 9月底的

    1.linux下文件管理命令 cat 讀取文件 或者連接顯示touch 建立文件 改變時間 cp 復制文件 -f 強制復制 不論覆蓋-r 連同子目錄遞歸處理-l 建立硬鏈接-s 建立符號連接 rm 刪除文件 -r 遞歸刪除 連同子目錄也一起干掉-f 強制 刪除文件或者目錄-d 直接刪除目錄 file 辨識文件類型 find 查找文件 whereis 查找文件…

    Linux干貨 2016-09-25
  • 運維的危險命令,用了必死(1)

    Linux命令行佷有用、很高效,也很有趣,但有時候也很危險,尤其是在你不確定你自己在正在做什么時候。這篇文章并不打算引來你對Linux或linux 命令行的憤怒。我們只是想讓你意識到在你運行某些命令時應該三思而后行。(譯注:當然,以下命令通常都是在root權限下才能將愚蠢發揮到無可救藥;在普通用戶身份下,破壞的只是自己的一畝三分地。)

    2017-11-16
  • Linux命令幫助文檔的使用及簡單命令使用-2016-7-25

    Linux命令幫助文檔的使用   相關命令 whatis    COMMAND –help    man and info 本地幫助文檔/usr/share/doc   在使用系統內建的幫助文檔之前,我們需要了解需要命令幫助是否是內部命令和外部命令…

    Linux干貨 2016-08-04
  • MySQL入門書籍和方法分享

    原文:http://cenalulu.github.io/mysql/mysql-book-for-newbie/           作者: 盧鈞軼     本文羅列了一些適用于MySQL及運維入門和進階使用的書籍。 背景:各大論壇上總是…

    Linux干貨 2015-04-09
欧美性久久久久