在Ubuntu服务器上磁盘空间告急是运维中最常见的问题之一,最快的排查方式就是用du命令逐层扫描目录占用,而ncdu则提供了一个交互式的终端界面让你像浏览文件管理器一样定位大文件。简单说:du是命令行原生工具,适合写脚本和快速输出结果;ncdu是du的增强版,支持上下移动、删除文件、导出报告,适合人工排查。两个工具配合使用,基本能解决90%以上的磁盘空间分析需求。
一、du命令基础用法详解
du(Disk Usage)是Linux系统自带的磁盘使用统计工具,Ubuntu默认就有,不需要额外安装。它的核心功能是递归计算指定目录下每个文件和子目录的磁盘占用大小,最终给出一个汇总数据。
最常用的基本命令是:
du -sh /path/to/directory
其中-s表示汇总(summary),只显示总大小;-h表示人类可读格式(human-readable),自动转换为KB、MB、GB单位。比如你想看根目录总共用了多少空间:
du -sh /
如果你想看根目录下每个一级子目录分别占了多少:
du -h --max-depth=1 /
--max-depth=1限定只往下扫描一层,避免输出太长。这个参数非常实用,建议日常运维都加上。
有时候你需要按大小排序,方便快速找到最占空间的目录,可以配合sort命令:
du -h --max-depth=1 /var | sort -hr
sort -hr的意思是按人类可读数字倒序排列,最大的排在最前面。这一行命令在排查/var目录(通常存放日志、缓存、数据库数据)时特别好用。
二、du命令的进阶技巧
除了基本用法,du还有几个进阶参数值得掌握。第一个是--exclude,可以排除某些目录不统计:
du -sh --exclude=/proc --exclude=/sys /
/proc和/sys是虚拟文件系统,统计它们没有实际意义,排除后结果更准确,扫描速度也更快。
第二个是-a参数,显示所有文件而不只是目录:
du -ah --max-depth=2 /home
这会列出/home下所有文件和目录的大小,适合精确定位某个具体文件占了多少空间。但注意,文件多的时候输出会非常长。
第三个实用技巧是结合find命令找大文件。du擅长统计目录,但如果你想直接找出超过某个阈值的单个文件:
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
这条命令会在整个文件系统中查找大于100MB的文件,并列出详细信息。2>/dev/null是把权限不足的错误信息屏蔽掉,避免刷屏。
还有一个容易忽略的点:du统计的是文件实际占用的磁盘块大小,不是文件的逻辑大小。如果你想看文件逻辑大小,应该用ls -lh或者stat命令。两者在小文件密集的场景下差异明显,因为磁盘块通常是4KB对齐的,一个1字节的文件也会占用4KB。
三、ncdu安装与基本使用
ncdu(NCurses Disk Usage)是一个基于ncurses库的交互式磁盘分析工具,界面类似于Midnight Commander那种双栏文件管理器风格。它的优势在于你可以用方向键上下移动、进入子目录、直接删除文件、导出扫描结果,非常直观。
在Ubuntu上安装非常简单:
sudo apt update sudo apt install ncdu
安装完成后,扫描根目录:
sudo ncdu /
因为扫描整个文件系统需要读取所有文件的元数据,必须用root权限。ncdu会先花一段时间扫描(取决于磁盘大小和文件数量),扫描完成后进入交互界面。
界面中你会看到按大小排序的目录列表,用上下方向键选择,回车进入子目录,按d键可以直接删除选中的文件或目录(会有确认提示),按q退出。按?可以查看所有快捷键。
四、ncdu的高级功能与实用场景
ncdu有几个高级功能在实际运维中非常有用。第一是导出扫描结果,方便在其他机器上分析或者存档:
ncdu -o /tmp/ncdu-report.json /
这会把扫描结果保存为JSON格式到指定文件。之后你可以在另一台机器上用ncdu读取这个报告:
ncdu -f /tmp/ncdu-report.json
这个功能在你无法直接SSH到问题服务器但能把报告文件传过来的场景下特别有用。
第二是排除特定目录,加快扫描速度:
ncdu --exclude /proc --exclude /sys --exclude /dev /
第三是扫描完成后按s键可以按文件数量排序而不是按大小排序,有时候你想找的不是最大的文件而是文件数量最多的目录(比如某个程序产生了大量小文件)。
在实际运维场景中,我建议这样使用ncdu:先用ncdu -x /快速扫描排除虚拟文件系统,找到可疑的大目录;然后针对那个目录用du --max-depth=2精确到二级子目录;最后用find命令定位具体的大文件。三步走下来,基本能把任何磁盘占用问题查清楚。
五、常见磁盘空间占用大户排查指南
在Ubuntu服务器上,磁盘空间被吃掉通常就那么几个地方,了解这些高频占用点能让你排查效率翻倍。
第一是系统日志。/var/log目录下的syslog、kern.log、auth.log等会随着时间不断增长。用journalctl可以查看systemd日志占用:
journalctl --disk-usage
如果日志太大,可以清理:
sudo journalctl --vacuum-size=500M
第二是APT缓存。/var/cache/apt/archives目录存放已下载的deb包,安装完软件后这些包不会自动删除:
sudo apt clean
第三是Docker。如果你的服务器跑了Docker,/var/lib/docker目录可能占用几十GB甚至上百GB,包括镜像、容器、卷数据。用du看一下:
sudo du -sh /var/lib/docker
清理无用镜像和停止的容器:
docker system prune -a
第四是旧的内核。Ubuntu更新后不会自动删除旧内核,/boot目录可能积累多个版本。查看当前内核:
uname -r
删除旧内核(保留当前和上一个):
sudo apt autoremove --purge
第五是用户家目录下的隐藏文件,比如.cache、.local/share等,这些目录容易被忽略但积少成多。
六、自动化监控磁盘空间的建议
作为运维,不能每次都等磁盘满了才去排查。建议设置定时任务定期用du生成报告,或者用更专业的监控工具。一个简单的crontab脚本:
0 6 * * * root du -h --max-depth=2 / > /var/log/disk-usage-daily.log 2>&1
每天早上6点自动扫描并记录。配合邮件告警或者日志监控,就能在问题变严重之前发现趋势。
另外,如果你管理多台服务器,可以考虑把ncdu的JSON报告统一收集到一个中心节点,用脚本批量分析各台机器的磁盘占用Top10目录,形成可视化报表。这比一台台登录去看效率高得多。
七、du和ncdu的选择建议
总结一下使用场景的选择:如果你在写自动化脚本、需要把结果输出到文件或者管道给其他命令处理,用du;如果你是人工排查、需要交互式浏览和快速删除文件,用ncdu。两者不是替代关系而是互补关系。熟练掌握这两个工具,Ubuntu服务器的磁盘空间管理基本就不会出大问题了。
最后提醒一点,无论用哪个工具,扫描大文件系统时都会产生一定的I/O负载,建议在业务低峰期操作。如果是生产环境的大容量存储(比如几十TB的NAS挂载),先用df -h确认挂载点,再针对性地对那个挂载点做du或ncdu扫描,避免无意义地扫描整个系统。
