硬連接和軟連接的區別


簡述

我們都知道,在linux系統中,本質上是通過inode(index node)來對文件進行訪問(或者說數據控制)的。linux的人性化設置,使得平時我們可以通過文件名來訪問文件。其實吧,不是一般性的說,文件名,就是inode的別名。


認識目錄項,inode以及block

這里有幾個簡單的知識點:

  1. 一個文件可以被存儲在一個或者多個block中;
  2. 每個文件都會並且只能占用一個inode,inode可以指向該文件所在的block,inode中還存儲該文件的各種屬性,如rwx...;
  3. 想讀取該文件,必須經過目錄項的文件名來指向到正確的inode號碼才能讀取。

看到這里,該提出兩個問題了:

  1. 什么是目錄項?當新建一個目錄時,文件系統會分配一個inode和至少一塊block給該目錄。其中,inode記錄該目錄的相關權限和屬性,並記錄分配到的那塊block號碼。而block則是記錄在這個目錄下的文件名和這些文件名所對應的inode號碼數據,這就是我們所說的數據項
  2. 當幾個不同文件名,指向同一個inode號碼時,會發生什么事?這就引出了我們要說的內容了,硬連接(hard link)和軟連接(symbolic link).
    這幅圖可以完美說明這一切:

    為了應題,我把目錄項的內容用紅色框框出來了。其余那些文件屬性是在文件inode中讀取出來的。

過程我簡單描述一下(這是我個人理解,還有很多細節沒寫)
系統通過掛載信息找到"/" --> 目錄項inode --> 目錄項block(block中存有文件名和文件對用的inode,如上圖中的python對應inode號碼1165874) --> 找到文件inode,驗證文件權限和屬性 --> 訪問文件block(block里存有文件數據)。


硬連接和軟連接

其實,硬連接和軟連接的區別很簡單的,下圖可以清晰說明了:

可以很清楚看到,文件名pythonpython2.4的inode是一樣的,而且,在藍色框那里,它們對應的數字都是2(這個2就是連接數)。沒錯,這就是硬連接
剩下的便是python2 -> python了,它的連接數為1,同時它的inode不同於其他的,但它指向了python,也就是說,inode號碼1156324指向了一個block,這個block內存有找到inode號碼1165874的信息,這便是軟連接,有很多人都說它就像windows上的快捷方式。


硬連接的限制

其他關於硬連接和軟連接的,網上一大把了。這里我再說一下硬連接的兩個主要限制:

  1. 不能跨文件系統。由於指向的是同一個inode,不同文件系統對inode的定義也不同。
  2. 不能連接到目錄。如果你為/etc創建一個硬連接/etc_hard,那么,/etc文件下的所有文件名也要同/etc_hard創建硬連接。每次修改/etc,系統也要修改/etc_hard.這樣,會造成很大的系統開銷。所以,目前還沒實現對目錄進行硬連接。

版權聲明:保留所有權,轉載需聲明出處。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM