歡迎光臨
每天分享高質量文章

理解 Linux 連結(一) | Linux 中國

連結是可以將檔案和目錄放在你希望它們放在的位置的另一種方式。
— Paul Brown


致謝
編譯自 | 
https://www.linux.com/blog/intro-to-linux/2018/10/linux-links-part-1
 
 作者 | Paul Brown
 譯者 | MjSeven ?????共計翻譯:75.0 篇 貢獻時間:274 天

連結是可以將檔案和目錄放在你希望它們放在的位置的另一種方式。

除了 cp 和 mv 這兩個我們在本系列的前一部分[1]中詳細討論過的,連結是可以將檔案和目錄放在你希望它們放在的位置的另一種方式。它的優點是可以讓你同時在多個位置顯示一個檔案或目錄。

如前所述,在物理磁碟這個級別上,檔案和目錄之類的東西並不真正存在。檔案系統是為了方便人類使用,將它們虛構出來。但在磁碟級別上,有一個名為分割槽表partition table的東西,它位於每個分割槽的開頭,然後資料分散在磁碟的其餘部分。

雖然有不同型別的分割槽表,但是在分割槽開頭的那個表包含的資料將對映每個目錄和檔案的開始和結束位置。分割槽表的就像一個索引:當從磁碟載入檔案時,作業系統會查詢表中的條目,分割槽表會告訴檔案在磁碟上的起始位置和結束位置。然後磁碟頭移動到起點,讀取資料,直到它到達終點,您看:這就是你的檔案。

硬連結

硬連結只是分割槽表中的一個條目,它指向磁碟上的某個區域,表示該區域已經被分配給檔案。換句話說,硬連結指向已經被另一個條目索引的資料。讓我們看看它是如何工作的。

開啟終端,建立一個實驗目錄併進入:

  1. mkdir test_dir

  2. cd test_dir

使用 touch[1] 建立一個檔案:

  1. touch test.txt

為了獲得更多的體驗(?),在文字編輯器中開啟 test.txt 並新增一些單詞。

現在透過執行以下命令來建立硬連結:

  1. ln test.txt hardlink_test.txt

執行 ls,你會看到你的目錄現在包含兩個檔案,或者看起來如此。正如你之前讀到的那樣,你真正看到的是完全相同的檔案的兩個名稱: hardlink_test.txt 包含相同的內容,沒有填充磁碟中的任何更多空間(可以嘗試使用大檔案來測試),並與 test.txt 使用相同的 inode:

  1. $ ls -li *test*

  2. 16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 hardlink_test.txt

  3. 16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 test.txt

ls 的 -i 選項顯示一個檔案的 “inode 數值”。“inode” 是分割槽表中的資訊塊,它包含磁碟上檔案或目錄的位置、上次修改的時間以及其它資料。如果兩個檔案使用相同的 inode,那麼無論它們在目錄樹中的位置如何,它們在實際上都是相同的檔案。

軟連結

軟連結,也稱為符號連結symlink,它與硬連結是不同的:軟連結實際上是一個獨立的檔案,它有自己的 inode 和它自己在磁碟上的小塊地方。但它只包含一小段資料,將作業系統指向另一個檔案或目錄。

你可以使用 ln 的 -s 選項來建立一個軟連結:

  1. ln -s test.txt softlink_test.txt

這將在當前目錄中建立軟連結 softlink_test.txt,它指向 test.txt

再次執行 ls -li,你可以看到兩種連結的不同之處:

  1. $ ls -li

  2. total 8

  3. 16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 hardlink_test.txt

  4. 16515855 lrwxrwxrwx 1 paul paul 8 oct 12 09:50 softlink_test.txt -> test.txt

  5. 16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 test.txt

hardlink_test.txt 和 test.txt 包含一些文字並且字面上佔據相同的空間。它們使用相同的 inode 數值。與此同時,softlink_test.txt 佔用少得多,並且具有不同的 inode 數值,將其標記為完全不同的檔案。使用 ls 的 -l 選項還會顯示軟連結指向的檔案或目錄。

為什麼要用連結?

它們適用於帶有自己環境的應用程式。你的 Linux 發行版通常不會附帶你需要應用程式的最新版本。以優秀的 Blender 3D[2] 設計軟體為例,Blender 允許你建立 3D 靜態影象以及動畫電影,人人都想在自己的機器上擁有它。問題是,當前版本的 Blender 至少比任何發行版中的自帶的高一個版本。

幸運的是,Blender 提供可以開箱即用的下載[3]。除了程式本身之外,這些軟體包還包含了 Blender 需要執行的複雜的庫和依賴框架。所有這些資料和塊都在它們自己的目錄層次中。

每次你想執行 Blender,你都可以 cd 到你下載它的檔案夾並執行:

  1. ./blender

但這很不方便。如果你可以從檔案系統的任何地方,比如桌面命令啟動器中執行 blender 命令會更好。

這樣做的方法是將 blender 可執行檔案連結到 bin/ 目錄。在許多系統上,你可以透過將其連結到檔案系統中的任何位置來使 blender 命令可用,就像這樣。

  1. ln -s /path/to/blender_directory/blender /home/<username>/bin

你需要連結的另一個情況是軟體需要過時的庫。如果你用 ls -l 列出你的 /usr/lib 目錄,你會看到許多軟連結檔案一閃而過。仔細看看,你會看到軟連結通常與它們連結到的原始檔案具有相似的名稱。你可能會看到 libblah 連結到 libblah.so.2,你甚至可能會註意到 libblah.so.2 相應連結到原始檔案 libblah.so.2.1.0

這是因為應用程式通常需要安裝比已安裝版本更老的庫。問題是,即使新版本仍然與舊版本(通常是)相容,如果程式找不到它正在尋找的版本,程式將會出現問題。為瞭解決這個問題,發行版通常會建立連結,以便挑剔的應用程式相信它找到了舊版本,實際上它只找到了一個連結並最終使用了更新的庫版本。

有些是和你自己從原始碼編譯的程式相關。你自己編譯的程式通常最終安裝在 /usr/local下,程式本身最終在 /usr/local/bin 中,它在 /usr/local/bin 目錄中查詢它需要的庫。但假設你的新程式需要 libblah,但 libblah 在 /usr/lib 中,這就是所有其它程式都會尋找到它的地方。你可以透過執行以下操作將其連結到 /usr/local/lib

  1. ln -s /usr/lib/libblah /usr/local/lib

或者如果你願意,可以 cd 到 /usr/local/lib

  1. cd /usr/local/lib

然後使用連結:

  1. ln -s ../lib/libblah

還有幾十個案例證明軟連結是有用的,當你使用 Linux 更熟練時,你肯定會發現它們,但這些是最常見的。下一次,我們將看一些你需要註意的連結怪異。

透過 Linux 基金會和 edX 的免費 “Linux 簡介”[4]課程瞭解有關 Linux 的更多資訊。


via: https://www.linux.com/blog/intro-to-linux/2018/10/linux-links-part-1

作者:Paul Brown[6] 選題:lujun9972 譯者:MjSeven 校對:wxy

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

贊(0)

分享創造快樂