为什么 `du` 的输出通常与 `du -b` 有如此大的不同?

2024-11-01 08:41:00
admin
原创
222
摘要:问题描述:为什么输出结果与?du如此不同?是 的简写。 仅使用在大多数情况下会给我相同的结果,但似乎可以解决问题。 我想知道输出是否正确,哪些数字是我想要的? (即实际文件大小,如果复制到另一个存储设备)du -b`-b--apparent-size --block-size=1--apparent-size...

问题描述:

为什么输出结果与?du如此不同?是 的简写。 仅使用在大多数情况下会给我相同的结果,但似乎可以解决问题。 我想知道输出是否正确,哪些数字是我想要的? (即实际文件大小,如果复制到另一个存储设备)du -b`-b--apparent-size --block-size=1--apparent-size`--block-size=1


解决方案 1:

表观大小是应用程序认为文件中包含的字节数。如果您决定通过 FTP 或 HTTP 发送文件,则它是通过网络传输的数据量(不计算协议标头)。它也是 的结果cat theFile | wc -c,以及如果您使用 加载整个文件,则文件将占用的地址空间量mmap

磁盘使用量是由于文件占用了该空间而无法用于其他用途的空间量。

在大多数情况下,表观大小小于磁盘使用量,因为磁盘使用量计算的是文件最后一个(部分)块的全部大小,而表观大小只计算最后一个块中的数据。但是,当您拥有稀疏文件时,表观大小会更大(当您在文件末尾之后的某个地方寻找,然后在那里写入一些内容时,就会创建稀疏文件 - 操作系统不会费心创建大量用零填充的块 - 它只会为您决定写入的文件部分创建一个块)。

解决方案 2:

最小块粒度示例

让我们玩一会儿看看发生了什么。

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

我用以下方法找到它的块大小:

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,它就会上升到,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

给出:

8192    f
1073741825      f

相关:如何测试是否支持稀疏文件

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

一些可能性是:

  • 使用数据库而不是文件系统:数据库与文件系统存储

  • 使用支持块子分配的文件系统

参考书目:

在 Ubuntu 16.04 中测试。

解决方案 3:

比较(例如)du -bmdu -m

设置,但随后将-b覆盖块大小为。--apparent-size --block-size=1`m`1M

类似于:-bh平均值,并且再次覆盖块大小。-h`-bh--apparent-size --block-size=1 --human-readableh`

解决方案 4:

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

  • --apparent-size文件或文件夹的实际大小

  • 磁盘占用大小是文件或文件夹在磁盘上占用的字节数。使用 时也是一样du

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

解决方案 5:

因为默认情况下 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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用