您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Linux下的文件鏈接有哪些”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“Linux下的文件鏈接有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
Linux 文件系統(tǒng)中有兩種鏈接link:硬鏈接hard link和軟鏈接soft link。雖然二者差別顯著,但都用來解決相似的問題。它們都提供了對單個文件的多個目錄項(引用)的訪問,但實現(xiàn)卻大為不同。鏈接的強大功能賦予了 Linux 文件系統(tǒng)靈活性,因為一切皆是文件。
舉個例子,我曾發(fā)現(xiàn)一些程序要求特定的版本庫方可運行。 當用升級后的庫替代舊庫后,程序會崩潰,提示舊版本庫缺失。通常,庫名的唯一變化就是版本號。出于直覺,我僅僅給程序添加了一個新的庫鏈接,并以舊庫名稱命名。我試著再次啟動程序,運行良好。程序就是一個游戲,人人都明白,每個玩家都會盡力使游戲進行下去。
事實上,幾乎所有的應用程序鏈接庫都使用通用的命名規(guī)則,鏈接名稱中包含了主版本號,鏈接所指向的文件的文件名中同樣包含了小版本號。再比如,程序的一些必需文件為了迎合 Linux 文件系統(tǒng)規(guī)范,從一個目錄移動到另一個目錄中,系統(tǒng)為了向后兼容那些不能獲取這些文件新位置的程序在舊的目錄中存放了這些文件的鏈接。如果你對 /lib64 目錄做一個長清單列表,你會發(fā)現(xiàn)很多這樣的例子。
lrwxrwxrwx. 1 root root 36 Dec 8 2016 cracklib_dict.hwm -> ../../usr/share/cracklib/pw_dict.hwm lrwxrwxrwx. 1 root root 36 Dec 8 2016 cracklib_dict.pwd -> ../../usr/share/cracklib/pw_dict.pwd lrwxrwxrwx. 1 root root 36 Dec 8 2016 cracklib_dict.pwi -> ../../usr/share/cracklib/pw_dict.pwi lrwxrwxrwx. 1 root root 27 Jun 9 2016 libaccountsservice.so.0 -> libaccountsservice.so.0.0.0 -rwxr-xr-x. 1 root root 288456 Jun 9 2016 libaccountsservice.so.0.0.0 lrwxrwxrwx 1 root root 15 May 17 11:47 libacl.so.1 -> libacl.so.1.1.0 -rwxr-xr-x 1 root root 36472 May 17 11:47 libacl.so.1.1.0 lrwxrwxrwx. 1 root root 15 Feb 4 2016 libaio.so.1 -> libaio.so.1.0.1 -rwxr-xr-x. 1 root root 6224 Feb 4 2016 libaio.so.1.0.0 -rwxr-xr-x. 1 root root 6224 Feb 4 2016 libaio.so.1.0.1 lrwxrwxrwx. 1 root root 30 Jan 16 16:39 libakonadi-calendar.so.4 -> libakonadi-calendar.so.4.14.26 -rwxr-xr-x. 1 root root 816160 Jan 16 16:39 libakonadi-calendar.so.4.14.26 lrwxrwxrwx. 1 root root 29 Jan 16 16:39 libakonadi-contact.so.4 -> libakonadi-contact.so.4.14.26
/lib64 目錄下的一些鏈接
在上面展示的 /lib64 目錄清單列表中,文件模式第一個字母 l (小寫字母 l)表示這是一個軟鏈接(又稱符號鏈接)。
硬鏈接
在 Linux 的 EXT4 文件系統(tǒng)的歷史、特性以及最佳實踐一文中,我曾探討過這樣一個事實,每個文件都有一個包含該文件信息的 inode,包含了該文件的位置信息。上述文章中的圖2展示了一個指向 inode 的單一目錄項。每個文件都至少有一個目錄項指向描述該文件信息的 inode ,目錄項是一個硬鏈接,因此每個文件至少都有一個硬鏈接。
如下圖 1 所示,多個目錄項指向了同一 inode 。這些目錄項都是硬鏈接。我曾在三個目錄項中使用波浪線 (~) 的縮寫,這是用戶目錄的慣例表示,因此在該例中波浪線等同于 /home/user 。值得注意的是,第四個目錄項是一個完全不同的目錄,/home/shared,可能是該計算機上用戶的共享文件目錄。
硬鏈接被限制在一個單一的文件系統(tǒng)中。此處的“文件系統(tǒng)” 是指掛載在特定掛載點上的分區(qū)或邏輯卷,此例中是 /home。這是因為在每個文件系統(tǒng)中的 inode 號都是唯一的。而在不同的文件系統(tǒng)中,如 /var 或 /opt,會有和 /home 中相同的 inode 號。
因為所有的硬鏈接都指向了包含文件元信息的單一 inode ,這些屬性都是文件的一部分,像所屬關(guān)系、權(quán)限、到該 inode 的硬鏈接數(shù)目,對每個硬鏈接來說這些特性沒有什么不同的。這是一個文件所具有的一組屬性。唯一能區(qū)分這些文件的是包含在 inode 信息中的文件名。鏈接到同一目錄中的單一文件/ inode 的硬鏈接必須擁有不同的文件名,這是基于同一目錄下不能存在重復的文件名的事實的。
文件的硬鏈接數(shù)目可通過 ls -l 來查看,如果你想查看實際節(jié)點號,可使用 ls -li 命令。
符號(軟)鏈接
硬鏈接和軟鏈接(也稱為符號鏈接symlink)的區(qū)別在于,硬鏈接直接指向?qū)儆谠撐募?inode ,而軟鏈接直接指向一個目錄項,即指向一個硬鏈接。因為軟鏈接指向的是一個文件的硬鏈接而非該文件的 inode ,所以它們并不依賴于 inode 號,這使得它們能跨越不同的文件系統(tǒng)、分區(qū)和邏輯卷起作用。
軟鏈接的缺點是,一旦它所指向的硬鏈接被刪除或重命名后,該軟鏈接就失效了。軟鏈接雖然還在,但所指向的硬鏈接已不存在。所幸的是,ls 命令能以紅底白字的方式在其列表中高亮顯示失效的軟鏈接。
實驗項目: 鏈接實驗
我認為最容易理解鏈接用法及其差異的方法是動手搭建一個項目。這個項目應以非超級用戶的身份在一個空目錄下進行。我創(chuàng)建了 ~/temp 目錄做這個實驗,你也可以這么做。這么做可為項目創(chuàng)建一個安全的環(huán)境且提供一個新的空目錄讓程序運作,如此以來這兒僅存放和程序有關(guān)的文件。
初始工作
首先,在你要進行實驗的目錄下為該項目中的任務創(chuàng)建一個臨時目錄,確保當前工作目錄(PWD)是你的主目錄,然后鍵入下列命令。
mkdir temp
使用這個命令將當前工作目錄切換到 ~/temp。
cd temp
實驗開始,我們需要創(chuàng)建一個能夠鏈接到的文件,下列命令可完成該工作并向其填充內(nèi)容。
du -h > main.file.txt
使用 ls -l 長列表命名確認文件正確地創(chuàng)建了。運行結(jié)果應類似于我的。注意文件大小只有 7 字節(jié),但你的可能會有 1~2 字節(jié)的變動。
[dboth@david temp]$ ls -l total 4 -rw-rw-r-- 1 dboth dboth 7 Jun 13 07:34 main.file.txt
在列表中,文件模式串后的數(shù)字 1 代表存在于該文件上的硬鏈接數(shù)?,F(xiàn)在應該是 1 ,因為我們還沒有為這個測試文件建立任何硬鏈接。
對硬鏈接進行實驗
硬鏈接創(chuàng)建一個指向同一 inode 的新目錄項,當為文件添加一個硬鏈接時,你會看到鏈接數(shù)目的增加。確保當前工作目錄仍為 ~/temp。創(chuàng)建一個指向 main.file.txt 的硬鏈接,然后查看該目錄下文件列表。
[dboth@david temp]$ ln main.file.txt link1.file.txt [dboth@david temp]$ ls -l total 8 -rw-rw-r-- 2 dboth dboth 7 Jun 13 07:34 link1.file.txt -rw-rw-r-- 2 dboth dboth 7 Jun 13 07:34 main.file.txt
目錄中兩個文件都有兩個鏈接且大小相同,時間戳也一樣。這就是有一個 inode 和兩個硬鏈接(即該文件的目錄項)的一個文件。再建立一個該文件的硬鏈接,并列出目錄清單內(nèi)容。你可以建立硬鏈接: link1.file.txt 或 main.file.txt。
[dboth@david temp]$ ln link1.file.txt link2.file.txt ; ls -l total 16 -rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 link1.file.txt -rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 link2.file.txt -rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 main.file.txt
注意,該目錄下的每個硬鏈接必須使用不同的名稱,因為同一目錄下的兩個文件不能擁有相同的文件名。試著創(chuàng)建一個和現(xiàn)存鏈接名稱相同的硬鏈接。
[dboth@david temp]$ ln main.file.txt link2.file.txt ln: failed to create hard link 'link2.file.txt': File exists
顯然不行,因為 link2.file.txt 已經(jīng)存在。目前為止我們只在同一目錄下創(chuàng)建硬鏈接,接著在臨時目錄的父目錄(你的主目錄)中創(chuàng)建一個鏈接。
[dboth@david temp]$ ln main.file.txt ../main.file.txt ; ls -l ../main*-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt
上面的 ls 命令顯示 main.file.txt 文件確實存在于主目錄中,且與該文件在 temp 目錄中的名稱一致。當然它們不是不同的文件,它們是同一文件的兩個鏈接,指向了同一文件的目錄項。為了幫助說明下一點,在 temp 目錄中添加一個非鏈接文件。
[dboth@david temp]$ touch unlinked.file ; ls -ltotal 12-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link1.file.txt-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link2.file.txt-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt-rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
使用 ls 命令的 i 選項查看 inode 的硬鏈接號和新創(chuàng)建文件的硬鏈接號。
[dboth@david temp]$ ls -litotal 12657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link1.file.txt657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link2.file.txt657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
注意上面文件模式左邊的數(shù)字 657024 ,這是三個硬鏈接文件所指的同一文件的 inode 號,你也可以使用 i 選項查看主目錄中所創(chuàng)建的鏈接的節(jié)點號,和該值相同。而那個只有一個鏈接的 inode 號和其他的不同,在你的系統(tǒng)上看到的 inode 號或許不同于本文中的。
接著改變其中一個硬鏈接文件的大小。
[dboth@david temp]$ df -h > link2.file.txt ; ls -litotal 12657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link1.file.txt657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link2.file.txt657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 main.file.txt657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
現(xiàn)在所有的硬鏈接文件大小都比原來大了,因為多個目錄項都鏈接著同一文件。
下個實驗在我的電腦上會出現(xiàn)這樣的結(jié)果,是因為我的 /tmp 目錄在一個獨立的邏輯卷上。如果你有單獨的邏輯卷或文件系統(tǒng)在不同的分區(qū)上(如果未使用邏輯卷),確定你是否能訪問那個分區(qū)或邏輯卷,如果不能,你可以在電腦上掛載一個 U 盤,如果上述方式適合你,你可以進行這個實驗。
試著在 /tmp 目錄中建立一個 ~/temp 目錄下文件的鏈接(或你的文件系統(tǒng)所在的位置)。
[dboth@david temp]$ ln link2.file.txt /tmp/link3.file.txtln: failed to create hard link '/tmp/link3.file.txt' => 'link2.file.txt':Invalid cross-device link
為什么會出現(xiàn)這個錯誤呢? 原因是每一個單獨的可掛載文件系統(tǒng)都有一套自己的 inode 號。簡單的通過 inode 號來跨越整個 Linux 文件系統(tǒng)結(jié)構(gòu)引用一個文件會使系統(tǒng)困惑,因為相同的節(jié)點號會存在于每個已掛載的文件系統(tǒng)中。
有時你可能會想找到一個 inode 的所有硬鏈接。你可以使用 ls -li 命令。然后使用 find 命令找到所有硬鏈接的節(jié)點號。
[dboth@david temp]$ find . -inum 657024./main.file.txt./link1.file.txt./link2.file.txt
注意 find 命令不能找到所屬該節(jié)點的四個硬鏈接,因為我們在 ~/temp 目錄中查找。 find 命令僅在當前工作目錄及其子目錄中查找文件。要找到所有的硬鏈接,我們可以使用下列命令,指定你的主目錄作為起始查找條件。
[dboth@david temp]$ find ~ -samefile main.file.txt/home/dboth/temp/main.file.txt/home/dboth/temp/link1.file.txt/home/dboth/temp/link2.file.txt/home/dboth/main.file.txt
如果你是非超級用戶,沒有權(quán)限,可能會看到錯誤信息。這個命令也使用了 -samefile 選項而不是指定文件的節(jié)點號。這個效果和使用 inode 號一樣且更容易,如果你知道其中一個硬鏈接名稱的話。
對軟鏈接進行實驗
如你剛才看到的,不能跨越文件系統(tǒng)邊界創(chuàng)建硬鏈接,即在邏輯卷或文件系統(tǒng)中從一個文件系統(tǒng)到另一個文件系統(tǒng)。軟鏈接給出了這個問題的解決方案。雖然它們可以達到相同的目的,但它們是非常不同的,知道這些差異是很重要的。
讓我們在 ~/temp 目錄中創(chuàng)建一個符號鏈接來開始我們的探索。
[dboth@david temp]$ ln -s link2.file.txt link3.file.txt ; ls -litotal 12657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link1.file.txt657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link2.file.txt658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt ->link2.file.txt657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 main.file.txt657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
擁有節(jié)點號 657024 的那些硬鏈接沒有變化,且硬鏈接的數(shù)目也沒有變化。新創(chuàng)建的符號鏈接有不同的 inode 號 658270。 名為 link3.file.txt 的軟鏈接指向了 link2.file.txt 文件。使用 cat 命令查看 link3.file.txt 文件的內(nèi)容。符號鏈接的 inode 信息以字母 l (小寫字母 l)開頭,意味著這個文件實際是個符號鏈接。
上例中軟鏈接文件 link3.file.txt 的大小只有 14 字節(jié)。這是文本內(nèi)容 link3.file.txt 的大小,即該目錄項的實際內(nèi)容。目錄項 link3.file.txt 并不指向一個 inode ;它指向了另一個目錄項,這在跨越文件系統(tǒng)建立鏈接時很有幫助。現(xiàn)在試著創(chuàng)建一個軟鏈接,之前在 /tmp 目錄中嘗試過的。
[dboth@david temp]$ ln -s /home/dboth/temp/link2.file.txt /tmp/link3.file.txt ; ls -l /tmp/link* lrwxrwxrwx 1 dboth dboth 31 Jun 14 21:53 /tmp/link3.file.txt -> /home/dboth/temp/link2.file.txt
刪除鏈接
當你刪除硬鏈接或硬鏈接所指的文件時,需要考慮一些問題。
首先,讓我們刪除硬鏈接文件 main.file.txt。注意指向 inode 的每個目錄項就是一個硬鏈接。
[dboth@david temp]$ rm main.file.txt ; ls -li total 8 657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link1.file.txt 657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link2.file.txt 658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt -> link2.file.txt 657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
main.file.txt 是該文件被創(chuàng)建時所創(chuàng)建的第一個硬鏈接?,F(xiàn)在刪除它,仍然保留著原始文件和硬盤上的數(shù)據(jù)以及所有剩余的硬鏈接。要刪除原始文件,你必須刪除它的所有硬鏈接。
現(xiàn)在刪除 link2.file.txt 硬鏈接文件。
[dboth@david temp]$ rm link2.file.txt ; ls -li total 8 657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link1.file.txt 658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt -> link2.file.txt 657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 main.file.txt 657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file
注意軟鏈接的變化。刪除軟鏈接所指的硬鏈接會使該軟鏈接失效。在我的系統(tǒng)中,斷開的鏈接用顏色高亮顯示,目標的硬鏈接會閃爍顯示。如果需要修復這個損壞的軟鏈接,你需要在同一目錄下建立一個和舊鏈接相同名字的硬鏈接,只要不是所有硬鏈接都已刪除就行。您還可以重新創(chuàng)建鏈接本身,鏈接保持相同的名稱,但指向剩余的硬鏈接中的一個。當然如果軟鏈接不再需要,可以使用 rm 命令刪除它們。
unlink 命令在刪除文件和鏈接時也有用。它非常簡單且沒有選項,就像 rm 命令一樣。然而,它更準確地反映了刪除的基本過程,因為它刪除了目錄項與被刪除文件的鏈接。
讀到這里,這篇“Linux下的文件鏈接有哪些”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。