1. 程式人生 > >關於硬鏈接與軟連接占用磁盤空間問題的分析研究

關於硬鏈接與軟連接占用磁盤空間問題的分析研究

linux運維


在學習過硬鏈接和軟連接的知識後,我們在做實驗的過程中會發現,創建的硬鏈接會占用磁盤的空間,而我們學習過成中了解到,硬鏈接只是創建一個文件與源文件相同的inode號,那怎麽還會占用磁盤空間呢?技術分享帶著疑問,跟隨夾克來進行一些實驗進行驗證並得出結論:

首先我們再來回顧一下關於 硬鏈接與軟連接的知識:

硬鏈接的特點:

技術分享

技術分享l 創建硬鏈接會增加額外的記錄項以引用文件

l 對應用於同一文件系統上的一個物理文件

l 每個目錄引用相同的inode 號

l 創建時鏈接數遞增

l 刪除文件時,遞減鏈接數,當鏈接數為0時,該文件已被刪除

l 硬鏈接的建立是不能越驅動器或分區的

l 語法為:ln filename linkname

軟鏈接的特點:

技術分享

技術分享l與硬鏈接最大的不同就是,軟鏈接並不使用相同的inode號,同時

也不增加或減少目標文件inode的引用計數

l 創建的鏈接只是對應的指向源文件的路徑,所以可以對目錄進行鏈 接,硬鏈接中只能對文件進行鏈接,

l 既然軟鏈接是指向的一個文件的路徑,所以可以跨越分區進行。

l 語法為:ln –s filenamelinkname

硬鏈接測試:

從上面我們對硬鏈接和軟鏈接的特點分析可知道,硬鏈接所創建的是一個使用相同的inode號,根據我們的理解,兩個相同的文件對應一個inode號,指向硬盤中相同的數據群塊,但是我們通過下面一個實驗發現有些蹊蹺,一起來看看吧!

在/app目錄下創建一個文件,我這裏創建了一個4.9G大的文件,

技術分享

接下來我們來設置一個硬鏈接:

技術分享

咦?怎麽大小變成9.8G了呢?這完全是翻倍了呀!小夥伴們是不是有了疑問,統計的數據反應出硬鏈接占用了同的空間,我剛開始也很郁悶,一度懷疑是不是硬鏈接也占用了空間,所以隨後我又查了兩個文件的inode 號,如下:

技術分享

表明兩個文件公用的是一個inode號,所以證明它們指向的是同一個數據塊(在文件系統中一個inode號對應一個數據塊群),並沒有重新占用其他的數據塊,所以也並不是復制了相同的文件,同時當改變其中一個文件的數據後,查看與之硬鏈接的文件其數據也是隨之同步的,這跡象也表明對應的是一個數據塊,而正真的問題並不是硬鏈接的問提,是這個ll –h 或者 ls –h這命令進行統計文件總大小的時候並不是從磁盤進行統計的,而是根據文件屬性中的大小疊加得來的。而硬鏈接的文件屬性中的大小就是就是inode號對應的數據塊的大小,所以total中進行統計就把各個文件屬性中的大小加起來作為總和,這種統計是不標準,也不具有代表性的,正真的查看某個文件夾占用磁盤空間大小命令是:du –h 這個命令是從磁盤上進行統計,不會被文件的屬性中大小影響,所以更準確,測試結果如下圖所示:

技術分享

從上面的測試中,我們看到真實的磁盤容量並沒有改變,所以可以得出結論:

硬鏈接並不占用磁盤空間!技術分享

軟鏈接測試:

對於軟鏈接就更好理解了,並沒有出現想上面出現的問題,我們同樣在/app目錄下創建一個軟鏈接,顯示如下圖:

技術分享

從上面的測試結果我們看到,軟鏈接的inode號並不一樣,鏈接的文件所占用的空間也是極小的,這個鏈接文件C1的數據中僅存儲了一個路徑而已,所以這部分大小只是路徑的大小。

從上面兩個實驗,我們可以得出一個結論:技術分享

硬鏈接不占用磁盤空間,軟鏈接占用的空間只是存儲路徑所占用的極小空間。


本文出自 “Linux運維” 博客,請務必保留此出處http://jk6627.blog.51cto.com/12002684/1949090

關於硬鏈接與軟連接占用磁盤空間問題的分析研究