du -s --apparent-size VS du -s

Pol*_*len 8 disk-usage

有人可以告诉我与以下内容的区别:

du -s dir 
3705012 dir

du -s --apparent-size dir
3614558 dir
Run Code Online (Sandbox Code Playgroud)

这些目录位于块设备内(使用 cryptsetup 创建)。或者更好:为什么我只需要在加密块设备内的文件中添加 --apparent-size ?

Joe*_*ell 11

文件的“表观大小”是文件中实际有多少有效数据。它是可以从文件中读取的实际数据量。面向块的设备只能按块存储,不能按字节存储。因此,磁盘使用量始终向上舍入到下一个最高块。在这种情况下,“块”可能并不等同于存储设备上的物理块,这取决于文件系统如何分配空间。

对于您的加密设备,文件系统可能会扩展用于包含支持加密/解密信息的开销的空间量。它还可能加密或随机化文件末尾和包含它的块末尾之间未使用的空间,这可能会使du.

这些都没有考虑稀疏文件处理,加密文件系统可能不支持稀疏文件处理。


Cir*_*郝海东 9

最小块粒度示例

让我们玩一下,看看发生了什么。

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

我找到它的块大小

stat -fc %s .
Run Code Online (Sandbox Code Playgroud)

这使:

4096
Run Code Online (Sandbox Code Playgroud)

现在让我们创建一些大小为的文件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
Run Code Online (Sandbox Code Playgroud)

结果是:

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
Run Code Online (Sandbox Code Playgroud)

所以我们看到任何低于或等于的值实际上都会4096占用字节。4096

然后,一旦我们交叉,它就4097会上升到。81922 * 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
Run Code Online (Sandbox Code Playgroud)

给出:

8192    f
1073741825      f
Run Code Online (Sandbox Code Playgroud)

相关:https ://stackoverflow.com/questions/38718864/how-to-test-if-sparse-file-is-supported

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

一些可能性是:

参考书目:

在 Ubuntu 16.04 中测试。