Linux磁盘空间查看教程:df与du命令详解
在Linux服务器上进行磁盘空间检查时,一个常见且令人困惑的场景是:执行df -h命令发现根分区使用率接近100%,但使用du -sh /命令汇总后,发现实际文件占用的空间远低于此。这并非系统错误,而是因为df与du这两个命令的设计原理和工作方式存在本质区别。 简而言之,df命令读取的是文件系统超级
在Linux服务器上进行磁盘空间检查时,一个常见且令人困惑的场景是:执行df -h命令发现根分区使用率接近100%,但使用du -sh /命令汇总后,发现实际文件占用的空间远低于此。这并非系统错误,而是因为df与du这两个命令的设计原理和工作方式存在本质区别。

简而言之,df命令读取的是文件系统超级块中记录的“已分配块总数”,而du命令则是通过遍历目录树来统计每个文件“实际占用的块数”。理解这一核心差异,是解决相关问题的关键。
df显示根分区使用率98%,但du统计仅为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 显示使用率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排除内存文件系统的干扰。当遇到“磁盘有空间却无法写入”的疑难问题时,后两个命令往往是解决问题的关键。
