du -s --表观尺寸 VS du -s

du -s --表观尺寸 VS du -s

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

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

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

一些可能性是:

参考书目:

在 Ubuntu 16.04 中测试。

相关内容