为什么 的 输出du
经常 与 如此不同du -b
?-b
是 的简写--apparent-size --block-size=1
。--apparent-size
大多数时候,只有 using给了我相同的结果,但--block-size=1
似乎可以解决问题。我想知道输出是否正确,我想要哪些数字?(即实际文件大小,如果复制到另一个存储设备)
5 回答
表观大小是您的应用程序认为文件中的字节数。如果您决定通过 FTP 或 HTTP 发送文件,则将通过网络传输的数据量(不包括协议头)。这也是 的结果cat theFile | wc -c
,以及如果您使用mmap
.
磁盘使用量是由于您的文件占用了该空间而无法用于其他用途的空间量。
在大多数情况下,表观大小小于磁盘使用量,因为磁盘使用量计算文件最后(部分)块的完整大小,而表观大小仅计算最后一个块中的数据。然而,当你有一个稀疏文件时,表观大小会更大(当你在文件末尾寻找某个地方时会创建稀疏文件,然后在那里写一些东西——操作系统不会费心创建大量填充零的块—— - 它只为您决定写入的文件部分创建一个块)。
最小块粒度示例
让我们玩一下看看发生了什么。
mount
告诉我我在一个 ext4 分区上安装在/
.
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
which is 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
相关:如何测试是否支持稀疏文件
如果我想存储一堆小文件怎么办?
一些可能性是:
- 使用数据库而不是文件系统:数据库与文件系统存储
- 使用支持块子分配的文件系统
参考书目:
- https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files
- https://askubuntu.com/questions/641900/how-file-system-block-size-works
在 Ubuntu 16.04 中测试。
将(例如)du -bm
与进行比较du -m
。
-b
集合--apparent-size --block-size=1
,但随后将块m
大小覆盖为1M
。
-bh
与vs类似-h
:-bh
手段--apparent-size --block-size=1 --human-readable
,以及h
块大小的覆盖。
文件和文件夹有它们的实际大小和磁盘上的大小。
--apparent-size
是文件或文件夹的实际大小size on disk 是文件或文件夹在磁盘上占用的字节数。使用时也是一样的
du
。
如果您遇到表观大小几乎总是比磁盘使用量高几个数量级,那么这意味着您有很多(“稀疏”)文件具有内部碎片或间接块。
因为默认情况下 du 给出的磁盘使用量与文件大小相同或更大。如 --apparent-size 下所述
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