磁盘空间分析:ncdu、du
在使用服务器时,监控磁盘空间的使用情况非常重要。如果磁盘已满,可能会导致 VPS 运行出错,例如 502 错误、编辑时文件被删除以及数据库损坏。为避免此类问题,应定期检查磁盘空间使用情况,删除不需要的文件,并在必要时扩容磁盘。
要分析服务器上的磁盘空间使用情况,可以使用 ncdu 和 du 工具。这些工具可以帮助您轻松找出哪些文件和目录占用了最多的磁盘空间。本文将介绍 ncdu 工具。
ncdu
ncdu 是一款方便的磁盘空间使用分析工具。它的伪图形界面让使用过程简单直观。
并非所有 Unix 发行版都预装了 ncdu,但可以使用以下命令轻松安装:
# Debian / Ubuntu:
apt install ncdu
# CentOS:
yum install ncdu
如果磁盘已完全占满而无法安装 ncdu,您可以使用 du 工具(见下文)删除不需要的文件,在安装 ncdu 之前先释放一些空间。
要使用 ncdu 扫描并分析特定目录,请执行以下命令:
ncdu 目录名
例如,要分析根目录,请执行:
ncdu /
输出格式
# 符号可以帮助您判断哪些文件和目录占用了最多的磁盘空间。
最左侧的列可能包含附加标记(例如上方截图中的 e 标记):
- ! - 读取目录时出错;
- . - 读取子目录时出错,可能导致大小统计不准确;
- < - 该对象已被排除在统计之外(使用 --exclude 选项时);
- > - 该对象来自其他文件系统;
- @ - 该对象不是文件或目录(符号链接、套接字);
- H - 该对象已被统计过(硬链接);
- e - 空目录。
导航
使用方向键(上、下)在目录之间移动。
要进入所选目录,请按右方向键或 Enter 键。
要返回上一级目录,请按左方向键。
界面可用功能
可以使用以下按键控制输出:
n - 按名称排序(正序和倒序);
s - 按大小排序(正序和倒序);
g - 在图形显示 (####) 和已用空间百分比之间切换;

a - 在显示文件实际大小和其在磁盘上占用的空间之间切换;
e - 隐藏/显示隐藏文件和目录;
? - 打开简要帮助;
d - 删除所选项目(需要确认);
i - 显示所选项目的信息;

q - 退出。
ncdu 参数
使用该工具时,您还可以为 ncdu 指定各种参数:
-h(例如 ncdu -h)—— 显示简要帮助;
-q —— 以“安静模式”运行,每 2 秒更新一次数据。默认每秒更新 10 次。此模式可以减少远程连接时传输的数据量;
-x —— 扫描时只统计同一文件系统中的文件和目录。例如,如果目录 home/user/site.com 中包含从另一块磁盘上的其他目录(/mnt/disk2/site.com)挂载的文件和目录,默认情况下 ncdu 会认为 /home/user/site.com 目录占用了主磁盘的空间,尽管它实际位于 disk2 磁盘上。使用 -x 参数可以正确反映主磁盘的实际情况;
-r —— “只读”模式,可防止删除文件;
--exclude —— 可将某个文件或某类文件排除在已用空间统计之外。例如:
ncdu --exclude=/目录路径/*要排除的内容*
例如:
ncdu --exclude=/home/user/*.html*
-o —— 将结果保存到文件:
ncdu / -o 文件路径.tx
du
du 工具(英文 disk usage 的缩写)默认包含在所有 UNIX 发行版中,用于提供磁盘空间使用情况的总体信息。
执行该命令时,它会输出当前目录中每个文件和目录所占用的空间:
du 参数
要以易读的形式(KB、MB 等)显示大小,需要使用 -h 参数,下面所有命令都将使用该参数。
- 例如,可以先估算根文件系统中所有目录的大小。为此,请使用 -s(显示指定目录的总大小)和 -c(显示合计值)参数:
du -shc /*
- 一种实用又方便的统计和排序方法:
du -sch ./*|sort -hr
- 要查看特定目录的大小,请使用 -s 参数并指定目录路径:
du -sh /目录路径
- 要显示目录中所有文件和子目录的大小,请使用 -a 参数:
du -ah /目录路径
- 要显示所有列出项目的总大小,请使用 -c 参数:
du -ch /目录路径
- 可以使用 --exclude 选项从输出中排除某些类型的文件。
du -ah --exclude="*要排除的内容*"
例如:
du -ah --exclude="*.html*"
- 另一个有用的选项是显示文件的最后修改时间。为此请使用 --time:
du -ah --time /目录路径
注意事项
du、ncdu 与软件显示的数据不一致
- 有时会出现这样的情况:du 和 ncdu 显示的已用空间比管理面板中显示的少,或者您删除了文件,但软件仍然提示空间不足。
这种情况下,可以使用 df 命令获取文件系统的信息(因为 du 和 ncdu 显示的是磁盘上的实际占用量):
df -h
您很可能会看到空间占用率为 100%。
这可能是因为文件被删除后,仍被某个正在运行的进程占用,文件系统仍将其计入已用空间总量。
要解决此问题,需要找出哪些进程仍在使用已删除的文件:
lsof | grep '(deleted)'
然后重启这些进程:
service 进程名 restart
例如,下方截图中显示的是需要重启的 httpd 进程:
- 如果管理面板、du 和 df 都显示有可用空间,但您的软件或系统却提示相反,则需要检查可用的 inodes。