初窺Linux之區分硬連接和軟連接
一、Linux下的兩種連接文件及創建方式
在Linux下面的連接文件有兩種——軟連接和硬連接,雖然都是連接文件,但兩者卻有很大的區別。一種是類似於Windows的快捷方式功能的文件(或目錄),這種連接稱為軟連接;另一種則是通過文件系統的inode連接來產生新文件名,而不是產生新文件,這種稱為硬連接。
創建連接文件的方法非常簡單,就是使用ln命令,ln file1 file2,則創建硬連接,file2為file1的硬連接,ln -s file1 file2,則創建軟連接,file2為file1的軟連接。
二、詳述硬連接
為了讓大家更好地了解這兩種連接的差別,這裡先說說硬連接吧,因為它比軟連接要難理解一些。
我們知道,在Linux下,每個文件都會占用一個inode,文件內容由inode的記錄來指向,而想要讀取文件,必須要經過目錄記錄的文件名來指向正確的inode號碼才能讀取,也就是說,其實文件名只與目錄有關,但是文件的內容則與inode有關。
那什麼硬連接呢?就是在某個目錄下新建一條文件名連接到某inode號碼的關聯記錄而已,簡單來說,就是有多個文件名對應到同一個inode號碼,注意,是多個文件名,不是多個文件。
看到這裡可能你也是一頭霧水,那麼請看下面的例子吧
在這裡我創建了一個硬連接,並查看了相關文件的inode,從結果可以看出,這兩個文件的inode是完全相同的(394220),而文件連接數則不是1而是2,而且crontab的文件類型是“-”而不是“l”,即它不是一個連接文件,這是因因為有兩個文件連接到了同一個文件/etc/crontab啊。為什麼會如此神奇,就用下面的圖來解釋一下吧
從圖中可以看到,你可以通過1或2的目錄inode所指定的block找到兩個不同的文件名,而不管使用哪個文件名均可以找到real這個inode,並通過這個inode去讀取到最終的數據。
一般來說,使用硬連接(hard link)設置連接文件,磁盤的空間與inode的數目是不會變的,它只是在某個目錄下的block多寫入一個關聯數據而已,既不會耗用inode也不會耗用block數量。
可能你會反駁說,不對,建立/root/crontab的那個文件不也需要一個inode和blocks嗎?如圖中的inode1不就是建立這個連接所要用的一個inode嗎?其實不是這樣理解的,因為/root這個目錄早已在,而它裡面的內容也早已記錄在這個block中,即無論你添加還是不添加一個硬連接inode1和它所指向的那個目錄的block都已經存在了,你建立的硬連接只是在這個inode1所指向的block中添加一條文件名的記錄而已,在這個例子中,就是添加/root/crontab這條記錄。所以沒有增加inode和block的耗用。
三、詳述軟連接
相對於硬連接,軟連接(symbolic link)就更好理解了,基本上軟連接就是在創建一個獨立的文件,而這個文件會讓數據的讀取指向指向它連接的那個文件的文件名。即只是利用文件來作為指向的操作,所以,當源文件被刪除後,軟連接會“打不開”,出現的情況就像大家熟悉的Windows中那樣,提示“無法打開某個文件”。
請看下面的例子
我創建了一個軟連接,從輸出的結果中,我們可以看出它與硬連接的確是非常的不同。首先,這兩個文件的inode號碼並不相同,再者在文件類型方面,/etc/crontab為“-”,即普通的文件,而/root/crontab_sl則為“l”,即連接文件。
那軟連接文件,即此例子中的crontab_sl文件裡面的內容是什麼呢?大家可以看到它的大小只12B,其實它的內容就是“/etc/crontab”這12個字符而已。
還不是很明白?那就用下面的圖來說明吧
上圖表示,由inode1讀取到連接文件的內容僅有文件名,根據文件名連接到正確的目錄去取得目標文件的inode,最終就能夠讀取到正確的數據了。
從上面的輸出結果中,大家應該已經看到軟連接是要耗用inode和block的(因為inode號與源文件的inode不相同),對應上圖就是耗用了inode1和它所指向的block,它與硬連接的不同之處在於,inode1在創建這個軟件文件之前是沒有被使用的inode,它不指任何的block,也是說圖中它所指向的block也不沒有被利用的。當要創建軟連接時,inode1和它所指向的block才被利用了。而且這個block不是用來記錄文件名的,而是真真正正的一個文件,用來記錄文件信息,例如這裡它的信息是“/etc/crontab”這12個字,它是放在目錄/root下的文件。
四、軟連接與硬連接優缺點分析
1、硬連接
硬連接比較安全,因為即使某一個目錄下的關聯數據被刪除了也沒有關系,只要有任何一個目錄下存在著關聯數據,那麼該文件就不會被刪除,而且硬連接還不需要耗用inode和block,但是硬連接也有其限制,就是不能跨文件系統也不能連接到目錄。
注:在硬連接中,刪除文件時,只有當連接數為0時,才能文件真正刪除,否則只會把文件的連接數減1。
2、軟連接
軟件連接比較靈活,可以連接到文件和目錄,但是它會耗用inode和block,不過這對於系統來說其實不算什麼,但是如果目標文件被刪除了,從最後一幅圖可以看出,整個環節就會無法繼續下去,會發生無法通過連接文件讀取的問題。其實軟連接就你Windows中的快捷方式一樣。
總之:本人覺得硬連接與軟連接的一大區別就是硬連接不會創建一個新的文件,而軟連接則會創建一個新的文件來,這個文件用來記錄它所連接的文件的文件名。