有人可以告诉我以下内容的区别:
du -s dir
3705012 dir
du -s --apparent-size dir
3614558 dir
这些目录位于块设备内(使用 cryptsetup 创建)。或者更好:为什么我需要仅对加密块设备内的文件添加 --apparent-size ?
答案1
文件的“表观大小”是文件中实际有多少有效数据。它是可以从文件中读取的实际数据量。面向块的设备只能以块的形式存储,而不能以字节的形式存储。因此,磁盘使用率始终向上舍入到下一个最高的块。在这种情况下,“块”也可能不等于存储设备上的物理块,具体取决于文件系统如何分配空间。
对于加密设备,文件系统可能会扩展用于包含支持加密/解密信息的开销的空间量。它可能还会加密或随机化文件末尾和包含该文件的块末尾之间未使用的空间,这可能会使它看起来更大du
。
这些都没有考虑稀疏文件处理,加密文件系统可能不支持稀疏文件处理。
答案2
最小块粒度示例
让我们玩一下,看看发生了什么。
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
升到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://stackoverflow.com/questions/38718864/how-to-test-if-sparse-file-is-supported
如果我想存储一堆小文件怎么办?
一些可能性是:
- 使用数据库而不是文件系统:https://stackoverflow.com/questions/38120895/database-vs-file-system-storage
- 使用支持的文件系统块再分配
参考书目:
- 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 中测试。