背景:
當幾個用戶同在一個項目里工作時。經常須要共享文件。
假設一個共享文件同一時候出如今屬于不同用戶的不同文件夾下。工作起來就非常方便。
比如B和C文件夾下有一文件D是兩者都能夠訪問和改動的共享文件,這樣是非常方便,但也會有一些問題,假設文件夾中包括磁盤地址,則當連接文件時。必須把C文件夾中的磁盤地址拷貝到B文件夾中,假設B或C隨后又往該文件里加入內容,則新的數據塊將僅僅列入進行加入工作的用戶的文件夾中。
其它的用戶對此改變是不知道的。違背了共享的目的。
兩種方法解決這樣的問題。
方法一:硬鏈接(實體連接或實際連接)
透過文件系統的inode 連結來產生新檔名。而不是產生新檔案!這樣的又稱 為實體鏈接 (hardlink).
· 每一個檔案都會占用一個inode ,檔案內容由 inode的記錄來指向;
· 想要讀取該檔案。必項要經過文件夾記錄的文件名稱來指向到正確的inode 號碼才干讀取。??? 也就是說,事實上文件名稱僅僅與文件夾有關,可是檔案內容則與 inode 有關。那舉想一想, 有沒有可能有多個檔名相應到同一個 inode 號碼呢?有的!那就是 hard link 的由來。
所以簡單的說:hard link 僅僅是在某個文件夾下新增一筆檔名鏈接到某 inode 號碼的關連記彔而已。
[
舉個樣例來說。如果我系統有個 /root/crontab 他是 /etc/crontab 的實體鏈接,也就是說這兩個檔名 連結到同一個 inode ,自然這兩個文件名稱的全部相關信息都會一模一樣(除了文件名稱之外)。實際的情況能夠例如以下所看到的:
你能夠發現兩個檔名都連結到 1912701 這個 inode 號碼。所以您瞧瞧。是否檔案的權限/屬性全然一 樣呢? 由于這兩個『檔名』事實上是一模一樣的『檔案』啦!并且你也會發現第二個字段由原本的 1 發 成 2 了。 那個字段稱為『連結』。這個字段的意義為:『 有多少個檔名鏈接到這個 inode 號碼』的意思。
假設將讀取到正確數據的方式畫成示意圖。就類似例如以下畫面:
你能夠透過 1 或 2 的文件夾的 inode 指定的block 找到兩個不同的檔名,而無論使用哪 個檔名均能夠指到 real 那個 inode 去讀取到終于數據!那這樣有優點呢?最大的優點就是『安 全』!
如同上圖中, 假設你將不論什么一個『檔名』刪除,事實上 inode 與 block 都還是存在的!
此時你能夠透過還有一個『檔名』來讀取到正確的檔案數據喔!此外,不論你使用哪個『檔名』來編輯,終于的結果都會寫入到同樣的 inode 與block 中。因此均能進行數據的改動。攻克了上述的問題,一般來說,使用 hard link 設定鏈接文件時,磁盤的空間與 inode 的數目都不會改發。我們還是由圖 2.2.1 來看,由圖中能夠知道。 hard link 僅僅是在某個文件夾下的 block 多寫入一個關連數據而已。既不會添加 inode 也不會耗用 block 數量。
Tips:
簡單來講:硬鏈接就是同一文件使用了多個別名(有共同的inode),是不同的文件指向同樣的inode。達到文件共享的目的;
長處:安全,改動同步。刪除一個硬鏈接文件并不影響其它有同樣inode號的文件;
缺點:不能跨 Filesystem,不能 link 文件夾。
不能跨Filesystem:由圖 2.2.1 其實我們也可以知道,其實 hard link 應該僅能在單一文件系統中進行的。應該是不可以跨文件系統才對!
由于圖 2.2.1 就是在同一個 filesystem 上嘛!所以 hard link 是有限制的。
不能link文件夾:由于假設使用 hard link 鏈接到目彔時, 鏈接癿數據須要連同被鏈接目彔底下的全部數據都建立鏈接,舉例來說,假設你要將 /etc 使用實體鏈接建立一個 /etc_hd 的目彔時。那舉在 /etc_hd 底下的全部檔名同一時候都與/etc 底下的檔名要建立 hard link 的。而不是僅連結到 /etc_hd 與/etc 而已。
而且,未來假設須要在 /etc_hd 底下簡歷新檔案時,連帶的/etc底下的數據又得要建立一次hard link,因此造成環境相當大的復雜度。所以不能link文件夾。
hard link?的制作中,事實上還是可能會改發系統的block。那就是當你新增這筆數
據卻剛好將文件夾的block 填滿時。就可能會新加一個block 來記錄文件名稱關連性。
而尋致磁盤空間的變化。只是。一般 hard link 所用掉的關連數據量非常小。所以通常
不會改發 inode 與磁盤空間的大小喔
方法二:軟鏈接(符號連接即快捷方式)
相對于hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在建立一個獨立的檔案,而這個檔案會讓數據 的讀取指向他link的那個檔案的檔名。由與僅僅是利用檔案來做為指向的動作, 所以。當來源檔被刪除之后。symboliclink 的檔案會『開不了』 , 會一直說『無法開啟某檔案!』。實際上就是找不到原始『檔名』而已啦!
舉例來說,我們先建立一個符號鏈接文件鏈接到 /etc/crontab 去看看:
我們能夠知道兩個檔案指向不同的iode 號碼,當然就是兩個獨立的檔案存在! 并且連結檔的重要內容就是他會寫上目標檔案的『文件名稱』 , 你能夠發現為什么上表中連結檔的大小為 12 bytes 呢? 由于箭頭(-->)右邊的檔名『 /etc/crontab』總共同擁有 12 個英文。每一個英文占用 1 個 byes , 所以檔案大小就是12bytes 了。 關于上述的說明,我們以例如以下圖示來解釋:
由 1 號 inode 讀取到連結檔的內容僅有檔名,依據檔名鏈接到正確的目彔去取得目標檔案的inode , 終于就能夠讀取到正確的數據了。你能夠發現的是。假設目標檔案(/etc/crontab)被刪除了,那整個環節就會無法繼續進行下去。所以就會產生無法透過連結檔讀取的問題了! 這里還是得特別留意,這個 Symbolic Link 與 Windows 的快捷方式能夠給他劃上等號,由 Symbolic link 所建立的檔案為一個獨立的新的檔案。所以會占用掉 inode 與 block 喔! 由上面的說明來看。似乎 hard link 比較安全。由于即使某一個目彔下的關連數據被殺掉了, 也沒有關系,僅僅要有不論什么一個目彔下存在著關連數據,那舉該檔案就不會不見!舉上面的樣例來說,我的 /etc/crontab 與 /root/crontab 指向同一個檔案,假設我刪除了 /etc/crontab 這個檔案,該刪除的動作事實上僅僅是將 /etc 目彔下關于crontab 的關連數據拿掉而已, crontab 所在的 inode 與 block 事實上都沒有變動。
軟鏈接:文件用戶數據中有效的內容是還有一文件的路徑名的指向。是一普通文件,數據塊有點特殊。刪除軟鏈接不影響源文件。
長處:方便,能夠用到文件夾。
僅僅要簡單地提供一個機器的網絡地址以及文件在該機器上駐留的路徑。就能夠連接全球不論什么地方機器上的文件。
缺點:須要額外的開銷。必須讀取包括路徑的文件,然后要一個部分一個部分的掃描路徑,直到找到inode節點,也須要額外的磁盤存取。刪除源文件,鏈接文件為死文件。
由于硬鏈接應用受到限制。軟鏈接應用較為廣泛。