2014年10月1日 星期三

hard link&soft link



原理:soft link and hard link


 目前常見的檔案系統ext3與ext4都是以ext2為基礎改良而來,除了加上journal(日誌)功能外,還有支援存取更大檔案、磁碟分區,以及避免檔案在磁碟內分佈離散等新機制。以下將以較單純的ext2這個檔案系統為例來進行說明。


 ext2將檔案系統的屬性與內容分為inode(儲存檔案的屬性)與block(儲存檔案的內容)來儲存,其中,inode內包含了以下的檔案屬性資訊:
該檔案的擁有者與群組(owner/group);
該檔案允許的存取模式(read/write/execute);
該檔案的類型(type);
該檔案建立或狀態改變的時間(ctime)、最近一次的讀取時間(atime)、最近一次的修改時間(mtime);
該檔案的大小(size);
該檔案的特殊旗標(flag),如SetUID。


 而所有檔案要存放在磁碟內,都必須先取得一個inode,再透過inode來取得該檔案在此磁碟上的位置。對unix-like系統有使用經驗的朋友一定有用過symbolic link(或稱soft link,為方便讀者記憶,以下皆稱soft link)。所謂的soft link,就是一個包含路徑(path)的一個inode,但該inode並沒有指向到實際的block位置,因此,當symbolic link的目標路徑消失時(如:刪除、搬移等),則該link就會變成一個無效的link。


 許多人會將soft link當成類似windows作業系統下的“捷徑”來使用,或是當硬碟空間不夠時拿來跨硬碟掛載,是一個很實用的功能。但事實上,在unix-like下的檔案系統還有另一種大家較不熟悉的link,稱作hard link(這也是symbolic link會被稱為soft link的原因之一),兩者之間的差別在於:Hard link會與link的目標使用同一個inode,所以其指向的磁碟的實際位置以及檔案全部的屬性和原來的檔案一模一樣。


 一個檔案可以有無數個hard link,但對磁碟來說,存取的都是相同的一個檔案。是故所有的讀、寫甚至是屬性修改都是針對同一個檔案、磁碟位置來操作。


 如果想要知道檔案是否為hard link檔案,只要使用指令ls -l的時候便會顯示該檔案的link count數,代表該檔案的hard link有多少。刪除一個hard link,hard link count就會減一,直到刪除至link count為0後,才是真正的將該檔案自磁碟內刪除。


 需特別注意的是,因為hard link是使用同一個inode來取得磁碟的實際位置,而inode的分配是以partition為單位,不同的partition內的inode就不會有關聯,因此,hard link功能只限於在同一個partition內使用;如果是使用複製或搬移到另一個partition的情況下,就會在另一個partition建立實體檔案並消耗磁碟空間。此為hard link原理所造成的限制,也會是rsync、rsnapshot使用hard link技術備份時的限制。







Hard Link:在前一節當中,我們提到檔案的讀取方式為:(1)先由一層一層的目錄取得檔案相關的關連資料,(2)再到對應的 inode 取得檔案的屬性,以及檔案內容資料所在的 Block ,(3)最後到 Block area 取得檔案的資料。那麼 hard link 怎麼製作檔案的連結呢?!很簡單, Hard Link 只是在某個目錄下新增一個該檔案的關連資料而已!
 
舉個例子來說,我的 /home/vbird/crontab 為一個 hard link 的檔案,他連結到 /etc/crontab 這個檔案,也就是說,其實 /home/vbird/crontab 與 /etc/crontab 是同一個檔案,只是有兩個目錄( /etc 與 /home/vbird )記錄了 crontab 這個檔案的關連資料罷了!也就是說,我由 /etc 的 Block 所記錄的關連資料可知道 crontab 的 inode 放置在 A 處,而由 /home/vbird 這個目錄下的關連資料, crontab 同樣也指到 A 處的 inode !所以囉, crontab 這個檔案的 inode 與 block 都沒有改變,有的只是有兩個目錄記錄了關連資料。
 
一般來說,使用 hard link 設定連結檔時,磁碟的空間與 inode 的數目都不會改變!由上面的說明來看,我們可以知道, hard link 只是在某個目錄下的 block 多寫入一個關連資料,所以當然不會用掉 inode 與磁碟空間囉!(註:其實可能會改變的,那就是當目錄的 Block 被用完時,就可能會新加一個 block 來記錄,而導致磁碟空間的變化!不過,一般 hard link 所用掉的關連資料量很小,所以通常不會改變 inode 與磁碟空間的大小喔! )
 
由於 hard link 是在同一個 partition 上面進行資料關連的建立,所以 hard link 是有限制的:
 
不能跨 Filesystem;
不能 link 目錄。


Symbolic Link:


相對於 hard link , Symbolic link 可就好理解多了,基本上,他就是在建立一個獨立的檔案,而這個檔案會讓資料的讀取指向他 link 的那個檔案內容!由於只是利用檔案來做為指向的動作,所以,當來源檔被刪除之後,symbolic link 的檔案會『開不了』,會一直說『無法開啟某檔案!』。這裡還是得特別留意,這個 Symbolic Link 與 Windows 的捷徑可以給他劃上等號,由 Symbolic link 所建立的檔案為一個獨立的新的檔案,所以會佔用掉 inode 與 block 喔!


由上面的說明來看,似乎 hard link 比較安全,因為即使某一個目錄下的關連資料被殺掉了,也沒有關係,只要有任何一個目錄下存在著關連資料,那麼該檔案就不會不見!舉上面的例子來說,我的 /etc/crontab 與 /home/vbird/crontab 指向同一個檔案,如果我刪除了 /etc/crontab 這個檔案,該刪除的動作其實只是將 /etc 目錄下關於 crontab 的關連資料拿掉而已, crontab 所在的 inode 與 block 其實都沒有被變動喔!不過,不幸的是,由於 Hard Link 的限制太多了,包括無法做『目錄』的 link ,所以在用途上面是比較受限的!反而是 Symbolic Link 的使用方面較廣喔!好了,說的天花亂墜,看您也差不多快要昏倒了!沒關係,實作一下就知道怎麼回事了!要製作連結檔就必須要使用 ln 這個指令呢!

http://www.science.unitn.it/~fiorella/guidelinux/tlk/tlk-html.html

沒有留言:

張貼留言