Filesystems

為什麼 GNU Core Utilities stat(包括 du 和 ls)報告以下大小(GNU/Linux 中的 ext4)?

  • December 26, 2018

如果我在目錄中有以下內容:

  • 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,這意味著statls、 和之間的輸出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。

問題

  1. 為什麼分配的大小是兩個塊(大小為 4096 B)而不是一個empty_dirone_char
  2. 為什麼為empty_file一個塊分配的大小而不是零?
  3. 為什麼分配的大小several_blocks(以及通常更大的文件)比表觀大小((264 * 512)- 129760 = 5408 > 4096)大一個以上的塊?

我懷疑附加塊是包含 的塊inode,就像這個提問者問的那樣(但沒有得到回答)。同樣,這個提問者觀察到了雙倍大小,但它在問題中的表述不正確,並得到了問題另一部分的答案。然而,這個對另一個問題的回答表明不應該有額外的塊(這是我的直覺)。

  1. 我們的系統是否配置不正確?
  2. 假設包含 的塊inode被計數:du在多個文件上使用時,它是否會補償inode多次計數塊,是否應該多個inodes在同一個塊中(因為一個塊可以包含 16 inodes(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 ( getfattrreturns user.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,即沒有使用額外的塊。

  1. 由於擴展屬性
  2. 由於擴展屬性
  3. 由於擴展屬性
  4. 不,但要注意應用程序添加的擴展屬性
  5. 不正確的假設。

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