Linux 为什么'du'的输出常常与'du-b'如此不同`

Linux 为什么'du'的输出常常与'du-b'如此不同`,linux,filesystems,filesize,du,Linux,Filesystems,Filesize,Du,为什么du的输出与du-b的输出常常如此不同-b是--表观尺寸--块尺寸=1的缩写。仅使用--表观大小在大多数情况下都会得到相同的结果,但--块大小=1似乎就可以做到这一点。我想知道输出是否是正确的偶数,哪些数字是我想要的?(即实际文件大小,如果复制到另一个存储设备),因为默认情况下,du提供的磁盘使用率与文件大小相同或大于文件大小。如下面所述——表观尺寸 print apparent sizes, rather than disk usage; although the apparent si

为什么
du
的输出与
du-b
的输出常常如此不同
-b
--表观尺寸--块尺寸=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
表观大小是应用程序认为文件中包含的字节数。如果您决定通过FTP或HTTP发送文件,则通过网络传输的数据量(不包括协议头)。这也是
cat-theFile | wc-c
的结果,以及如果使用
mmap
加载整个文件,文件将占用的地址空间量

磁盘使用率是指由于文件占用空间而无法用于其他用途的空间量

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

比较(例如)
du-bm
du-m

-b
设置
--外观尺寸--块尺寸=1
, 但是
m
会将块大小覆盖为
1M

类似于
-bh
-h

-bh
表示
--表观大小--块大小=1--人类可读的
h
再次覆盖该块大小。

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

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

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


如果您遇到明显的大小几乎总是比磁盘使用量高出几个数量级,那么这意味着您有许多带有内部碎片或间接块的('sparse')文件。

最小块粒度示例

让我们玩一会儿,看看发生了什么事

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

与:

其中:

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

#!/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
字节的块边界存储数据

稀疏文件会发生什么情况?

我还没有研究确切的表示形式是什么,但很明显,
--显然
确实考虑到了这一点

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

例如:

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
相关的:

如果我想存储一堆小文件,该怎么办?

有些可能性是:

  • 使用数据库而不是文件系统:
  • 使用支持
参考书目:


在Ubuntu 16.04中测试。

那么“表观尺寸”到底是多少?我遇到的情况正好相反:表观大小几乎总是比磁盘使用量高出几个数量级。实际上,默认情况下,在启用压缩的分区上,表观大小也可以更小?这看起来是个很好的问题。如果你打算否决某个问题或答案,请有礼貌地发表评论,这样每个人都可以学到一些东西。匿名否决票是一个潜在的教学机会。@Pete:可能是因为这与StackOverflow无关。我希望更多的高声誉用户会注意到。有关ServerFault的相关问题:谢谢!这是一个彻底的解释。那么为什么我需要
--block size=1
才能获得与
wc-c文件相同的输出(保存cat进程)。当我指定-h,-k,-m,-B1等时,
du
似乎只输出正确的字节数。?但也许这真的是另一个问题
du
默认情况下输出块使用情况,而不是字节使用情况?很好的解释,但不涉及问题–-1中存在的
--块大小=1
。如果仔细阅读问题,这一定是正确答案。必须指出的是,默认情况下,
--块大小通常不是
1
(即,
du
,没有任何选项),而是1024或512
--表观尺寸与
-b
的副作用无关。
8192    f
1073741825      f