Linux磁盘使用统计命令du和df区别

linux磁盘使用统计命令du和df区别

du

df

这两个命令,在Linux系统里都是我们用来查看磁盘空间的神器,但它们统计的角度和方法截然不同。说白了,

df

关注的是文件系统整体的“账本”,它看的是哪些块被标记为已用,哪些是空闲的;而

du

则更像是一个“审计员”,它会挨个去数文件和目录的大小,然后加起来告诉你。这就导致它们的结果经常不一样,尤其是在系统出现一些“异常”情况时,这种差异会变得非常明显。理解它们的区别,是准确判断磁盘空间使用情况的关键。

解决方案

df

命令,全称是“disk free”,它主要报告的是文件系统(filesystem)的整体使用情况。当你运行

df -h

时,它会遍历所有已挂载的文件系统,显示每个文件系统的总容量、已用空间、可用空间以及使用百分比。它的数据来源是文件系统的元数据,也就是文件系统本身记录的块分配信息。所以,

df

的数据是“权威的”,它反映了操作系统内核层面,文件系统到底认为自己用了多少空间。

du

命令,全称是“disk usage”,它则是从文件和目录的角度出发。当你对某个目录运行

du -sh

时,它会递归地遍历该目录下的所有文件和子目录,然后把所有文件的大小累加起来。它统计的是“文件实际占用的空间”,也就是我们通常理解的,一个文件有多大。

du

的数据是“用户视角的”,它反映了你通过文件系统路径能看到的所有文件加起来有多大。

两者最大的区别在于,

df

统计的是“分配给文件系统的块”,而

du

统计的是“文件内容所占的块”。这种差异在大多数时候并不明显,但一旦出现某些特定情况,就会导致巨大的差异。

为什么df和du的统计结果经常不一致?

这绝对是Linux系统管理员最常遇到的困惑之一。我个人觉得,最主要的原因,也是最让人头疼的,就是“被删除但仍被进程占用的文件”。

想象一下,你有一个日志文件,比如

/var/log/myapp.log

,它可能每天都在增长。某个日志轮转程序为了释放空间,把这个文件删除了(

rm /var/log/myapp.log

),然后创建了一个新的同名文件。这时候,

du

命令会立刻发现旧文件不见了,所以它的统计结果会变小。但是,如果你的

myapp

服务进程在文件被删除时,仍然持有对那个旧日志文件的文件句柄(descriptor),那么操作系统就不会真正释放那些被旧文件占用的磁盘块。在文件系统的角度看来,这些块仍然是“已使用”状态。所以,

df

的统计结果就不会下降,甚至可能保持不变。

要验证这种情况,你可以使用

lsof

命令。运行

lsof | grep deleted

,它会列出所有被进程打开但已经被删除的文件。你会看到类似这样的输出:

COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAMEjava      12345   root   12w   REG    8,1 12345678 1234 /var/log/myapp.log (deleted)

这里的

SIZE/OFF

就是那个被删除文件仍然占用的空间。解决办法通常是重启相关的服务进程,让它释放旧的文件句柄,这样文件系统才会真正回收那些块。

再者,还有一些不那么常见但也会导致差异的情况。比如:

硬链接:

du

在计算时可能会多次计算同一个文件的空间(取决于参数),而

df

只计算一次实际的磁盘块。稀疏文件(Sparse Files): 稀疏文件在磁盘上并不占用实际的零字节空间,

du

通常会报告其逻辑大小(包含空洞),而

df

则报告其物理大小(实际占用的块)。文件系统块大小:

df

报告的是文件系统层面的块使用情况,而

du

则可能受到其自身默认块大小的影响。不过话说回来,这通常不会造成巨大的差异。权限问题:

du

在遍历目录时,如果遇到没有读取权限的目录或文件,它就无法计算其大小,从而导致统计结果偏小。

df

则没有这个问题,因为它直接查询文件系统元数据。

