為什麼硬連結似乎與原始連結佔用相同的空間?
感謝這里和這個頁面的一些很好的問答,我現在理解了連結。我看到硬連結以不同的名稱引用同一個 inode,而副本是不同的“節點,具有不同的名稱。另外,軟連結具有原始文件名和路徑作為它們的 inode,所以如果文件被移動,連結就會中斷。
所以,我用一些文件(下面的“saluton_mondo.cpp”)測試了我學到的東西,製作了一個硬連結和一個軟連結以及一個副本。
jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp -rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy -rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard -rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp lrwxrwxrwx 1 jmcf125 jmcf125 17 Aŭg 27 16:09 soft -> saluton_mondo.cpp
然而,我發現硬連結與原始連結的大小相同,從邏輯上講,與副本大小相同。如果硬連結和原始連結共享相同的 inode,具有數據,並且僅文件名不同,那麼硬連結不應該只佔用其名稱的空間,而不是 205 個字節嗎?還是返回的原始文件的大小
ls -lh
?但是我怎麼知道文件名佔用了多少空間呢?這裡它說硬連結沒有大小。他們的文件名是否與原始文件名一起保留?硬連結的文件名儲存在哪裡?
文件是具有元數據的 inode,其中包含指向何處查找數據的指針列表。
為了能夠訪問文件,您必須將其連結到目錄(將目錄視為電話目錄,而不是文件夾),即向多個目錄之一添加一個或多個條目以將名稱與該文件相關聯。
所有這些連結,那些文件名都指向同一個文件。沒有一個是原始的,另一個是連結。它們都是目錄樹中同一個文件(同一個 inode)的訪問點。當您獲得文件的大小(
lstat
系統呼叫)時,您正在檢索儲存在 inode 中的資訊(上面提到的元數據),無論您使用哪個文件名,哪個連結來引用該文件.相比之下,符號連結是另一個文件(另一個 inode),其內容是目標文件的*路徑。*與任何其他文件一樣,這些符號連結必須連結到目錄(必須有名稱),以便您可以訪問它們。您還可以有多個指向符號連結的連結,或者換句話說,可以為符號連結指定多個名稱(在一個或多個目錄中)。
$ touch a $ ln a b $ ln -s a c $ ln c d $ ls -li [a-d] 10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a 10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b 10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a 10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a
文件編號 10486707 上方是正常文件。目前目錄中的兩個條目(一個帶有 name
a
,一個帶有 nameb
)連結到它。因為連結數是 2,所以我們知道目前目錄或任何其他目錄中沒有該文件的其他名稱。文件號 10502404 是另一個文件,這次是符號連結類型,兩次連結到目前目錄。它的內容(目標)是相對路徑“a”。請注意,如果 10502404 連結到另一個目錄而不是目前目錄,它通常會根據訪問方式指向不同的文件。
$ mkdir 1 2 $ echo foo > 1/a $ echo bar > 2/a $ ln -s a 1/b $ ln 1/b 2/b $ ls -lia 1 2 1: total 92 10608644 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./ 10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../ 10504186 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a 10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a 2: total 92 10608674 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./ 10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../ 10539044 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a 10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a $ cat 1/b foo $ cat 2/b bar
除了連結它們的目錄之外,文件沒有與之關聯的名稱。他們的名字佔用的空間是這些目錄中的條目,它在目錄的文件大小/磁碟使用中佔了比重。
您會注意到刪除文件的系統呼叫是
unlink
. 也就是說,您不會刪除文件,而是將它們與引用它們的目錄取消連結。一旦從具有給定文件條目的最後一個目錄取消連結,該文件就會被銷毀(只要沒有程序擁有它打開)。