Linux中國

理解 Linux 鏈接(二)

本系列的第一篇文章中,我們認識了硬鏈接、軟鏈接,知道在很多時候鏈接是非常有用的。鏈接看起來比較簡單,但是也有一些不易察覺的奇怪的地方需要注意。這就是我們這篇文章中要講的。例如,像一下我們在前一篇文章中創建的指向 libblah 的鏈接。請注意,我們是如何從目標文件夾中創建鏈接的。

cd /usr/local/lib
ln -s /usr/lib/libblah

這樣是可以工作的,但是下面的這個例子卻是不行的。

cd /usr/lib
ln -s libblah /usr/local/lib

也就是說,從原始文件夾內到目標文件夾之間的鏈接將不起作用。

出現這種情況的原因是 ln 會把它當作是你在 /usr/local/lib 中創建一個到 /usr/local/lib 的鏈接,並在 /usr/local/lib 中創建了從 libblahlibblah 的一個鏈接。這是因為所有鏈接文件獲取的是文件的名稱(`libblah),而不是文件的路徑,最終的結果將會產生一個壞的鏈接。

然而,請看下面的這種情況。

cd /usr/lib
ln -s /usr/lib/libblah /usr/local/lib

是可以工作的。奇怪的事情又來了,不管你在文件系統的任何位置執行這個指令,它都可以好好的工作。使用絕對路徑,也就是說,指定整個完整的路徑,從根目錄(/)開始到需要的文件或者是文件夾,是最好的實現方式。

其它需要注意的事情是,只要 /usr/lib/usr/local/lib 在一個分區上,做一個如下的硬鏈接:

cd /usr/lib
ln libblah /usr/local/lib

也是可以工作的,因為硬鏈接不依賴於指向文件系統內的文件來工作。

如果硬鏈接不起作用,那麼可能是你想跨分區之間建立一個硬鏈接。就比如說,你有分區 A 上有文件 fileA ,並且把這個分區掛載到 /path/to/partitionA/directory 目錄,而你又想從 fileA 鏈接到分區 B 上 /path/to/partitionB/directory 目錄,這樣是行不通的。

ln /path/to/partitionA/directory/file /path/to/partitionB/directory

正如我們之前說的一樣,硬鏈接是分區表中指向的是同一個分區的數據的條目,你不能把一個分區表的條目指向另一個分區上的數據,這種情況下,你只能選擇創建一個軟鏈接:

ln -s /path/to/partitionA/directory/file /path/to/partitionB/directory

另一個軟鏈接能做到,而硬鏈接不能的是鏈接到一個目錄。

ln -s /path/to/some/directory /path/to/some/other/directory

這將在 /path/to/some/other/directory 中創建 /path/to/some/directory 的鏈接,沒有任何問題。

當你使用硬鏈接做同樣的事情的時候,會提示你一個錯誤,說不允許那麼做。而不允許這麼做的原因量會導致無休止的遞歸:如果你在目錄 A 中有一個目錄 B,然後你在目錄 B 中鏈接 A,就會出現同樣的情況,在目錄 A 中,目錄 A 包含了目錄 B,而在目錄 B 中又包含了 A,然後又包含了 B,等等無窮無盡。

當然你可以在遞歸中使用軟鏈接,但你為什麼要那樣做呢?

我應該使用硬鏈接還是軟鏈接呢?

通常,你可以在任何地方使用軟鏈接做任何事情。實際上,在有些情況下你只能使用軟鏈接。話說回來,硬鏈接的效率要稍高一些:它們佔用的磁碟空間更少,訪問速度更快。在大多數的機器上,你可以忽略這一點點的差異,因為:在磁碟空間越來越大,訪問速度越來越快的今天,空間和速度的差異可以忽略不計。不過,如果你是在一個有小存儲和低功耗的處理器上使用嵌入式系統上使用 Linux, 則可能需要考慮使用硬鏈接。

另一個使用硬鏈接的原因是硬鏈接不容易損壞。假設你有一個軟鏈接,而你意外的移動或者刪除了它指向的文件,那麼你的軟鏈接將會損壞,並指向了一個不存在的東西。這種情況是不會發生在硬鏈接中的,因為硬鏈接直接指向的是磁碟上的數據。實際上,磁碟上的空間不會被標記為空閑,除非最後一個指向它的硬鏈接把它從文件系統中擦除掉。

軟鏈接,在另一方面比硬鏈接可以做更多的事情,而且可以指向任何東西,可以是文件或目錄。它也可以指向不在同一個分區上的文件和目錄。僅這兩個不同,我們就可以做出唯一的選擇了。

下期

現在我們已經介紹了文件和目錄以及操作它們的工具,你是否已經準備好轉到這些工具,可以瀏覽目錄層次結構,可以查找文件中的數據,也可以檢查目錄。這就是我們下一期中要做的事情。下期見。

你可以通過 Linux 基金會和 edX 「Linux 簡介」了解更多關於 Linux 的免費課程。

via: https://www.linux.com/blog/2018/10/understanding-linux-links-part-2

作者:Paul Brown 選題:lujun9972 譯者:Jamkr 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國