如何准确查找占用磁盘空间的文件或目录?

当你想知道具体是哪些文件或目录吃掉了你的磁盘空间时,

du

命令就是你的最佳拍档。它能让你一层层地钻进去,找到那些“大胃王”。

最常用的组合是

du -sh

s

(summary):只显示总计,不列出每个子目录。

h

(human-readable):以人类可读的格式显示大小(KB, MB, GB)。

例如,要查看当前目录下所有文件和子目录的总大小:

du -sh .

如果你想知道当前目录下,哪些子目录占用空间最大,可以这样:

du -sh * | sort -rh | head -n 10

这条命令会列出当前目录下所有文件和目录的大小,然后按大小倒序排列,并显示前10个最大的。这招特别好用,能让你快速定位问题。

魔乐社区 魔乐社区

天翼云和华为联合打造的AI开发者社区,支持AI模型评测训练、全流程开发应用

魔乐社区 102 查看详情 魔乐社区

如果你要检查某个特定路径,比如

/var/log

,可以这样做:

du -sh /var/log

然后,如果你想深入到

/var/log

里面,看是哪个子目录或文件最大,可以:

du -sh /var/log/* | sort -rh | head -n 10

需要注意的是,

du

默认会跨越文件系统边界。如果你只想统计当前文件系统内的使用情况,不想把挂载点下的其他文件系统也算进来,可以使用

-x

参数:

du -shx /path/to/directory

这样,

du

就不会进入

/path/to/directory

下的任何挂载点。

对于更复杂的磁盘空间分析,我个人推荐使用

ncdu

这个工具。它是一个基于ncurses的磁盘使用分析器,界面非常直观,你可以像在文件管理器里一样,上下左右移动,查看每个目录的大小,甚至直接删除文件。安装也很简单,比如在Debian/Ubuntu上就是

sudo apt install ncdu

,CentOS/RHEL上是

sudo yum install ncdu

磁盘空间不足时,应该优先检查哪些地方?

当你的服务器突然报出磁盘空间不足的警报时,别慌,我们有套相对高效的排查流程。

确认哪个文件系统满了: 这是第一步,也是最关键的一步。运行

df -h

,一眼就能看出是哪个挂载点(比如

/

/var

/home

)的空间快用完了。这能帮你缩小排查范围。

检查“幽灵文件”(deleted but open files): 如果

df

显示某个分区快满了,但你用

du -sh /path/to/that/partition

去统计,却发现

du

的结果远小于

df

,那么八九不离十,就是有被删除但仍被进程占用的文件。这时候,毫不犹豫地运行

lsof | grep deleted

。找到那些占用大空间且被标记为

(deleted)

的文件,然后根据

COMMAND

PID

定位到对应的服务。如果可以,重启该服务,或者直接kill掉它(谨慎操作,确保不会影响业务),通常就能立刻释放空间。

定位大文件或大目录: 如果

df

du

的结果都显示空间被大量占用,那么就是有实实在在的文件在吃空间。这时候,你需要深入到第一步确认的那个满载的文件系统根目录,用

du

命令进行排查。

比如,如果

/

分区满了,你可以从

/

开始:

du -shx /* | sort -rh | head -n 20

。这会列出根目录下最大的20个一级目录。根据结果,你就能知道是哪个目录占用了大部分空间(比如

/var

/opt

/home

)。然后,继续深入那个大目录,重复这个过程,直到你找到具体的“罪魁祸首”文件或目录。例如,如果发现

/var

很大,那就

du -shx /var/* | sort -rh | head -n 20

常见的“大胃王”区域:

/var/log/

:日志文件,尤其是那些没有配置好轮转策略的应用程序日志,或者系统日志(如

syslog

journal

)。

/tmp/

:临时文件目录,虽然系统会定期清理,但有时会有残留。

/home/

:用户家目录,用户可能下载了大量文件、图片、视频等。

/opt/

:一些第三方软件的安装目录,有时会放置大量数据或备份。

/var/lib/docker/

:如果你使用了Docker,这个目录会存放镜像和容器的数据。数据库文件:MySQL、PostgreSQL等数据库的数据文件通常会非常大。备份目录:如果你有定期备份,但没有及时清理旧备份,它们会迅速填满磁盘。

利用

find

命令: 当你需要查找特定类型、大小或时间的旧文件时,

find

命令非常强大。

查找所有大于1GB的文件:

find /path/to/check -type f -size +1G -print0 | xargs -0 du -h

查找所有在30天前修改过的文件:

find /path/to/check -type f -mtime +30

结合

delete

参数(谨慎使用):

find /path/to/check -type f -name "*.log" -mtime +7 -delete

(删除7天前的

.log

文件)

记住,在删除任何文件之前,务必确认其重要性,或者先将其移动到其他位置作为备份。误删关键系统文件可能会导致系统崩溃。

以上就是Linux磁盘使用统计命令du和df区别的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/430709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
EyeCare护眼工具怎么自定义提醒间隔_EyeCare提醒间隔自定义方法详述
上一篇 2025年11月7日 13:45:17
模板app制作软件是否适合企业定制需求?
下一篇 2025年11月7日 13:45:20

相关推荐

  • 修复Django电商项目中AJAX过滤产品列表图片不显示问题

    在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…

    2026年5月10日
    000
  • 开源免费PHP工具 PHP开发效率提升利器

    推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…

    2026年5月10日
    000
  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    100
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • 修复点击时按钮抖动:CSS垂直对齐实践

    本文探讨了在Web开发中,交互式按钮(如播放/暂停按钮)在点击时发生意外垂直位移的问题。通过分析CSS样式变化对元素布局的影响,我们发现这是由于按钮不同状态下的边框样式和内边距改变,以及默认的垂直对齐行为共同作用所致。核心解决方案是利用CSS的vertical-align属性,将其设置为middle…

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 如何在HTML中插入表单元素_HTML表单控件与输入类型使用指南

    HTML表单通过标签构建,包含action和method属性定义数据提交目标与方式,常用input类型如text、password、email等适配不同输入需求,配合label、required、placeholder提升可用性,结合textarea、select、button等控件实现完整交互,是…

    2026年5月10日
    000
  • 前端缓存策略与JavaScript存储管理

    根据数据特性选择合适的存储方式并制定清晰的读写与清理逻辑,能显著提升前端性能;合理运用Cookie、localStorage、sessionStorage、IndexedDB及Cache API,结合缓存策略与定期清理机制,可在保证用户体验的同时避免安全与性能隐患。 前端缓存和JavaScript存…

    2026年5月10日
    100
  • HTML5网页如何实现手势操作 HTML5网页移动端交互的处理技巧

    首先利用原生touch事件实现滑动判断,再通过preventDefault解决滚动冲突,接着引入Hammer.js处理复杂手势,最后通过优化点击区域、避免事件冲突和增加视觉反馈提升体验。 在移动端浏览器中,HTML5网页可以通过触摸事件实现手势操作,提升用户体验。虽然原生JavaScript提供了基…

    2026年5月10日
    000
  • 深入理解 Express.js 中 next() 参数的作用与中间件机制

    本文深入探讨 express.js 中间件函数中的 `next()` 参数。它负责将控制权传递给请求-响应周期中的下一个中间件或路由处理程序。文章将详细解释 `next()` 的工作原理、中间件的注册与执行顺序,以及不正确使用 `next()` 可能导致请求挂起的风险,并通过代码示例和实际应用场景,…

    2026年5月10日
    000
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • JavaScript 闭包:理解闭包原理与内存泄漏问题

    闭包是函数访问其外部作用域变量的能力,即使外部函数已执行完毕。如 inner 函数引用 outer 中的 count,形成闭包,使变量持久存在。闭包本身无害,但可能因延长变量生命周期导致内存泄漏,例如事件监听器引用大对象时。若未及时清理 DOM 事件或定时器,闭包会阻止垃圾回收,造成内存占用过高。解…

    2026年5月10日
    000
  • JavaScript 动态菜单点击高亮效果实现教程

    本教程详细介绍了如何使用 JavaScript 实现动态菜单的点击高亮功能。通过事件委托和状态管理,当用户点击菜单项时,被点击项会高亮显示(绿色),同时其他菜单项恢复默认样式(白色)。这种方法避免了不必要的DOM操作,提高了性能和代码可维护性,确保了无论点击方向如何,功能都能稳定运行。 动态菜单高亮…

    2026年5月10日
    200
  • c++如何实现UDP通信_c++基于UDP的网络通信示例

    UDP通信基于套接字实现,适用于实时性要求高的场景。1. 流程包括创建套接字、绑定地址(接收方)、发送(sendto)与接收(recvfrom)数据、关闭套接字;2. 服务端监听指定端口,接收客户端消息并回传;3. 客户端发送消息至服务端并接收响应;4. 跨平台需处理Winsock初始化与库链接,编…

    2026年5月10日
    000
  • 谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    使用谷歌浏览器的开发者工具截图步骤:1. 按ctrl+shift+i(windows/linux)或cmd+option+i(mac)打开开发者工具。2. 点击右上角三个点,选择”更多工具”,再选择”截图”。3. 选择截取整个页面。推荐的谷歌浏览器扩展…

    2026年5月10日 用户投稿
    100
  • JavaScript函数中插入加载动画(Spinner)的正确方法

    本文旨在解决在JavaScript函数中插入加载动画(Spinner)时遇到的异步问题。通过引入async/await和Promise.all,确保在数据处理完成前后正确显示和隐藏加载动画,提升用户体验。我们将提供两种实现方案,并详细解释其原理和优势。 在Web开发中,当执行耗时操作时,显示加载动画…

    2026年5月10日
    000
  • Golang空接口如何应用在项目中

    空接口可用于接收任意类型值,常见于日志函数、通用数据结构、JSON动态解析及配置驱动逻辑,提升代码灵活性,但需配合类型断言确保安全,避免滥用以降低维护成本。 空接口 interface{} 在 Go 语言中是一个非常灵活的类型,它可以存储任何类型的值。虽然它牺牲了一部分类型安全,但在实际项目中合理使…

    2026年5月10日
    100
  • 动态更新圆形进度条:JavaScript成绩计算器集成指南

    本文档旨在指导开发者如何将JavaScript成绩计算系统与动态圆形进度条集成,实现可视化展示平均成绩。我们将详细讲解如何修改现有的JavaScript代码,使其在计算出平均分后,能够动态更新圆形进度条的进度,从而提供更直观的用户体验。本文档包含详细的代码示例和注意事项,帮助开发者轻松实现这一功能。…

    2026年5月10日
    000
  • MySQL数据库不支持中文的解决办法

    接上一篇文章,在解决了mysql+flask环境配置问题之后,往数据库存中文字符串会报1366错误,提示不正确的字符。继而发现默认的mysql采用了latin1字符集,这种编码是不支持中文的。 如果想支持中文的话,需要设置一下mysql字符集。 众所周知utf-8是可以的,gbk也没问题,为了可扩展…

    用户投稿 2026年5月10日
    000
  • Golang使用Protobuf定义接口与消息格式

    Protobuf通过字段编号实现兼容性,新增字段可忽略、删除字段可保留编号,确保新旧版本互操作,支持服务独立演进。 在Golang项目中,利用Protobuf定义接口和消息格式,本质上是为服务间通信构建了一套高效、类型安全且跨语言的契约。它让数据结构清晰可见,RPC调用标准化,极大地简化了分布式系统…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信