AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 490423
Accepted
Klorax
Klorax
Asked: 2018-12-22 16:19:32 +0800 CST2018-12-22 16:19:32 +0800 CST 2018-12-22 16:19:32 +0800 CST

为什么 GNU Core Utilities stat(包括 du 和 ls)报告以下大小(GNU/Linux 中的 ext4)?

  • 772

如果我在目录中有以下内容:

  • 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。

问题

  1. 为什么分配的大小是两个块(大小为 4096 B)而不是一个empty_dir?one_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)。

filesystems ls
  • 2 2 个回答
  • 267 Views

2 个回答

  • Voted
  1. Best Answer
    Klorax
    2018-12-23T11:24:10+08:002018-12-23T11:24:10+08:00

    @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. 不正确的假设。
    • 4
  2. sourcejedi
    2018-12-23T08:23:51+08:002018-12-23T08:23:51+08:00

    “额外的块”不是由于配置上的一些不一致。(假设它总是因为某些其他原因是错误的。就像宇宙射线破坏了你的内核代码:-))。

    我这样说是因为没有选项可以手动调整这些命令的磁盘使用量计算的详细信息。这些命令仅通过乘法或除法将磁盘使用量转换为不同的单位。磁盘使用情况是通过调用 stat() 系统调用获得的。内核返回一些合成的“块”,它们总是 512 字节。也没有任何内核选项会影响 stat() 如何计算块数。

    我可以告诉你包含 inode 的块不应该计入你的 ext4 文件系统。总的来说,Giles 说它不依赖于他所知道的任何文件系统。也许部分是由于您提出的观点:-)。索引节点往往小于 . 报告的 512 字节块stat。ext4 默认为 256 字节的 inode;ext3 默认为 128 字节。

    如果我们查看相关问题(右侧栏),我们会注意到一种情况,其中可能存在额外的块。扩展区树(或间接块,如果扩展区被禁用)计入ext4。(为什么文件大小的差异和它在磁盘上的大小大于 4 KiB?)

    对链接问题的第二个答案提出了另一种情况。fallocate() 的某些用途可能允许创建大小与分配给它们的块数之间存在任意大差异的文件。

    也就是说,我怀疑以上内容不足以解释您的任何示例。

    • 3

相关问题

  • 我应该在 NAS 的 SD 卡中使用哪个文件系统?

  • 如何提前知道 .zip 内部是否有父目录

  • Virtualbox 动态分配磁盘 *.vdi 不断增长

  • du/df 和 ls 报告不同的磁盘使用情况

  • Linux 内核开发人员如何处理数百万行代码的工作?他们是一种方法吗?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve