在 Linux 系统中,查看磁盘使用情况通常分为两个层面:一是查看文件系统的整体剩余空间,二是定位具体占用空间较大的文件或目录。最推荐的组合是使用 df 命令查看挂载点水位,配合 du 命令排查大文件,深层目录建议使用 ncdu 交互分析。
先说结论:日常运维中,df -h 用于快速确认磁盘是否已满,du -h `--max-depth`=1 用于定位具体目录大小,若两者数据不一致需检查是否有进程占用已删除文件。
- 先看:使用
df -h确认哪个挂载点使用率过高 - 建议:进入对应目录后用
du -h `--max-depth`=1逐层排查,或直接用ncdu - 注意:排查已删除文件需使用
sudo lsof +L1 - 适合:空间不足报警、日志清理、容量规划场景
命令速用版
# 查看文件系统整体使用情况(人类可读格式)
df -h
# 查看当前目录下各一级子目录的大小(避免参数列表过长)
du -h `--max-depth`=1
# 查找当前目录下最大的 10 个文件或文件夹
du -ah | sort -rh | head -n 10
# 交互式查看磁盘占用(需安装)
ncdu /path/to/dir
进阶工具:ncdu 交互式分析
对于层级较深的目录,du 命令输出不易阅读,推荐使用 ncdu 进行交互式排查。
# CentOS/RHEL 安装
sudo yum install -y ncdu
# Ubuntu/Debian 安装
sudo apt install -y ncdu
# 使用示例:分析根目录
sudo ncdu /
启动后方向键导航,d 删除文件,q 退出。
为什么会这样
磁盘空间占用有时会出现“删了文件但空间没释放”的情况,这通常是因为文件被进程占用,虽然目录项被删除,但 inode 仍被进程持有。此外,df 统计的是文件系统块使用情况,而 du 统计的是文件实际大小,两者计算方式不同可能导致数值差异。
分步处理
第一步:确认整体水位
执行 df -h,关注 Use% 列。如果某个挂载点达到 90% 以上,需要优先处理。
第二步:定位大目录
进入占用高的挂载点根目录,执行 du -h `--max-depth`=1。注意这需要读取所有文件 inode,在大目录下可能较慢,建议加 sudo 避免权限错误。
第三步:检查被占用的已删除文件
如果 df 显示满但 du 加总很小,执行 sudo lsof +L1 查看是否有进程持有已删除文件(+L1 表示链接数小于 1 的文件)。
怎么验证是否生效
清理文件或重启占用进程后,再次运行 df -h,观察 Available 列数值是否增加,Use% 是否下降。
常见坑
1. du -sh * 在文件数量过多时会导致 Argument list too long 错误,且无法统计隐藏文件,请改用 du -h `--max-depth`=1。
2. 普通用户执行 lsof 无法查看其他用户进程占用的已删除文件,必须加 sudo。
3. 某些文件系统(如 ext4)会为 root 用户保留约 5% 的空间,普通用户可见空间会少于实际容量。
4. 直接在生产环境删除日志文件可能导致正在写入的进程出错,建议先清空文件内容(> file.log)再清理。
参考来源
- GNU Coreutils Documentation, "df: Report file system disk space usage", https://www.gnu.org/software/coreutils/manual/html_node/df-invocation.html
- GNU Coreutils Documentation, "du: Report file space usage", https://www.gnu.org/software/coreutils/manual/html_node/du-invocation.html