Filesystems
為什麼 GNU Core Utilities stat(包括 du 和 ls)報告以下大小(GNU/Linux 中的 ext4)?
如果我在目錄中有以下內容:
empty_dir
: 空目錄。empty_file
: 空的文件。one_char
: 由一個字元組成的文件。several_blocks
:由幾個塊組成的文件(但不是“太大”或“稀疏”)。然後,
ls
將顯示以下 †:$ ls -Gghs total 152K 8,0K drwxr-xr-x 2 4,0K dec 21 23:34 empty_dir 4,0K -rw-r--r-- 1 0 dec 21 23:21 empty_file 8,0K -rw-r--r-- 1 1 dec 21 23:22 one_char 132K -rw-r--r-- 1 127K dec 22 00:14 several_blocks
其次,
stat
顯示以下內容:$ stat empty_dir/ File: empty_dir/ Size: 4096 Blocks: 16 IO Block: 4096 directory ... $ stat empty_file File: empty_file Size: 0 Blocks: 8 IO Block: 4096 regular empty file ... $ stat one_char File: one_char Size: 1 Blocks: 16 IO Block: 4096 regular file ... $ stat several_blocks File: several_blocks Size: 129760 Blocks: 264 IO Block: 4096 regular file ...
第三,
du
顯示以下內容:$ du -h empty_dir/ 8,0K empty_dir/ $ du -h empty_file 4,0K empty_file $ du -h one_char 8,0K one_char $ du -h several_blocks 132K several_blocks
最後:
$ tune2fs /dev/nvme0n1p2 -l ... Block size: 4096 ... Inode size: 256 ...
所報告的塊大小
stat
為 512 B,這意味著stat
、ls
、 和之間的輸出du
是一致的:
empty_dir
:16 * 512/1024 = 4096 + 4096 = 8 KiB。empty_file
:8 * 512/1024 = 0 + 4096 = 4 KiB。one_char
:16 * 512/1024 = 4096 + 4096 = 8 KiB。several_blocks
:264 * 512/1024 = 129760 + 5408 = 129760 + 1312 + 4096 = 131072 + 4096 = 32 * 4096 + 4096 = 132 KiB。問題
- 為什麼分配的大小是兩個塊(大小為 4096 B)而不是一個
empty_dir
?one_char
- 為什麼為
empty_file
一個塊分配的大小而不是零?- 為什麼分配的大小
several_blocks
(以及通常更大的文件)比表觀大小((264 * 512)- 129760 = 5408 > 4096)大一個以上的塊?我懷疑附加塊是包含 的塊
inode
,就像這個提問者問的那樣(但沒有得到回答)。同樣,這個提問者觀察到了雙倍大小,但它在問題中的表述不正確,並得到了問題另一部分的答案。然而,這個對另一個問題的回答表明不應該有額外的塊(這是我的直覺)。
- 我們的系統是否配置不正確?
- 假設包含 的塊
inode
被計數:du
在多個文件上使用時,它是否會補償inode
多次計數塊,是否應該多個inodes
在同一個塊中(因為一個塊可以包含 16inodes
(4096 / 256 = 16))?附錄
@WumpusQ.Wumbley 推測它可能是擴展屬性,事實證明就是這樣!
getfattr
返回user.com.dropbox.attributes
。結果測試目錄是一個目錄深處的子目錄,它像徵性地連結到我的Dropbox文件夾中。請參閱下面接受的答案。†這在 GNU/Linux 上使用 GNU Core Utilities 8.30,在 NVME SSD 上的 ext4 上使用核心 4.19.1 (Manjaro)。
@WumpusQ.Wumbley 在評論中指出了原因:擴展屬性。
為了完整起見,答案如下。
擴展屬性,在這種情況下由Dropbox (
getfattr
returnsuser.com.dropbox.attributes
) 應用,使用額外的塊進行儲存。沒有這些擴展屬性ls
(和其他命令)返回:$ ls -Gghs total 136K 4,0K drwxr-xr-x 2 4,0K dec 22 20:11 empty_dir 0 -rw-r--r-- 1 0 dec 22 20:11 empty_file 4,0K -rw-r--r-- 1 1 dec 22 20:12 one_char 128K -rw-r--r-- 1 127K dec 22 20:13 several_blocks
正如預期的那樣。
此外,
stat
對於唯一有趣的several_blocks
退貨情況:$ stat several_blocks File: several_blocks Size: 129760 Blocks: 256 IO Block: 4096 regular file ...
這也符合預期,因為 256 * 512 - 129760 = 1312 < 4096,即沒有使用額外的塊。
- 由於擴展屬性。
- 由於擴展屬性。
- 由於擴展屬性。
- 不,但要注意應用程序添加的擴展屬性。
- 不正確的假設。