linux 为什么'du`的输出常常与' B '的输出如此不同

ijxebb2r  于 2023-03-07  发布在  Linux
关注(0)|答案(5)|浏览(211)

为什么du的输出经常如此不同于du -b-b--apparent-size --block-size=1的简写.只使用--apparent-size给我相同的结果大部分时间,但是--block-size=1似乎做这把戏.我想知道如果输出然后是正确的偶数,并且哪些数字是我想要的?(即实际的文件大小,如果拷贝到另一个存储设备)

tv6aics1

tv6aics11#

  • Apparent size* 是应用程序认为文件中的字节数。它是如果您决定通过FTP或HTTP发送文件,将通过网络传输的数据量(不包括协议头)。它也是cat theFile | wc -c的结果,以及如果您使用mmap加载整个文件,文件将占用的地址空间量。
  • 磁盘使用量 * 是指由于文件占用了空间而无法用于其他用途的空间量。

在大多数情况下,表观大小小于磁盘使用量,因为磁盘使用量计算最后一个磁盘的完整大小(部分)块,表观大小仅计算最后一个块中的数据。但是,当您有稀疏文件时,表观大小会更大(稀疏文件是在您查找文件末尾之后的某个位置时创建的,然后在那里写一些东西--操作系统不需要创建很多用零填充的块--它只为您决定写入的文件部分创建一个块)。

wwodge7n

wwodge7n2#

    • 最小数据块粒度示例**

让我们玩一小会儿,看看是怎么回事。
mount告诉我我在/上挂载的ext4分区上。
I find its block size与:

stat -fc %s .

其给出:

4096

现在让我们创建一些大小为1 4095 4096 4097的文件,并使用--block-size=1-b的同义词)进行测试:

#!/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

相关:How to test if sparse file is supported

    • 如果要存储一堆小文件,该怎么做?**

一些可能性包括:

参考书目:

在Ubuntu 16.04中测试。

vnjpjtjt

vnjpjtjt3#

比较(例如)du -bmdu -m
-b设置--apparent-size --block-size=1,但m将块大小覆盖为1M
-bh-h相似:-bh意味着--apparent-size --block-size=1 --human-readable,并且h再次覆盖该块大小。

wydwbb8l

wydwbb8l4#

文件和文件夹有其真实的大小和磁盘上的大小。

  • --apparent-size是文件或文件夹的真实的大小
  • size on disk是文件或文件夹在磁盘上占用的字节数。使用du时也是如此。

如果你发现表观大小几乎总是比磁盘使用量高出几个数量级,那么这意味着你有很多('稀疏')文件或文件具有内部碎片或间接块。

jslywgbw

jslywgbw5#

因为默认情况下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

相关问题