
我使用以下命令創建了 8 GB 的稀疏文件
dd if=/dev/zero of=/sparse-file bs=1 count=0 seek=8G
然後我做了
echo "test" >> /sparse-file
我看到du -sh sparse-file
給出 16K,du -sh --apparent-size sparse-file
顯示 8.1G。
我有一個想法,如果我將資料寫入文件,它將覆蓋稀疏文件中的零,但它實際上會增長。為什麼會這樣呢?如果我開始填充 8GB 的實際數據,那麼表觀大小將變成 16GB?
「計數」在這裡到底做什麼?
答案1
「稀疏」文件是帶有假定用零填充的空白間隙的文件,但該假設足以繼續下去。也就是說,如果您讀取該文件,您將獲得零,但由於我們知道它是零,因此我們實際上不必寫出 8GB 的零。只需說“讓我們同意這裡有一個大文件,而不實際為其分配空間”就足夠了。
當您覆蓋文件的空白內容時,會在磁碟上分配區塊以容納您儲存的內容(因為您不能再假設它只是零)。但如果你附加到文件中,您不會覆蓋任何內容。你只是在最後添加更多內容。因此,透過附加,您可以在磁碟上分配區塊,但這些區塊不會佔據位置您現有的「想像的」塊;相反,您創建的內容將添加到末尾,即虛構的內容之後。
您甚至可以添加更多的dd -skip
使用與建立文件類似的操作來建立虛擬區塊。 「想像的」塊不必全部在一起。事實上,當您覆蓋文件中的現有區塊時,只有您覆蓋的區塊才會被分配,無論它們出現在文件中的哪個位置。也就是說,在位置 101 寫入區塊不會自動分配區塊 1 到 99 並將其填零。
答案2
首先,count=0
您只從 複製了零個區塊/dev/zero
。所以什麼都沒有。seek=8G
跳過了 8GB 的區塊。我寧願用 來做到這一點count=1
,但我想你可以完全忽略它。
其餘的,只需閱讀曼杜。此apparent-size
選項列印表觀大小而不是實際磁碟使用情況。因此,雖然第一個命令報告您的檔案在磁碟上需要 16K,但表觀大小為 8.1GB。
內容少於 16K 的檔案仍可能需要磁碟上的 16K,具體取決於所使用的底層檔案系統。請參閱GNU Coreutils 描述:
例如,包含單字「zoo」且沒有換行符的檔案的表觀大小當然為 3。名稱。但是,使用此命令建立的稀疏檔案:
dd bs=1 seek=2GiB if=/dev/null of=big
表觀大小為 2 GiB,但在大多數現代系統上,它實際上幾乎不使用任何磁碟空間。