Linux

為什麼硬連結似乎與原始連結佔用相同的空間?

  • August 30, 2017

感謝這里和這個頁面的一些很好的問答,我現在理解了連結。我看到硬連結以不同的名稱引用同一個 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,一個帶有 name b)連結到它。因為連結數是 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. 也就是說,您不會刪除文件,而是將它們與引用它們的目錄取消連結。一旦從具有給定文件條目的最後一個目錄取消連結,該文件就會被銷毀(只要沒有程序擁有它打開)。

引用自:https://unix.stackexchange.com/questions/88423