商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > Linux怎么查看磁盘空间占用 Linux常用df和du指令详解

Linux怎么查看磁盘空间占用 Linux常用df和du指令详解

  发布于2026-05-21 阅读(0)

扫一扫,手机访问

如果你在Linux服务器上执行过磁盘空间检查,大概率遇到过这个让人困惑的场景:df -h显示根分区快满了,但用du -sh /一汇总,发现实际文件占用的空间远没那么多。这可不是什么bug,而是因为dfdu这两个命令,从设计原理上就在看不同的东西。

Linux怎么查看磁盘空间占用 Linux常用df和du指令详解

简单来说,df读取的是文件系统超级块里记录的“已分配块总数”,而du则是老老实实遍历目录树,去统计每个文件“实际占用的块数”。理解了这个根本差异,很多问题就迎刃而解了。

df -h 显示根分区 98% 已用,但 du -sh / 汇总才 60GB?

这种不一致通常指向几种情况。最常见的就是“文件被删除了,但空间没释放”。想象一下,一个进程正在写入一个大日志文件,你直接用rm命令把它删了。只要这个进程的文件句柄没关闭,它就会继续向磁盘写入数据。df命令看到这些磁盘块仍然被占用,所以统计在内;而du命令因为找不到对应的文件路径,自然就忽略了这部分空间。

类似的情况也常出现在系统日志(如/var/log/journal)或Docker容器的存储驱动(如overlay2)中,大量被删除但未释放的日志或缓存层也会导致差异。

另一个常见原因是挂载点。du -sh /命令默认不会跨文件系统统计。如果你的/home目录单独挂载在另一个分区上,那么du就不会把它计入根目录的总大小。而df显示的则是/所在分区的整体使用率,两者自然对不上。

快速排查可以分两步走:先用lsof +L1命令查看是否有状态为“deleted”的已打开文件;再用df -hT确认一下各个目录的挂载点是否独立。

du -sh /var 速度慢、卡住,怎么安全提速?

du命令默认会递归扫描所有子目录,包括隐藏文件。一旦遇到权限不足的目录、网络文件系统(NFS)挂载点或者损坏的符号链接,就可能阻塞或报错,导致扫描过程异常缓慢。

有几个实用的技巧可以帮你安全地提速:

  • 限制扫描深度:加上--max-depth=1参数,只查看一级子目录的大小,比如du -sh --max-depth=1 /var
  • 忽略权限错误:将标准错误输出重定向到/dev/null,跳过那些因权限问题无法访问的目录:du -sh --max-depth=1 /var 2>/dev/null
  • 排除特定路径:如果你已经知道某个目录(比如Docker的数据目录)很大且暂时无关,可以用--exclude参数将其排除:du -sh --max-depth=1 --exclude=/var/lib/docker /var
  • 快速定位大头:想直接找出占用最多的前十个目录?可以组合使用命令:du -sh /var/* 2>/dev/null | sort -hr | head -n 10

顺便提一句,du -s(以块为单位)和du -sh(以人类可读格式)在性能上几乎没有差别,单位转换的计算开销可以忽略不计。真正的瓶颈永远在磁盘I/O速度和文件系统的权限检查上。

df -i 显示 Use% 100%,但 df -h 还剩 50GB?

这是典型的inode耗尽问题。在Linux文件系统中,每个文件或目录(哪怕是一个空文件)都需要消耗一个inode。当inode被用光时,即使磁盘还有剩余空间,系统也会报告“No space left on device”,导致无法创建新文件。

遇到这种情况,可以按以下步骤排查:

  • 首先,运行df -i确认是哪个挂载点的inode使用率达到了100%。
  • 接着,在对应的路径下查找小文件密集的目录。可以使用类似这样的命令进行采样:find /path -xdev -type f | cut -d/ -f1-3 | sort | uniq -c | sort -nr | head -n 5
  • 常见的“重灾区”包括邮件队列目录(如/var/spool/postfix/maildrop)、临时目录(如/tmp下堆积的session文件)以及容器运行时产生的海量日志文件。

需要注意的是,对于ext4这类文件系统,inode的数量是在使用mkfs创建文件系统时就固定下来的,无法在线扩容。解决办法要么是清理掉大量小文件,要么就只能备份数据后重建文件系统并分配更多的inode。

ncdu 比 du 更好用,但它不能替代 df

ncdu可以看作是du的交互式增强版。它提供了键盘导航、实时排序、删除确认等功能,在交互式定位大文件或目录时非常方便。

但是,必须清楚ncdu的本质:它仍然是基于du的逻辑,只统计文件系统中可见的文件。这意味着它无法反映那些已被删除但未释放的空间,也无法显示文件系统级别的元数据开销,比如日志(journal)或预留块(reserved blocks)。

  • 安装很简单,在Debian/Ubuntu上使用sudo apt install ncdu,在RHEL/CentOS上使用sudo yum install ncdu
  • 使用时,直接运行ncdu /var即可开始扫描。在交互界面中,按d键可以删除选中的项目(请谨慎操作)。
  • 然而,它不会告诉你/boot分区只剩下20MB,也不会警告你tmpfs(内存文件系统)快满了——这些全局的、文件系统层面的状态,依然是df命令的职责范围。

最后,分享一个容易被忽略的排查习惯:很多运维人员习惯只盯着df -h看空间使用率,却忘了结合df -i查看inode使用情况,以及使用df -x tmpfs来排除内存文件系统的干扰。当遇到“磁盘明明有空间却无法写入”的诡异问题时,后面这两个命令往往是破案的关键。

本文转载于:https://www.php.cn/faq/2422554.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注