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