Linux 系統(tǒng)中有軟鏈接和硬鏈接兩種特殊的“文件”。
軟鏈接可以看作是Windows中的快捷方式,可以讓你快速鏈接到目標(biāo)檔案或目錄。
硬鏈接則透過文件系統(tǒng)的inode來產(chǎn)生新檔名,而不是產(chǎn)生新檔案。
創(chuàng)建方法都很簡單:
軟鏈接(符號(hào)鏈接) ln -s?? source? target?
硬鏈接 (實(shí)體鏈接)ln ? ? ? source ?target
inode
要解釋清楚兩者的區(qū)別和聯(lián)系需要先說清楚 linux 文件系統(tǒng)中的 inode 這個(gè)東西。當(dāng)劃分磁盤分區(qū)并格式化的時(shí)候,整個(gè)分區(qū)會(huì)被劃分為兩個(gè)部分,即inode區(qū)和data block(實(shí)際數(shù)據(jù)放置在數(shù)據(jù)區(qū)域中)這個(gè)inode即是(目錄、檔案)文件在一個(gè)文件系統(tǒng)中的唯一標(biāo)識(shí),需要訪問這個(gè)文件的時(shí)候必須先找到并讀取這個(gè) 文件的 inode。 Inode 里面存儲(chǔ)了文件的很多重要參數(shù),其中唯一標(biāo)識(shí)稱作 Inumber, 其他信息還有創(chuàng)建時(shí)間(ctime)、修改時(shí)間(mtime) 、文件大小、屬主、歸屬的用戶組、讀寫權(quán)限、數(shù)據(jù)所在block號(hào)等信息。
通常會(huì)根據(jù)分區(qū)的用途來安排inode的數(shù)量(這是另外一個(gè)話題了),比如文件數(shù)量很多而文件都很小,則需要調(diào)增inode較大,以便能索引全部文件。否則將會(huì)出現(xiàn)這個(gè)分區(qū)并沒有寫滿而無法寫入任何文件的情況。
目錄文件與檔案文件
目錄文件:記錄該目錄下的文件名
檔案文件:記錄實(shí)際文件數(shù)據(jù)
inode本身并不記錄文件名,文件名記錄在目錄文件的block當(dāng)中,所以新增、刪除、更改文件名與目錄的W權(quán)限有關(guān)。因此當(dāng)我們要讀某個(gè)檔案時(shí),就務(wù)必經(jīng)過其目錄的inode和block,然后才能夠找到待讀取檔案的inode號(hào),最終才會(huì)讀到正確的檔案block內(nèi)的數(shù)據(jù)。系統(tǒng)是通過索引節(jié)點(diǎn)(而不是文件名)來定位每一個(gè)文件。
目錄inode(滿足權(quán)限?) => 目錄block => 檔案inode(滿足權(quán)限?) => 檔案block
硬鏈接
多個(gè)檔名對(duì)應(yīng)同一個(gè)inode,硬鏈接只是在某個(gè)目錄下新增一筆檔名鏈 接到某個(gè)inode號(hào)碼的關(guān)聯(lián)記錄而已。如果將上圖中任何一個(gè)檔名刪除,檔案的inode與block都還存在,依然還可以通過另一個(gè)檔名來讀取正確的檔 案數(shù)據(jù)。此外,不論用哪一個(gè)檔名來編輯,最終的結(jié)果都會(huì)寫入相同的inode和block中,因此均能進(jìn)行數(shù)據(jù)的修改。
軟連接
軟連接就是建立一個(gè)獨(dú)立的文件,而這個(gè)文件會(huì)讓數(shù)據(jù)的讀取指向它link的那個(gè)檔案的檔名,由于只是作為指向的動(dòng)作,所以當(dāng)來源檔案被刪除之后,軟連接的檔案無法開啟,因?yàn)檎也坏皆紮n名。連結(jié)檔的內(nèi)容只有檔名,根據(jù)檔名鏈接到正確的目錄進(jìn)一步取得目標(biāo)檔案的inode,最終就能夠讀取到正確的數(shù)據(jù)。如果目標(biāo)檔案的原始檔名被刪除了那么整個(gè)環(huán)節(jié)就進(jìn)行不下去了。
下面用一個(gè)實(shí)例來說明硬鏈接和軟鏈接。
現(xiàn)在目錄下有兩個(gè)文件,一個(gè)名為AAA,一個(gè)名為BBB。
引用
$ ls -il
963922 -rw-r--r-- 1 ocean ocean 92 2007-05-18 15:46 AAA
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
首先先做一個(gè)AAA的硬鏈接。
引用
$ ln AAA AAAhard
$ls -il
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
這里我們注意在創(chuàng)建鏈接前,AAA顯示的鏈接數(shù)目為1,創(chuàng)建鏈接后
1.AAA和AAAhard的鏈接數(shù)目都變?yōu)?。
2.AAA和AAAhard的inode號(hào)是一樣的,都是963922。
3.AAA和AAAhard顯示的文件大小也是一樣,都是92B。
可見進(jìn)行了ln命令的操作結(jié)果:AAA和AAAhard是同一個(gè)文件的兩個(gè)名字, 它們具有同樣的索引節(jié)點(diǎn)號(hào)和文件屬性,建立文件AAA的硬鏈接,就是為 AAA的文件索引節(jié)點(diǎn)在當(dāng)前目錄上建立一個(gè)新指針。你可以刪除其中任何一個(gè),如rm AAA,每次只會(huì)刪除一個(gè)指針,鏈接數(shù)同時(shí)減一,只有將所有指向文件內(nèi)容的指針,也即鏈接數(shù)減為0時(shí),內(nèi)核才會(huì)把文件內(nèi)容從磁盤上刪除。
盡管硬鏈接節(jié)省空間,也是Linux系統(tǒng)整合文件系統(tǒng)的傳統(tǒng)方式,但是存在一些不足之處:
1.不允許給目錄創(chuàng)建硬鏈接。
2.不可以在不同文件系統(tǒng)的文件間建立鏈接。因?yàn)?inode 是這個(gè)文件在當(dāng)前分區(qū)中的索引值,是相對(duì)于這個(gè)分區(qū)的,當(dāng)然不能跨越文件系統(tǒng)了。
接著我們做一個(gè)指向BBB的軟鏈接,軟鏈接克服了硬鏈接的不足,沒有任何文件系統(tǒng)的限制,任何用戶可以創(chuàng)建指向目錄的符號(hào)鏈接。因而現(xiàn)在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機(jī)器、不同網(wǎng)絡(luò)對(duì)文件進(jìn)行鏈接。
引用
$ ln -s BBB BBBsoft
$ ls -il
總用量 0
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
963924 lrwxrwxrwx 1 ocean ocean 3 2007-05-18 15:47 BBBsoft -> BBB
從上面鏈接后的結(jié)果可以看出來軟鏈接與硬鏈接,區(qū)別不僅僅是在概念上,在實(shí)現(xiàn)上也是完全不同的。
區(qū)別:
1.硬鏈接原文件/鏈接文件公用一個(gè)inode號(hào),說明他們是同一個(gè)文件,而軟鏈接原文件/鏈接文件擁有不同的inode號(hào),表明他們是兩個(gè)不同的文件;
2.在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈接沒有寫出來,因?yàn)樵诒举|(zhì)上硬鏈接文件和原文件是完全平等關(guān)系;
3.鏈接數(shù)目是不一樣的,軟鏈接的鏈接數(shù)目不會(huì)增加;
4.文件大小是不一樣的,硬鏈接文件顯示的大小是跟原文件是一樣的。而這里軟鏈接顯示的大小與原文件就不同了,BBB大小是95B,而BBBsoft是3B。因?yàn)锽BB共有3個(gè)字符
5.軟鏈接沒有任何文件系統(tǒng)的限制,任何用戶可以創(chuàng)建指向目錄的符號(hào)鏈接
總之,建立軟鏈接就是建立了一個(gè)新文件。當(dāng)訪問鏈接文件時(shí),系統(tǒng)就會(huì)發(fā)現(xiàn)他是個(gè)鏈接文件,它讀取鏈接文件找到真正要訪問的文件。
當(dāng)然軟鏈接也有硬鏈接沒有的缺點(diǎn):因?yàn)殒溄游募性募穆窂叫畔?,所以?dāng)原文件從一個(gè)目錄下移到其他目錄中,再訪問鏈接文件,系統(tǒng)就找不到了,而硬鏈接就沒有這個(gè)缺陷,你想怎么移就怎么移;還有它要系統(tǒng)分配額外的空間用于建立新的索引節(jié)點(diǎn)和保存原文件的路徑。
?
評(píng)論