初窺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中的捷徑一樣。 總之:本人覺得硬串連與軟串連的一大區別就是硬串連不會建立一個新的檔案,而軟串連則會建立一個新的檔案來,這個檔案用來記錄它所串連的檔案的檔案名稱。