在 Linux 日常运维中,快速了解磁盘使用情况是两个最基本的操作。df 和 du 虽然都与磁盘空间有关,但它们的观察角度完全不同,配合使用才是排查磁盘问题的正确方式。
1. df:查看文件系统整体使用情况df(disk free)以文件系统为单位,显示每个挂载点的总空间、已用空间、可用空间和挂载点。最常用的命令格式是 df -h,其中 -h 表示以人类可读的单位(K、M、G)显示,避免你数着字节位数头晕:
$ df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 50G 20G 28G 42% /
/dev/sdb1 100G 80G 15G 85% /data
tmpfs 7.8G 0 7.8G 0% /dev/shm
- 快速定位磁盘满问题:当你收到“磁盘空间不足”的错误时,先运行
df -h可以看到是哪个分区(挂载点)满了。常见的是根分区/或数据分区/var、/home等。 - 关注已用%列:当某个文件系统使用率接近 100% 时,需要马上清理或扩容。
- 注意 inode 耗尽:有时磁盘空间明明还有余量,但无法创建新文件,这是因为 inode(索引节点)用完了。使用
df -i可以查看每个文件系统的 inode 使用情况:
$ df -i /home
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sda2 655360 655360 0 100% /home
这种情况常见于存放海量小文件(如海量邮件、缓存文件)的目录。
2. du:查看目录或文件实际占用空间du(disk usage)统计指定目录或文件实际占用了多少磁盘块,而不是文件系统级别的汇总。它主要用于找出“到底是哪个目录占空间最大”。最常用的组合是:
du -sh /home/user/*
-s:汇总(summary),只列出所给参数的汇总大小,而不会展开每个子目录。-h:人类可读格式。
例如,想找出当前目录下占用空间最大的前 5 个文件夹,可以用:
du -h --max-depth=1 /var | sort -hr | head -5
这里 --max-depth=1 只统计下一级子目录的大小,sort -hr 按人类可读的数字从大到小排序。
- 直接查看当前目录总大小:
du -sh .会给出当前目录(包括所有子目录)的真实占用空间。 - 找出大文件:有时更需要找到单个大文件,可以用
find配合-size选项,但du也可以做到,比如:
du -ah /var/log | sort -rh | head -10
-a 会包括文件而不仅仅是目录。
3. df 与 du 的差异及其排错价值
一个常见的故障场景是:df 显示某个分区快满了,但 du 统计出来的所有目录占用总和小得多。这通常是因为某个被删除的文件仍然被某个进程占用,此时文件的空间不会释放。排查方法是:
lsof | grep deleted
或
lsof +L1
找到状态为 deleted 的文件和对应的进程,重启或终止该进程即可回收空间。这种差异排查是运维中非常实用的技巧。
总结来说,df 给你宏观视图(哪个分区告急),du 让你深入到具体目录和文件(谁在占用空间),两者结合才能完成一次完整的磁盘清理或问题诊断。