Linux實體連結與符號連結:In

一、簡介

LInux下有兩種鏈接文件,一種是類似於windows 快捷方式,一種是通過filesystem的inode鏈接來產生新文件名,而不是產生新文件,這種成為實體鏈接(hard link)。


二、hard link

1、瞭解linux文件系統的小夥伴們都知道,linux中每個文件都會有一個inode來記錄文件內容的block號碼。

2、想要讀取一個文件,必須要通過目錄記錄的文件名來指向該文件正確的inode號碼。

以上兩點是理解hard link的關鍵,也就是說,文件名只與文件目錄有關,但是文件內容只與文件的inode有關,那麼我們可不可以這樣想呢,多個文件名連接到同一個inode號碼會發生什麼呢?

這就是hard link的由來,簡單來說hard link 只是某個文件目錄下的新增一個文件名鏈接到某個inode,

舉個例子:假設我係統有個 /root/shadowsocks.json 他是 /etc/shadowsocks.json的實體鏈接,也就是說這兩個文件名鏈接到同一個 inode , 自然這兩個文件名的所有相關信息都會一模一樣(除了文件名之外)。實際的情況可以如下所示

Linux實體鏈接與符號鏈接:In

圖1

hard link 的命令:ln /etc/shadowsocks.json .

Linux實體鏈接與符號鏈接:In

圖2

你可以發現兩個文件名都鏈接到 1688849860352829這個 inode 號碼,所以您瞧瞧,是否文件的權限/屬性完全一樣呢? 因為這兩個“文件名”其實是一模一樣的“文件”啦!而且你也會發現第二個字段由原本的 1 變成 2 了! 那個字段稱為“鏈接”,這個字段的意義為:“有多少個文件名鏈接到這個 inode 號碼”的意思。 如果將讀取到正確數據的方式畫成示意圖,就類似如下畫面:

Linux實體鏈接與符號鏈接:In

圖3 借用鳥哥的圖

一般來說,使用 hard link 設置鏈接文件時,磁盤的空間與 inode 的數目都不會改變! 我們還是由圖3 來看,由圖中可以知道, hard link 只是在某個目錄下的 block 多寫入一個關連數據而已,既不會增加 inode 也不會耗用 block 數量哩!

由圖 3 其實我們也能夠知道,事實上 hard link 應該僅能在單一文件系統中進行的,應該是不能夠跨文件系統才對! 因為圖 3就是在同一個 filesystem 上嘛!所以 hard link 是有限制的:

1、不能跨Filesystem

2、不能link目錄

不能跨 Filesystem 還好理解,那不能 hard link 到目錄又是怎麼回事呢?這是因為如果使用 hard link 鏈接到目錄時, 鏈接的數據需要連同被鏈接目錄下面的所有數據都創建鏈接,舉例來說,如果你要將 /etc 使用實體鏈接創建一個 /etc_hd 的目錄時,那麼在 /etc_hd 下面的所有文件名同時都與 /etc 下面的文件名要創建 hard link 的,而不是僅鏈接到 /etc_hd 與 /etc 而已。 並且,未來如果需要在 /etc_hd 下面創建新文件時,連帶的, /etc 下面的數據又得要創建一次 hard link ,因此造成環境相當大的複雜度。 所以囉,目前 hard link 對於目錄暫時還是不支持的啊!

三、Symbolic Link (符號鏈接,亦即是捷徑)

相對於 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在創建一個獨立的文件,而這個文件會讓數據的讀取指向他 link 的那個文件的文件名!由於只是利用文件來做為指向的動作, 所以,當來源文件被刪除之後,symbolic link 的文件會“開不了”, 會一直說“無法打開某文件!”。實際上就是找不到原始“文件名”而已啦!

舉個例子:

Linux實體鏈接與符號鏈接:In

圖4

看軟鏈接內部結構圖:

Linux實體鏈接與符號鏈接:In

圖5

由 1 號 inode 讀取到鏈接文件的內容僅有文件名,根據文件名鏈接到正確的目錄去取得目標文件的 inode , 最終就能夠讀取到正確的數據了。你可以發現的是,如果目標文件(/etc/crontab)被刪除了,那麼整個環節就會無法繼續進行下去, 所以就會發生無法通過鏈接文件讀取的問題了!

這裡還是得特別留意,這個 Symbolic Link 與 Windows 的捷徑可以給他劃上等號,由 Symbolic link 所創建的文件為一個獨立的新的文件,所以會佔用掉 inode 與 block 喔!

由上面的說明來看,似乎 hard link 比較安全,因為即使某一個目錄下的關連數據被殺掉了, 也沒有關係,不過由於 Hard Link 的限制太多了,包括無法做“目錄”的 link , 所以在用途上面是比較受限的!反而是 Symbolic Link 的使用方面較廣喔!好了, 說的天花亂墜,看你也差不多快要昏倒了!沒關係,實作一下就知道怎麼回事了!要製作鏈接文件就必須要使用 ln 這個指令呢!


分享到:


相關文章: