這篇文章能讓你徹底搞懂硬鏈接和軟鏈接,希望耐心讀完!
在開始講解之前,咱們先過一下咱們學(xué)習(xí)一個概念或者某個知識點的方法:
第一步:我們得知道這個東西是個啥?【W(wǎng)HAT】
第二步:這個東西有什么用,為什么有這么個東西?【W(wǎng)HY】
第三步:這個東西咋么用?【HOW】
來我們按部就班,先來第一步:硬鏈接和軟鏈接是啥?
硬連接指通過索引節(jié)點來進(jìn)行連接。
在Linux的文件系統(tǒng)中,保存在磁盤分區(qū)中的文件不管是什么類型
都給它分配一個編號,稱為索引節(jié)點號(Inode Index)。
在Linux中,多個文件名指向同一索引節(jié)點是存在的。一般這種連接就是硬連接。
另外一種連接稱之為符號連接(Symbolic Link),也叫軟連接。
軟鏈接文件有類似于Windows的快捷方式。
它實際上是一個特殊的文件。在符號連接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息
這是我在其他文章里copy過來的解釋??赐昴銇須獠??這講的是啥?。恐v完了我還是沒理解硬鏈接和軟鏈接是個啥東西。
為什么沒看明白呢? 咀嚼了幾遍后,我發(fā)現(xiàn)原因是我不理解索引節(jié)點Inode是什么東西,看這個解釋的意思是軟硬鏈接是依賴這個索引節(jié)點的,那么首先,咱們來搞懂什么是Inode。
又來新概念了,老樣子,三步走:
第一步【W(wǎng)HAT】:Inode是個啥?
第二步【W(wǎng)HY】:Inode有啥用?Inode誕生的原因是啥?【待補(bǔ)充】
第三步【HOW】:Inode咋用?【待補(bǔ)充】
Inode是啥?
首先大家得知道文件,咱們在操作系統(tǒng)上都創(chuàng)建、修改或者刪除過,這個東西咱們熟啊,那些深夜學(xué)習(xí)的資料,都是以mp4格式存在我E盤呢,當(dāng)然這是windows系統(tǒng)了。
在linux系統(tǒng)里,文件包含兩部分?jǐn)?shù)據(jù):
第一部分是真實的文件數(shù)據(jù),也就是你數(shù)據(jù)的內(nèi)容。比如,你在你系統(tǒng)里偷偷建了個文件,名稱叫《北京富婆通訊錄》,那么這部分?jǐn)?shù)據(jù)存儲的就是富婆的電話、地址、照片、三圍、財產(chǎn)等等等了;
第二部分是存儲文件的元數(shù)據(jù)信息,比如文件的創(chuàng)建者、文件的創(chuàng)建時間、文件大小等等。這種存儲文件元數(shù)據(jù)的存儲區(qū)域就叫做INODE,中文譯名“索引節(jié)點”。通過索引節(jié)點,可以迅速定位到真實的文件數(shù)據(jù)。
【看完這個介紹,怎么那么像mysql的innodb索引呢?誰能回答一下?】
上面對INODE做了個簡單介紹,大家有了個概念,就是個存儲文件元數(shù)據(jù)的地方,還以為有多神秘呢。下面咱們對INODE的幾個屬性做下簡單了解,以便更深刻的理解INODE。
Inode的內(nèi)容
inode包含文件的元信息,每個文件對應(yīng)一個Inode,它具體有以下內(nèi)容:
* 文件的字節(jié)數(shù)
* 文件擁有者的User ID
* 文件的Group ID
* 文件的讀、寫、執(zhí)行權(quán)限
* 文件的時間戳,共有三個:ctime指inode上一次變動的時間,
mtime指文件內(nèi)容上一次變動的時間,atime指文件上一次打開的時間。
* 鏈接數(shù),即有多少文件名指向這個inode
* 文件數(shù)據(jù)block的位置
可以用stat命令查看:

除了文件名之外的信息都在inode之中。為什么沒有文件名,下面講。
Inode的大小
Inode既然存儲了文件的元數(shù)據(jù),那必然是占用存儲空間的。需要注意的是,Inode的大小,在磁盤格式化的時候,就已經(jīng)決定了。硬盤格式化的時候,操作系統(tǒng)會將硬盤分成兩個區(qū),一個是數(shù)據(jù)區(qū)域,存放文件數(shù)據(jù);另一個就是inode區(qū)(inode table),存放inode所包含的信息。
每個Inode的大小,一般是128字節(jié)或者256字節(jié),一般會為1KB或者2KB就設(shè)置一個Inode,在格式化的時候就給定。假設(shè)一塊1G的硬盤,每個Inode的大小為128字節(jié),每1KB就設(shè)置一個Inode,那么 inode table的大小就是 1GB/1KB * 128byte = 128M,占這個硬盤的12.5%。
由于每個文件都必須有一個inode,因此有可能發(fā)生inode用光了, 但是磁盤未滿的情況。
Inode的編號
每個inode都有一個編號,用于操作系統(tǒng)來識別inode。值得一提的是,操作系統(tǒng)不會在意文件名,而是通過inode編號來識別文件。對操作系統(tǒng)來說,文件名只是inode編號的別稱或者綽號。
用戶通過文件名打開文件,實際上,操作系統(tǒng)內(nèi)部這個過程分為三步:
1. 通過文件名找到inode編號;
2. 根據(jù)inode編號獲取inode信息;
3. 根據(jù)inode信息找到數(shù)據(jù)文件所在磁盤區(qū)域;
采用ls -i 命令可以查看文件的inode編號。

以上,咱們終于對Inode有了個基本認(rèn)識,總結(jié)一句話就是存儲文件元數(shù)據(jù)的地方。
硬鏈接和軟鏈接
現(xiàn)在,咱們再來回頭看硬鏈接和軟連接。
重新來給硬鏈接下個定義:
一般情況下,文件名和inode編號是 “一一對應(yīng)”的關(guān)系。
但是,在linux系統(tǒng)中,允許多個文件名,對應(yīng)一個inode編號。
這種多個文件名對應(yīng)同一個Inode的情況,稱之為硬鏈接。
模型圖類似這樣:

第一步硬鏈接是什么咱們知道了。那么它有什么作用呢?
我們看,兩個文件名有同一個Inode編號,那說明,這兩個文件名指向的就是同一個數(shù)據(jù)文件嘛,相當(dāng)于一個人有兩個名字。這樣做的好處是啥?
避免誤刪。多個硬鏈接指向的同一個文件,只有在所有鏈接都被刪除后,文件才會被刪除。
軟連接:
文件A和文件B的inode號碼不一樣,但是文件A的內(nèi)容是文件B的路徑。
讀取文件A時自動將訪問導(dǎo)向B。無論打開哪個文件,讀取的都是B。文件A就稱為文件B的軟連接。
模型圖類似這樣:

看了上述的概念,讓我想到了C語言的指針。
軟鏈接的作用:如果你想在你刪除某個文件后,其他對這個文件的鏈接都同時失效的話,使用軟連接是非常合適的。
到這里基本上硬鏈接和軟鏈接講完了,至于最后一步怎么用,其實差不多已經(jīng)講過了。有的時候,一個東西的誕生其實就是為了滿足某種需求,知道為什么誕生也就知道怎么用了。