理解 Linux 鏈接(一)
除了 cp
和 mv
這兩個我們在本系列的前一部分中詳細討論過的,鏈接是可以將文件和目錄放在你希望它們放在的位置的另一種方式。它的優點是可以讓你同時在多個位置顯示一個文件或目錄。
如前所述,在物理磁碟這個級別上,文件和目錄之類的東西並不真正存在。文件系統是為了方便人類使用,將它們虛構出來。但在磁碟級別上,有一個名為 分區表 的東西,它位於每個分區的開頭,然後數據分散在磁碟的其餘部分。
雖然有不同類型的分區表,但是在分區開頭的那個表包含的數據將映射每個目錄和文件的開始和結束位置。分區表的就像一個索引:當從磁碟載入文件時,操作系統會查找表中的條目,分區表會告訴文件在磁碟上的起始位置和結束位置。然後磁碟頭移動到起點,讀取數據,直到它到達終點,您看:這就是你的文件。
硬鏈接
硬鏈接只是分區表中的一個條目,它指向磁碟上的某個區域,表示該區域已經被分配給文件。換句話說,硬鏈接指向已經被另一個條目索引的數據。讓我們看看它是如何工作的。
打開終端,創建一個實驗目錄並進入:
mkdir test_dir
cd test_dir
使用 touch 創建一個文件:
touch test.txt
為了獲得更多的體驗(?),在文本編輯器中打開 test.txt
並添加一些單詞。
現在通過執行以下命令來建立硬鏈接:
ln test.txt hardlink_test.txt
運行 ls
,你會看到你的目錄現在包含兩個文件,或者看起來如此。正如你之前讀到的那樣,你真正看到的是完全相同的文件的兩個名稱: hardlink_test.txt
包含相同的內容,沒有填充磁碟中的任何更多空間(可以嘗試使用大文件來測試),並與 test.txt
使用相同的 inode:
$ ls -li *test*
16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 hardlink_test.txt
16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 test.txt
ls
的 -i
選項顯示一個文件的 「inode 數值」。「inode」 是分區表中的信息塊,它包含磁碟上文件或目錄的位置、上次修改的時間以及其它數據。如果兩個文件使用相同的 inode,那麼無論它們在目錄樹中的位置如何,它們在實際上都是相同的文件。
軟鏈接
軟鏈接,也稱為 符號鏈接 ,它與硬鏈接是不同的:軟鏈接實際上是一個獨立的文件,它有自己的 inode 和它自己在磁碟上的小塊地方。但它只包含一小段數據,將操作系統指向另一個文件或目錄。
你可以使用 ln
的 -s
選項來創建一個軟鏈接:
ln -s test.txt softlink_test.txt
這將在當前目錄中創建軟鏈接 softlink_test.txt
,它指向 test.txt
。
再次執行 ls -li
,你可以看到兩種鏈接的不同之處:
$ ls -li
total 8
16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 hardlink_test.txt
16515855 lrwxrwxrwx 1 paul paul 8 oct 12 09:50 softlink_test.txt -> test.txt
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 設計軟體為例,Blender 允許你創建 3D 靜態圖像以及動畫電影,人人都想在自己的機器上擁有它。問題是,當前版本的 Blender 至少比任何發行版中的自帶的高一個版本。
幸運的是,Blender 提供可以開箱即用的下載。除了程序本身之外,這些軟體包還包含了 Blender 需要運行的複雜的庫和依賴框架。所有這些數據和塊都在它們自己的目錄層次中。
每次你想運行 Blender,你都可以 cd
到你下載它的文件夾並運行:
./blender
但這很不方便。如果你可以從文件系統的任何地方,比如桌面命令啟動器中運行 blender
命令會更好。
這樣做的方法是將 blender
可執行文件鏈接到 bin/
目錄。在許多系統上,你可以通過將其鏈接到文件系統中的任何位置來使 blender
命令可用,就像這樣。
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
:
ln -s /usr/lib/libblah /usr/local/lib
或者如果你願意,可以 cd
到 /usr/local/lib
:
cd /usr/local/lib
然後使用鏈接:
ln -s ../lib/libblah
還有幾十個案例證明軟鏈接是有用的,當你使用 Linux 更熟練時,你肯定會發現它們,但這些是最常見的。下一次,我們將看一些你需要注意的鏈接怪異。
通過 Linux 基金會和 edX 的免費 「Linux 簡介」課程了解有關 Linux 的更多信息。
via: https://www.linux.com/blog/intro-to-linux/2018/10/linux-links-part-1
作者:Paul Brown 選題:lujun9972 譯者:MjSeven 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive