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

2024-11-01 08:41:00
admin
原创
46
摘要:问题描述:为什么输出结果与?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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用