为什么`du`的输出通常与`du -b`有很大不同

时间:2011-04-17 16:27:00

标签: linux filesystems filesize du

为什么du的输出通常与du -b如此不同? -b--apparent-size --block-size=1的简写。只使用--apparent-size在大多数情况下给我相同的结果,但--block-size=1似乎可以解决问题。我想知道输出是否正确,哪个数字是我想要的? (即实际文件大小,如果复制到另一个存储设备)

5 个答案:

答案 0 :(得分:25)

表观大小是应用程序认为在文件中的字节数。如果您决定通过FTP或HTTP发送文件,则它是通过网络传输的数据量(不包括协议头)。这也是cat theFile | wc -c的结果,以及使用mmap加载整个文件时文件占用的地址空间量。

磁盘使用情况是因为您的文件占用该空间而无法用于其他内容的空间量。

在大多数情况下,表观大小小于磁盘使用量,因为磁盘使用量计算文件最后(部分)块的完整大小,而表观大小仅计算最后一个块中的数据。但是,当你有一个稀疏文件时,表观大小会更大(当你寻找文件末尾的某个地方时会创建稀疏文件,然后在那里写一些东西 - 操作系统不会创建大量填充零的块 - - 它只为您决定写入的文件部分创建一个块。)

答案 1 :(得分:1)

因为默认情况下du表示磁盘使用量,它与文件大小相同或更大。如下所述 - 在 - 大小

print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be
larger due to holes in (`sparse') files, internal fragmentation, indirect blocks, and the like

答案 2 :(得分:1)

文件和文件夹的实际大小和磁盘大小

  • - 表观大小是文件或文件夹的实际大小

  • 磁盘上的大小是文件或文件夹在磁盘上占用的字节数。 使用du

  • 时也是如此

如果您遇到的表面大小几乎总是比磁盘使用高几个数量,那么这意味着您有很多(“稀疏”)文件,其中包含内部碎片或间接块。

答案 3 :(得分:1)

最小块粒度示例

让我们来看看发生了什么。

mount告诉我我在/上安装的ext4分区上。

I find its block size带有:

stat -fc %s .

给出:

4096

现在,让我们创建一些大小为1 4095 4096 4097的文件:

#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
  dd if=/dev/zero of=f bs=1 count="${size}" status=none
  echo "size     ${size}"
  echo "real     $(du --block-size=1 f)"
  echo "apparent $(du --block-size=1 --apparent-size f)"
  echo
done

结果为:

size     1
real     4096   f
apparent 1      f

size     4095
real     4096   f
apparent 4095   f

size     4096
real     4096   f
apparent 4096   f

size     4097
real     8192   f
apparent 4097   f

因此,我们发现4096以下的任何内容实际上都占用了4096个字节。

然后,只要我们越过4097,它就会上升到8192,即2 * 4096

很明显,磁盘始终将数据存储在4096字节的块边界处。

稀疏文件会怎样?

我还没有研究确切的表示是什么,但是很明显--apparent确实考虑了它。

这可能导致表观大小大于实际磁盘使用量。

例如:

dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f

给予:

8192    f
1073741825      f

相关:How to test if sparse file is supported

如果我要存储一堆小文件怎么办?

一些可能性是:

参考书目:

在Ubuntu 16.04中测试。

答案 4 :(得分:0)

比较(例如)du -bmdu -m

-b设置--apparent-size --block-size=1, 但是m会将块大小覆盖为1M

-bh-h相似: -bh表示--apparent-size --block-size=1 --human-readableh再次覆盖该块大小。