在linux的學習過程中,鏈接文件的學習讓不少人頭疼,很多同學往往分不清什么是硬鏈接,什么是軟鏈接,對于兩者的概念和區別常常容易混淆、搞不清楚。今天我們就從原理、從根本上為大家辨析一些兩者之間的區別,相信大家在看完這篇文章之后對鏈接文件會有一個清晰正確的認識。
1、在實現原理上不同
硬鏈接,涉及到文件的底層模式,因此被稱為硬鏈接文件。硬鏈接文件只是一個指針指向,確切的說并不是一個真正的文件,它只有一個文件名和指向原文件inode的指針,并沒有分配自身的inode和datablock。
軟鏈接,并不涉及文件系統底層,完全是靠軟件方式實現的,因此被成為軟鏈接。軟鏈接文件是一個獨立的文件,他的創建是需要單獨分配相應的inode和datablock。軟鏈接文件的inode是一個全新的inode,而datablock里面的內容所記錄的是,指向原文件的一個路徑和文件名。
2、跨分區鏈接
由于硬鏈接的創建需要從底層硬件上去指向特定的inode,而每個分區在格式化時都有自己單獨的一套inode和datablock分配機制,因此為了保證inode指向的唯一性,硬鏈接通常只能在同分區內創建。
而軟鏈接只是存儲了原文件的訪問路徑,不涉及到inode的跨分區問題,因此在跨分區鏈接的創建上更為方便。
3、資源分配上
從硬鏈接和軟鏈接的實現原理上我們可以看出,軟鏈接創建出了一個全新的文件,而硬鏈接只是做了一個指針的指向??梢钥闯鲇叉溄邮遣环峙鋓node和datablock的,因此通常不占用系統資源和空間。
而軟鏈接則會消耗系統inode和datablock資源,會占用一定的硬盤空間。需要說明的是軟鏈接所占用的空間,其實并不大,因為它是文件內容,存儲的只是指向原文件的一個訪問路徑,文件的大小為路徑所占空間。
4、文件屬性信息
硬鏈接由于指向的是原文件的inode,實質上硬鏈接和原文件其實是一個文件,只是文件名不同,因此硬鏈接文件與原文件在inode編號、文件權限、屬主屬組關系、時間戳及大小等屬性上是完全相同的。但由于有兩個指針指向同一個inode編號,因此創建硬鏈接,硬鏈接文件和原文件的硬鏈接數會加1,當刪除時硬鏈接數減1。
軟鏈接由于是一個全新的獨立的文件,因此由于自己單獨的inode和創建時間、屬主屬組信息,但權限信息上全部是rwx。軟鏈接的創建、刪除不會影響到硬鏈接數。
5、當原文件被刪除、新建時
當原文件被刪除時,實質上操作系統所做的并不是馬上刪除文件的數據和所占用的系統資源。系統所做的操作,首先是刪除原文件的文件名對inode的指針指向,并刪除文件名記錄,同時會檢查原文件所對應inode的指向數量,即硬鏈接數。如果硬鏈接數減1后大于0,則只是將硬鏈接數減1;如果硬鏈接數減1后為0,則說明沒有指針指向該數據,則會把對應的inode和datablock標記為刪除或可用(只是做了一個標記)。
因此,我們可以看出當原文件被刪除后,inode和datablock實際上并沒有被刪除,由于仍然有硬鏈接指向該inode,因此也不會被標記為刪除,所以對于硬鏈接來說,刪除原文件,硬鏈接文件仍然是可以正常訪問的,并且訪問結果仍然是原文件的內容。
而對于軟鏈接來說,其做的只是標記了原文件的訪問路徑和文件名,當原文件被刪除后,原文件對數據的inode指向及文件名都會被刪除;對于鏈接文件來說,就相當于訪問路徑上的文件已經不存在了,因此也就無法再找到原文件的數據,軟鏈接的訪問失效。
在原文件被刪除后,如果再新建一個與原文件同名的文件,我們暫時把它叫做新文件吧。這時候我們會發下軟鏈接文件又可以用了。但是我們會發行軟鏈接指向的是新文件,訪問軟鏈接得到的不是原文件的內容,而是新文件的內容。當我們訪問硬鏈接是時候我們會發行訪問的仍然是原文件的信息,用ls -il來進行查看會發現新文件和硬鏈接文件的inode編號完全不同,并且硬鏈接數也不會增加。
6、創建鏈接文件時使用相對路徑
在創建鏈接文件的時候我們可以使用絕對路徑,但在有的時候我們會覺得使用相對路徑會更有必要。但在使用相對路徑來創建鏈接文件的時候會有較大的差異。
在創建硬鏈接文件的時候,由于指向的是原文件的inode,因此只要在創建的時候使用的路徑能夠找到對應的原文件,獲得原文件的inode信息即可創建硬鏈接文件,因此無論使用絕對路徑還是相對路徑都可以成功創建硬鏈接。
但在創建軟鏈接的時候,我們會發現出了點問題。在使用絕對路徑創建軟鏈接的時候很順利,在使用相對路徑來指向原文件的時候也很正常,但當鏈接文件和原文件不在同一路徑而使用相對路徑來指向鏈接文件的時候卻發現創建的鏈接文件是無效的。這是為什么呢???其實也很好理解,因為我們要通過鏈接文件找到原文件,而不是通過原文件找到鏈接文件,而鏈接文件存放的也是指向原文件的訪問路徑,所以在使用相對路徑來創建軟鏈接文件的時候就必須要使用鏈接文件指向原文件的相對路徑。也就是說使用相對路徑來創建軟鏈接文件的時候,鏈接文件的相對路徑必須是當前目錄,原文件使用的相對路徑要使用相對要創建的鏈接文件的相對路徑。
關于這點,就有引申出來一個問題。當鏈接文件被復制、移動到其他目錄,其自身的訪問路徑發生改變的時候,如果軟鏈接使用的是相對鏈接,就會出現軟鏈接無法訪問的情況。但是硬鏈接文件和使用絕對鏈接的軟鏈接則不會出現訪問問題。
7、對目錄創建鏈接
軟鏈接是可以直接鏈接向目錄的,這個很容易理解。但是在linux系統中原則上(當然如果非要創建目錄的硬鏈接,在技術上也是可以實現的)是不能創建目錄的硬鏈接的,即硬鏈接不能鏈接到目錄。這個大致可以從以下方面來理解。
從文件系統方面來講,我們知道linux的文件系統是典型的樹型結構,在使用軟鏈接的時候,軟鏈接本質上還是一個文件,但硬鏈接則是在文件系統本質上的一個指向,這嚴重的破壞了系統的文件結構。因為軟鏈接有單獨的inode是一個新的文件,對于電腦來說只是一個普通的文件來對待的,但是系統無法分別硬鏈接的兩個文件哪個是原文件、哪個是新創建的鏈接文件,而目錄是一個樹的非葉子節點。當然對于目錄不能創建硬鏈接,還有很多其他方面的諸多因素,對于這些因素并沒有絕對的說法,在這里我們就不再一一分析列舉,感興趣的同學可以自行查閱相關資料深入研究。
雖然說目錄不能創建硬鏈接,但當我們使用ls -l命令來查看目錄文件的時候會發現,目錄文件的硬鏈接數并不是1,并且當我們在目錄下創建新子目錄的時候會發現,目錄的硬鏈接數增加了。這究竟是怎么回事呢???其實當你使用ls -ali 來查看目錄下的內容的時候就會發現,每個目錄下有兩個特殊的目錄指向 “.”和“..”。因此當一個目錄被創建的時候,除了自身的鏈接數1之外,還有目錄下面的一個“.”是指向該目錄本身的,而在目錄下創建子目錄的時候,子目錄中的“..”指向其父目錄,也是指向該目錄的。并且你會發行這些特殊目錄的inode編號與目錄的inode編號是相同的,也就是說他們都是目錄的一個硬鏈接。
8、如何看一個文件是硬鏈接還是軟鏈接
以上我們已經為大家辨析了什么是硬鏈接、什么是軟鏈接以及兩者之間有什么異同,知道通過軟鏈接和硬鏈接我們都可以很方便的直接訪問到原文件,但我們如何知道一個鏈接文件是軟鏈接還是硬鏈接呢?
A、使用ls -i,如果兩個文件的inode編號相同,則可以知道這兩個文件是硬鏈接文件。
B、使用ls -l,如果文件類型位置是”l”,則該文件是一個軟鏈接文件,在文件名的位置我們同時能夠看到鏈接文件指向的原文件位置。
原創文章,作者:M21-張國輝,如若轉載,請注明出處:http://www.www58058.com/53142