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

发布时间 - 2025-09-07 00:00:00    点击率:

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 NAME
java      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个最大的。这招特别好用,能让你快速定位问题。

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

/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

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

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

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

    df -h
    ,一眼就能看出是哪个挂载点(比如
    /
    /var
    /home
    )的空间快用完了。这能帮你缩小排查范围。

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

    df
    显示某个分区快满了,但你用
    du -sh /path/to/that/partition
    去统计,却发现
    du
    的结果远小于
    df
    ,那么八九不离十,就是有被删除但仍被进程占用的文件。这时候,毫不犹豫地运行
    lsof | grep deleted
    。找到那些占用大空间且被标记为
    (deleted)
    的文件,然后根据
    COMMAND
    PID
    定位到对应的服务。如果可以,重启该服务,或者直接kill掉它(谨慎操作,确保不会影响业务),通常就能立刻释放空间。

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

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

    • 比如,如果
      /
      分区满了,你可以从
      /
      开始:
      du -shx /* | sort -rh | head -n 20
      。这会列出根目录下最大的20个一级目录。
    • 根据结果,你就能知道是哪个目录占用了大部分空间(比如
      /var
      /opt
      /home
      )。
    • 然后,继续深入那个大目录,重复这个过程,直到你找到具体的“罪魁祸首”文件或目录。例如,如果发现
      /var
      很大,那就
      du -shx /var/* | sort -rh | head -n 20
  4. 常见的“大胃王”区域:

    • /var/log/
      :日志文件,尤其是那些没有配置好轮转策略的应用程序日志,或者系统日志(如
      syslog
      journal
      )。
    • /tmp/
      :临时文件目录,虽然系统会定期清理,但有时会有残留。
    • /home/
      :用户家目录,用户可能下载了大量文件、图片、视频等。
    • /opt/
      :一些第三方软件的安装目录,有时会放置大量数据或备份。
    • /var/lib/docker/
      :如果你使用了Docker,这个目录会存放镜像和容器的数据。
    • 数据库文件:MySQL、PostgreSQL等数据库的数据文件通常会非常大。
    • 备份目录:如果你有定期备份,但没有及时清理旧备份,它们会迅速填满磁盘。
  5. 利用

    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命令  # mysql  # linux  # java  # centos  # node  # docker  # 操作系统  # app  # sort  # Directory  # Filesystem  # 递归  # var  # delete  # postgresql  # 数据库  # ubuntu  # debian  # 文件系统  # 的是  # 磁盘空间  # 如果你  # 它会  # 你可以  # 就能  # 遍历  # 当你  # 满了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  南京网站制作费用,南京远驱官方网站?  韩国服务器如何优化跨境访问实现高效连接?  如何在阿里云虚拟服务器快速搭建网站?  装修招标网站设计制作流程,装修招标流程?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel如何为API编写文档_Laravel API文档生成与维护方法  如何在IIS7上新建站点并设置安全权限?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Python高阶函数应用_函数作为参数说明【指导】  Laravel如何配置任务调度?(Cron Job示例)  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  如何快速登录WAP自助建站平台?  香港服务器租用费用高吗?如何避免常见误区?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  lovemo网页版地址 lovemo官网手机登录  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel如何实现本地化和多语言支持?(i18n教程)  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  在线教育网站制作平台,山西立德教育官网?  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  个人网站制作流程图片大全,个人网站如何注销?  魔方云NAT建站如何实现端口转发?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  制作电商网页,电商供应链怎么做?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  无锡营销型网站制作公司,无锡网选车牌流程?  如何将凡科建站内容保存为本地文件?  常州企业网站制作公司,全国继续教育网怎么登录?  如何在云主机快速搭建网站站点?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  开心动漫网站制作软件下载,十分开心动画为何停播?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  如何自定义建站之星模板颜色并下载新样式?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  如何在阿里云服务器自主搭建网站?