理解Linux的硬鏈接與軟鏈接(二)
我們繼續(xù)這個(gè)系列,來(lái)看一些你所不知道的微妙之處。
在本系列的***篇文章中,我們認(rèn)識(shí)了硬鏈接、軟鏈接,知道在很多時(shí)候鏈接是非常有用的。鏈接看起來(lái)比較簡(jiǎn)單,但是也有一些不易察覺(jué)的奇怪的地方需要注意。這就是我們這篇文章中要講的。例如,像一下我們?cè)谇耙黄恼轮袆?chuàng)建的指向 libblah
的鏈接。請(qǐng)注意,我們是如何從目標(biāo)文件夾中創(chuàng)建鏈接的。
cd /usr/local/lib
ln -s /usr/lib/libblah
這樣是可以工作的,但是下面的這個(gè)例子卻是不行的。
cd /usr/lib
ln -s libblah /usr/local/lib
也就是說(shuō),從原始文件夾內(nèi)到目標(biāo)文件夾之間的鏈接將不起作用。
出現(xiàn)這種情況的原因是 ln
會(huì)把它當(dāng)作是你在 /usr/local/lib
中創(chuàng)建一個(gè)到 /usr/local/lib
的鏈接,并在 /usr/local/lib
中創(chuàng)建了從 libblah
到 libblah
的一個(gè)鏈接。這是因?yàn)樗墟溄游募@取的是文件的名稱(chēng)(`libblah),而不是文件的路徑,最終的結(jié)果將會(huì)產(chǎn)生一個(gè)壞的鏈接。
然而,請(qǐng)看下面的這種情況。
cd /usr/lib
ln -s /usr/lib/libblah /usr/local/lib
是可以工作的。奇怪的事情又來(lái)了,不管你在文件系統(tǒng)的任何位置執(zhí)行這個(gè)指令,它都可以好好的工作。使用絕對(duì)路徑,也就是說(shuō),指定整個(gè)完整的路徑,從根目錄(/
)開(kāi)始到需要的文件或者是文件夾,是***的實(shí)現(xiàn)方式。
其它需要注意的事情是,只要 /usr/lib
和 /usr/local/lib
在一個(gè)分區(qū)上,做一個(gè)如下的硬鏈接:
cd /usr/lib
ln libblah /usr/local/lib
也是可以工作的,因?yàn)橛叉溄硬灰蕾?lài)于指向文件系統(tǒng)內(nèi)的文件來(lái)工作。
如果硬鏈接不起作用,那么可能是你想跨分區(qū)之間建立一個(gè)硬鏈接。就比如說(shuō),你有分區(qū) A 上有文件 fileA
,并且把這個(gè)分區(qū)掛載到 /path/to/partitionA/directory
目錄,而你又想從 fileA
鏈接到分區(qū) B 上 /path/to/partitionB/directory
目錄,這樣是行不通的。
ln /path/to/partitionA/directory/file /path/to/partitionB/directory
正如我們之前說(shuō)的一樣,硬鏈接是分區(qū)表中指向的是同一個(gè)分區(qū)的數(shù)據(jù)的條目,你不能把一個(gè)分區(qū)表的條目指向另一個(gè)分區(qū)上的數(shù)據(jù),這種情況下,你只能選擇創(chuàng)建一個(gè)軟鏈接:
ln -s /path/to/partitionA/directory/file /path/to/partitionB/directory
另一個(gè)軟鏈接能做到,而硬鏈接不能的是鏈接到一個(gè)目錄。
ln -s /path/to/some/directory /path/to/some/other/directory
這將在 /path/to/some/other/directory
中創(chuàng)建 /path/to/some/directory
的鏈接,沒(méi)有任何問(wèn)題。
當(dāng)你使用硬鏈接做同樣的事情的時(shí)候,會(huì)提示你一個(gè)錯(cuò)誤,說(shuō)不允許那么做。而不允許這么做的原因量會(huì)導(dǎo)致無(wú)休止的遞歸:如果你在目錄 A 中有一個(gè)目錄 B,然后你在目錄 B 中鏈接 A,就會(huì)出現(xiàn)同樣的情況,在目錄 A 中,目錄 A 包含了目錄 B,而在目錄 B 中又包含了 A,然后又包含了 B,等等無(wú)窮無(wú)盡。
當(dāng)然你可以在遞歸中使用軟鏈接,但你為什么要那樣做呢?
我應(yīng)該使用硬鏈接還是軟鏈接呢?
通常,你可以在任何地方使用軟鏈接做任何事情。實(shí)際上,在有些情況下你只能使用軟鏈接。話(huà)說(shuō)回來(lái),硬鏈接的效率要稍高一些:它們占用的磁盤(pán)空間更少,訪(fǎng)問(wèn)速度更快。在大多數(shù)的機(jī)器上,你可以忽略這一點(diǎn)點(diǎn)的差異,因?yàn)椋涸诖疟P(pán)空間越來(lái)越大,訪(fǎng)問(wèn)速度越來(lái)越快的今天,空間和速度的差異可以忽略不計(jì)。不過(guò),如果你是在一個(gè)有小存儲(chǔ)和低功耗的處理器上使用嵌入式系統(tǒng)上使用 Linux, 則可能需要考慮使用硬鏈接。
另一個(gè)使用硬鏈接的原因是硬鏈接不容易損壞。假設(shè)你有一個(gè)軟鏈接,而你意外的移動(dòng)或者刪除了它指向的文件,那么你的軟鏈接將會(huì)損壞,并指向了一個(gè)不存在的東西。這種情況是不會(huì)發(fā)生在硬鏈接中的,因?yàn)橛叉溄又苯又赶虻氖谴疟P(pán)上的數(shù)據(jù)。實(shí)際上,磁盤(pán)上的空間不會(huì)被標(biāo)記為空閑,除非***一個(gè)指向它的硬鏈接把它從文件系統(tǒng)中擦除掉。
軟鏈接,在另一方面比硬鏈接可以做更多的事情,而且可以指向任何東西,可以是文件或目錄。它也可以指向不在同一個(gè)分區(qū)上的文件和目錄。僅這兩個(gè)不同,我們就可以做出唯一的選擇了。