我們繼續這個系列,來看一些你所不知道的微妙之處。
在,我們認識了硬連結、軟連結,知道在很多時候連結是非常有用的。連結看起來比較簡單,但是也有一些不易察覺的奇怪的地方需要注意。這就是我們這篇文章中要講的。例如,像一下我們在前一篇文章中建立的指向 libblah
的連結。請注意,我們是如何從目標資料夾中建立連結的。
cd /usr/local/libln -s /usr/lib/libblah
這樣是可以工作的,但是下面的這個例子卻是不行的。
cd /usr/libln -s libblah /usr/local/lib
也就是說,從原始資料夾內到目標資料夾之間的連結將不起作用。
出現這種情況的原因是 ln
會把它當作是你在 /usr/local/lib
中建立一個到 /usr/local/lib
的連結,並在 /usr/local/lib
中建立了從 libblah
到 libblah
的一個連結。這是因為所有連結檔案獲取的是檔案的名稱(`libblah),而不是檔案的路徑,最終的結果將會產生一個壞的連結。
然而,請看下面的這種情況。
cd /usr/libln -s /usr/lib/libblah /usr/local/lib
是可以工作的。奇怪的事情又來了,不管你在檔案系統的任何位置執行這個指令,它都可以好好的工作。使用絕對路徑,也就是說,指定整個完整的路徑,從根目錄(/
)開始到需要的檔案或者是資料夾,是最好的實現方式。
其它需要注意的事情是,只要 /usr/lib
和 /usr/local/lib
在一個分割區上,做一個如下的硬連結:
cd /usr/libln 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 的免費課程。