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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月7日 13:45:00
下一篇 2025年11月7日 13:45:29

相关推荐

  • 如何使用Golang进行WebSocket通信

    WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于实时数据传输场景,比如聊天应用、实时通知等。Golang 通过第三方库 gorilla/websocket 提供了对 WebSocket 的良好支持。下面介绍如何使用 Golang 实现 WebSocket 通信。 1. 安…

    2025年12月16日
    000
  • Golang如何使用Benchmark测试不同输入规模

    使用Benchmark函数可评估Go代码性能,通过testing.B参数实现自动循环测试,结合b.Run和b.ResetTimer精确测量不同输入规模下的执行时间与内存分配,分析算法复杂度并优化代码。 在Go语言中,使用Benchmark函数可以评估代码在不同输入规模下的性能表现。通过testing…

    2025年12月16日
    000
  • Golang私有模块如何配置访问

    配置GOPRIVATE环境变量并设置Git认证(SSH或HTTPS+Token)可使Go正确拉取私有仓库模块,必要时配合replace指令调整路径。 在使用 Go 模块时,如果需要引入私有 Git 仓库(如 GitHub、GitLab 或公司内部 Git 服务)的模块,Go 命令默认无法直接拉取,需…

    2025年12月16日
    000
  • Golang单元测试代码组织与目录结构实践

    Go语言单元测试应与业务代码同目录放置,文件名以_test.go结尾,便于访问非导出成员并提升维护性。目录结构需清晰对齐包设计,如user/下包含user.go和user_test.go。复杂项目可区分单元、集成与端到端测试:集成测试用//go:build integration标签隔离,通过go …

    2025年12月16日
    000
  • Golang如何处理JSON请求和响应

    Go语言通过encoding/json和net/http包处理JSON,定义结构体时使用json标签(如json:”name”)控制字段映射,omitempty可忽略空值;解析请求时用json.NewDecoder读取r.Body并解码到结构体,需错误处理并关闭Body;返回…

    2025年12月16日
    000
  • Golang Docker容器环境搭建与开发示例

    首先搭建Go与Docker环境,再编写Web服务并创建Dockerfile,最后构建镜像运行容器实现应用容器化。 在现代后端开发中,Go语言(Golang)与Docker的结合越来越普遍。这种组合不仅能提升开发效率,还能保证应用在不同环境中的稳定性。本文将带你一步步搭建Golang的Docker开发…

    2025年12月16日
    000
  • Golang netHTTP请求Header处理示例

    在Go中处理HTTP Header需掌握客户端与服务端的设置与读取方法。1. 使用req.Header.Set(key, value)设置单个Header,重复调用会覆盖原值;2. 使用req.Header.Add(key, value)为同一Key添加多个值,适用于Accept等字段;3. 响应H…

    2025年12月16日
    000
  • 如何在Golang中实现RPC调用链监控

    使用OpenTelemetry实现Golang RPC调用链监控,需集成SDK并配置gRPC拦截器,在客户端和服务端自动注入追踪逻辑,通过metadata传递TraceID与SpanID,确保上下文透传;结合OTLP Exporter将数据发送至Jaeger等后端系统,实现调用链可视化,并可通过自定…

    2025年12月16日
    000
  • 如何使用Golang开发Web后台管理系统

    使用Golang开发Web后台管理系统需选择高效框架如gin,设计RESTful API并划分路由组,集成GORM操作数据库实现用户、角色等模块,通过JWT实现鉴权中间件保护接口,返回统一数据格式对接前端,结合validator、zap和Swagger提升系统稳定性和可维护性。 开发一个Web后台管…

    2025年12月16日
    000
  • 如何使用Golang实现命令模式撤销操作

    命令模式撤销操作的核心在于将请求封装成对象,支持执行与撤销。在Golang中需定义统一Command接口,包含Execute和Undo方法;以InsertTextCommand为例,执行时插入文本,撤销时删除对应内容;通过CommandManager维护命令栈,执行时入栈,撤销时出栈并调用Undo,…

    2025年12月16日
    000
  • 深入理解Go程序执行:go run与go build的差异与应用

    本文深入探讨了Go语言中`go run`和`go build`命令的核心差异及其对程序行为(特别是`os.Args[0]`和`os.Getwd()`)的影响。通过具体示例,阐明了`go run`将程序编译至临时目录执行的机制,以及`go build`生成可执行二进制文件的过程。文章强调了这两种命令在…

    2025年12月16日
    000
  • 函数可变参数与默认值如何使用

    默认参数在定义时计算一次,避免使用可变对象作为默认值,应使用None并在函数内初始化;2. args收集位置参数为元组,kwargs收集关键字参数为字典;3. 参数顺序必须为普通参数、默认参数、args、kwargs,组合使用可提升函数灵活性。 在 Python 中,函数的可变参数和默认值是两个非常…

    2025年12月16日
    000
  • Go syscall 包:RawSyscall 与 Syscall 的深入解析

    本文旨在深入解析 Go 语言 `syscall` 包中的 `RawSyscall` 和 `Syscall` 函数,包括参数含义、汇编代码分析、`zsyscall` 文件的作用以及两者之间的区别。通过本文,你将了解如何以及何时使用这两个函数编写自定义系统调用,并理解它们在 Go 运行时中的作用。 Ra…

    2025年12月16日
    000
  • Go HTTP路由中正则表达式的常见陷阱与精确匹配实践

    本文深入探讨了在Go语言HTTP路由中使用正则表达式时可能遇到的匹配陷阱。通过一个具体的案例,揭示了由于字符类与分组语法的混淆,导致请求被错误路由的问题。文章详细分析了问题根源,提供了正确的正则表达式写法,并给出了完整的代码示例及一系列最佳实践,旨在帮助开发者构建更健壮、精确的Go Web服务路由。…

    2025年12月16日
    000
  • Go项目非代码资源管理与部署策略

    本文旨在探讨go语言项目中非代码资源(如配置文件、html模板、图片等)的管理与部署策略。go的官方目录结构主要面向源代码,`go build/install`命令也仅处理代码文件,这使得非代码资源的集成成为挑战。文章将介绍自定义部署流程、相对路径处理方法以及现有框架如何解决这些问题,帮助开发者构建…

    2025年12月16日
    000
  • Go并发编程:构建可动态管理URL的定时数据采集器

    本文深入探讨了在go语言中如何安全高效地实现一个定时轮询任务,并支持动态更新轮询的url列表。通过利用go的goroutine和channel机制,我们构建了一个并发安全的“采集器”模型,确保在定时触发数据采集的同时,能够响应并处理新的url添加请求,有效避免了竞态条件,实现了灵活且健壮的定时任务管…

    2025年12月16日
    000
  • Golang如何开发图书管理系统

    答案:使用Golang开发图书管理系统需分层设计,包括model定义图书结构,store实现数据存储,service处理业务逻辑,handler响应HTTP请求。通过Gin框架搭建RESTful API,用内存或数据库存储数据,结合路由与中间件实现增删改查功能,并注重错误处理与输入验证,便于后期扩展…

    2025年12月16日
    000
  • Go语言并发编程:解决Goroutine中循环变量捕获的常见问题

    本文深入探讨了go语言中在使用goroutine和循环时常见的变量捕获陷阱。当goroutine在循环内部创建时,如果闭包直接引用循环变量,它们会捕获变量的引用而非其当时的值,导致所有goroutine最终都使用循环结束时的变量值。文章提供了详细的问题分析、正确的解决方案(通过参数传递变量副本)及跨…

    2025年12月16日
    000
  • Go语言中实现高效分级日志:从核心概念到流行库实践

    本教程探讨go语言中分级日志的实现策略,旨在满足将日志同时输出到控制台和文件的需求,并支持通过命令行参数配置日志级别。文章将介绍分级日志的重要性,剖析现有流行日志库的特点,并提供具体示例,指导开发者选择并应用合适的日志解决方案,以构建健壮、可观测的go应用。 分级日志的重要性与核心需求 在现代软件开…

    2025年12月16日
    000
  • 解决 Ubuntu 中 Golang 编译问题的配置指南

    本文旨在帮助开发者解决在 Ubuntu 系统中配置 Golang 环境时遇到的编译错误问题。通过详细分析环境变量配置,特别是 GOROOT 和 GOPATH 的设置,以及提供正确的配置示例,本文将指导读者避免常见的配置陷阱,确保 Golang 环境在 Ubuntu 系统中正常运行。 Golang 环…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信