答案:df和du是Linux磁盘管理的核心命令,df -h查看文件系统整体使用情况,du -sh分析目录空间占用,通过df定位高占用分区后,用du --max-depth=1逐级深入查找大文件,结合sort和head筛选最大占用者,注意df与du差异常因已删除但被进程占用的文件导致,可用lsof | grep deleted排查,定期清理日志、临时文件、旧内核并配置监控告警可有效预防空间不足问题。

在Linux系统中,检查磁盘使用情况是日常系统维护的关键一环,我们主要依赖
df和
du这两个命令。简单来说,
df(disk free)用于查看文件系统整体的磁盘空间使用情况,它能告诉你各个挂载点还剩多少空间;而
du(disk usage)则专注于估算文件或目录所占用的空间,当你需要找出某个特定目录下哪些文件或子目录是“大胃王”时,它就派上用场了。两者各有侧重,理解它们的差异和适用场景,能让你在管理磁盘空间时事半功倍。
解决方案
要检查Linux中的磁盘使用情况,核心就是灵活运用
df和
du命令。
1. 使用 df
命令查看文件系统整体空间
df命令报告的是文件系统层面的磁盘空间使用情况。它读取的是文件系统的元数据,所以执行速度很快。
-
查看所有文件系统的使用情况(人类可读格式):
df -h
这个命令会列出所有已挂载的文件系统,显示它们的大小、已用空间、可用空间、使用百分比以及挂载点。
-h
选项将输出转换为人类可读的格式(如GB、MB),这比原始的块大小更直观。 -
查看特定文件系统的使用情况:
df -h /home
如果你只关心
/home
分区的情况,可以指定路径。 -
显示文件系统类型:
df -Th
-T
选项会额外显示文件系统的类型,比如ext4、xfs等,这在某些故障排查时会很有用。 -
查看inode使用情况:
df -ih
-i
选项用于查看inode的使用情况。inode是文件系统中的一个数据结构,每个文件或目录都会占用一个inode。如果inode耗尽,即使磁盘空间还有,也无法创建新文件。
2. 使用 du
命令估算文件或目录占用空间
du命令则深入到目录结构中,逐个计算文件和子目录的大小,然后汇总。这使得它在查找具体是哪个文件或目录消耗了大量空间时非常有效,但对于超大型目录,执行时间可能会比较长。
-
查看当前目录的总大小(人类可读格式):
du -sh .
-s
选项表示“汇总”(summarize),它只会显示指定目录的总大小,而不会列出其下的所有文件和子目录。.
表示当前目录。 -
查看指定目录的总大小:
du -sh /var/log
这会显示
/var/log
目录及其所有内容的汇总大小。 -
查看当前目录下所有子目录的大小(不递归深入):
du -h --max-depth=1 .
--max-depth=1
是一个非常实用的选项,它只会显示当前目录下一级子目录的大小,而不会继续深入。这对于快速识别哪个顶级子目录占用空间最大非常有用。 -
找出占用空间最大的前几个文件或目录: 结合
sort
和head
命令,可以高效地定位“元凶”。du -h /path/to/check | sort -rh | head -n 10
这里,
sort -rh
会按大小逆序排列(-r
表示逆序,-h
表示处理人类可读的数字),然后head -n 10
取出前10行,即最大的10个文件或目录。
Linux磁盘空间告急,如何快速定位占用大文件的元凶?
当系统突然报告磁盘空间不足,或者某个分区的使用率飙升时,最让人头疼的就是如何迅速找出那些“大文件”或“大目录”。我个人处理这类问题时,通常会采用一种自上而下、逐步深入的策略,而
du命令是这个过程中的绝对主力。
首先,我会用
df -h快速确认是哪个分区满了。假设是根分区
/。接下来,我不会直接在根目录下跑
du -sh *,因为那可能会花费很长时间,而且输出量巨大。更有效的方法是:
-
从根目录开始,查看第一级子目录的占用情况:
sudo du -h --max-depth=1 / | sort -rh | head -n 10
这里加上
sudo
是因为很多系统目录需要root权限才能读取。这个命令会列出/
目录下占用空间最大的前10个子目录。通常,像/var
、/opt
、/usr
、/home
这些目录是重点关注对象。 -
定位到最大的子目录,继续深入: 假设上一步发现
/var
目录占用了大部分空间,那么下一步就是进入/var
,重复上述操作:sudo du -h --max-depth=1 /var | sort -rh | head -n 10
这样,你可能会发现
/var/log
或/var/lib
是主要贡献者。 -
针对性地检查: 如果发现是
/var/log
,那很可能是日志文件膨胀。我会查看/var/log
下的具体日志文件:sudo du -h /var/log/*.log | sort -rh | head -n 10
或者,如果日志文件太多,可以再次用
--max-depth=1
来查看子目录:sudo du -h --max-depth=1 /var/log | sort -rh | head -n 10
通过这种迭代的方法,你就能很快地锁定具体是哪个文件或目录导致了磁盘空间不足。经验告诉我,通常是日志文件、数据库文件、用户上传的大文件或旧的备份文件在作怪。
df与du报告的磁盘使用量为何有时会出现偏差?
这是一个非常常见的疑问,也是很多初学者在排查磁盘空间问题时会遇到的“坑”。
df和
du命令在某些情况下确实可能报告不同的磁盘使用量,这并非它们有bug,而是因为它们统计的方式和侧重点不同。
最主要,也最常见的差异原因,就是已删除但仍被进程占用的文件。
想象一下这个场景:一个应用程序(比如一个Web服务器或数据库)正在写入一个日志文件。突然,这个日志文件变得非常大,你作为系统管理员,为了释放空间,直接用
rm命令删除了这个文件。
-
df
命令的视角: 当你执行rm
命令后,文件系统会立即将这个文件的目录条目删除,并认为这些块现在是“空闲”的。所以,df
命令会立刻显示磁盘空间增加了,因为从文件系统的角度看,这些空间已经可以被重新分配了。 -
du
命令的视角:du
命令是通过遍历目录树来计算文件大小的。由于你已经删除了文件的目录条目,du
在遍历时就“看不见”这个文件了,自然也不会把它计入总和。 -
实际情况: 尽管文件被删除了,但如果那个应用程序仍然打开着这个日志文件(持有它的文件描述符),那么操作系统实际上并没有释放那些磁盘块。这些块会一直被占用,直到那个应用程序关闭了文件或者它自己退出。这就是为什么
df
显示空间已释放,而实际可用空间却没有增加,或者说你用du
加起来的总和远小于df
报告的已用空间。
如何排查这种情况? 你可以使用
lsof命令来查找那些被删除但仍被进程打开的文件:
sudo lsof | grep deleted
这个命令会列出所有被打开的文件,并过滤出那些状态为
(deleted)的文件。输出会显示哪个进程(PID)打开了哪个文件。一旦你找到罪魁祸首,你可以尝试重启相关服务,或者直接杀死那个进程(谨慎操作!),这样被占用的磁盘空间就会被真正释放。
除了这个主要原因,还有一些次要因素也可能导致差异:
-
硬链接:
du
会为每个硬链接的文件只计算一次空间,而df
计算的是实际占用的块。 -
稀疏文件(Sparse Files): 稀疏文件在文件系统中只占用实际写入数据的块,未写入的部分不占用磁盘空间。
du
可能会报告文件的逻辑大小(包括稀疏部分),而df
报告的是实际分配的块。 -
文件系统元数据:
df
报告的已用空间包括了文件系统自身的元数据、日志等,这些du
通常不会计算在内。
理解这些差异,能让你在面对看似矛盾的磁盘使用报告时,更有信心去分析和解决问题。
Linux磁盘空间管理的实用技巧与最佳实践
有效管理Linux磁盘空间不仅仅是知道如何检查,更在于如何预防和解决问题。在多年的系统维护经验中,我总结出了一些非常实用的技巧和最佳实践,希望能帮助大家避免磁盘空间不足的窘境。
-
定期清理日志文件: 日志文件是磁盘空间最常见的“吞噬者”。
-
利用
logrotate
: 大多数Linux发行版都内置了logrotate
工具,它能自动对日志文件进行轮换、压缩和删除。务必检查并配置好/etc/logrotate.conf
及其目录下的配置文件,确保重要服务的日志能够按时清理。 -
手动清理: 对于一些没有被
logrotate
管理的日志,或者临时性的大型日志,你可以手动清理。例如,删除30天前的旧日志:sudo find /var/log -type f -name "*.log" -mtime +30 -delete
注意: 在删除任何文件前,请务必确认其重要性,并避免删除当前正在写入的日志文件。
-
利用
-
管理临时文件:
/tmp
和/var/tmp
目录是系统和应用程序存放临时文件的地方。-
系统自动清理: 大多数系统会配置
tmpwatch
或systemd-tmpfiles-clean
来自动清理这些目录。确保这些服务正常运行。 -
手动清理: 如果发现临时目录过大,可以手动清理,但要小心,不要删除当前正在使用的文件。通常,重启系统是清理
/tmp
最安全的方式,因为所有临时文件都会被清除。
-
系统自动清理: 大多数系统会配置
-
清理旧的内核版本: 每次系统更新都可能安装新的内核,而旧的内核版本通常会被保留,以防新内核出现问题。但随着时间推移,这些旧内核会占用大量空间。
-
Debian/Ubuntu:
sudo apt autoremove --purge
这个命令会自动删除不再需要的依赖包,包括旧的内核。
-
RHEL/CentOS/Fedora:
sudo dnf remove --oldinstallonly --setopt installonly_limit=2 kernel
或者手动列出并删除:
rpm -qa | grep kernel | sort sudo yum remove kernel-`uname -r` # 删除当前正在使用的内核以外的旧内核
警告: 至少保留一个可用的旧内核,以防新内核启动失败。
-
Debian/Ubuntu:
识别并处理大文件/目录: 利用前面提到的
du -h --max-depth=1 /path | sort -rh | head -n 10
命令,定期扫描关键分区,找出异常增长的目录。一旦找到,深入分析并决定是归档、删除还是迁移。-
配置监控与告警: 最有效的管理方式是防患于未然。
- 监控工具: 使用Prometheus、Zabbix、Nagios等监控系统,对磁盘使用率设置阈值(例如80%或95%)。
-
脚本告警: 对于小型环境,可以编写简单的shell脚本,结合
cron
和mail
命令,当磁盘使用率超过某个百分比时,自动发送邮件通知。#!/bin/bash THRESHOLD=90 PARTITION="/" USAGE=$(df -h $PARTITION | awk 'NR==2 {print $5}' | sed 's/%//g')
if [ "$USAGE" -gt "$THRESHOLD" ]; then echo "Warning: Disk usage on $PARTITION is at $USAGE%" | mail -s "Disk Space Alert" your_email@example.com fi
将此脚本添加到`crontab`中,定期执行。
合理规划分区: 在系统安装初期,合理地规划分区(例如,将
/var
、/home
、/opt
等常用易满的目录独立分区)可以有效避免一个分区满导致整个系统崩溃的问题。即使某个分区满了,也不会影响其他分区的功能。
记住,磁盘空间管理是一个持续的过程。没有一劳永逸的解决方案,只有持续的关注和维护才能确保系统的稳定运行。










