Linux运维进阶技巧-磁盘空间分析
df查看分区
df命令可以查看分区情况。
df使用语法如下:
df 选项
【示例】查看每个挂载点的空间使用情况
root@ihavetwocats:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
tmpfs tmpfs 340M 1.5M 339M 1% /run
/dev/vda2 ext4 69G 20G 47G 30% /
tmpfs tmpfs 1.7G 148K 1.7G 1% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
以上每列含义:
- Filesystem:设备或分区名称
- Type:文件系统类型
- Mounted on:挂载点
- Use%:空间使用率
df命令常用选项:
| 选项 | 全写 | 说明 | 示例 |
|---|---|---|---|
| -h | –human-readable | 以人类可读的方式显示(自动换算单位:KB/MB/GB) | df -h |
| -H | –si | 使用 1000 为换算单位(1K=1000字节) | df -H |
| -T | –print-type | 显示文件系统类型(ext4、xfs、tmpfs 等) | df -hT |
| -i | –inodes | 显示 inode 使用情况(文件数量层面) | df -i |
| -a | –all | 显示所有文件系统(包括伪文件系统,如 proc、sysfs) | df -ah |
| -t | –type=TYPE | 仅显示指定类型的文件系统 | df -t ext4 |
| -x | –exclude-type=TYPE | 排除指定类型的文件系统 | df -x tmpfs |
| –total | (无短写) | 在输出末尾添加总计行 | df -h --total |
| -P | –portability | 使用标准格式输出(每行一个文件系统) | df -P |
| –output | (无短写) | 自定义输出列(可选字段:source、size、used、avail、pcent、target) | df --output=source,size,used,pcent,target |
| –sync | (无短写) | 在显示前先同步文件系统数据(确保统计最新) | df --sync -h` |
| –block-size=SIZE | (无短写) | 以指定块大小显示(如 --block-size=1M) | df --block-size=1M |
| <路径> | (位置参数) | 仅显示该路径所在文件系统的信息 | df -h /var/log |
du统计文件大小
通常我们可以使用ls命令来列出目录列表,并且可以加上-lh选项来显示文件的大小,但是不能显示出目录的大小,所有目录的显示大小都是4.0K。
于是使用du命令不仅可以统计文件的大小,还能统计目录的大小。
du使用语法如下:
du 选项 目录路径
【示例1】查看根目录/下所有目录大小,层级为1
root@ihavetwocats:~# du -h -d 1 /
25M /tmp
8.0G /var
130M /boot
1.5M /run
8.3G /data
204K /root
4.0K /media
0 /sys
16K /lost+found
0 /proc
6.1M /etc
124K /dev
4.0K /mnt
4.7G /usr
20K /opt
64K /home
1.4G /snap
4.0K /srv
23G /
【示例2】查看根目录/下除了run、proc目录的所有目录大小,层级为1,
root@ihavetwocats:~# du -ch -d 1 / --exclude="run" --exclude="proc"
25M /tmp
8.0G /var
130M /boot
8.3G /data
208K /root
4.0K /media
0 /sys
16K /lost+found
6.0M /etc
124K /dev
4.0K /mnt
4.7G /usr
20K /opt
64K /home
1.4G /snap
4.0K /srv
23G /
23G total
补充说明:排除多个文件或目录只需使用多个
--exclude=选项即可。
du命令常用选项:
| 选项 | 全写 | 说明 | 示例 |
|---|---|---|---|
| -h | –human-readable | 以人类可读的方式显示(自动换算为 KB/MB/GB) | du -h /var |
| -s | –summarize | 仅显示目录总计(不显示子目录明细) | du -sh /var/log |
| -d | –max-depth=N | 限制递归统计深度,N 为目录层级 | du -h -d 1 /data |
| -a | –all | 显示所有文件和目录(默认只显示目录) | du -ah /etc |
| -c | –total | 在输出最后增加总计行 | du -ch /usr |
| –exclude=PATTERN | (无短写) | 排除匹配的文件或目录 | du -h --exclude="*.log" /var |
| –apparent-size | (无短写) | 显示文件逻辑大小(忽略稀疏文件节省) | du -h --apparent-size file.img |
| -x | –one-file-system | 不跨越文件系统边界(只统计当前挂载点) | du -hx / |
| –inodes | (无短写) | 显示每个目录占用的 inode 数量 | du --inodes -h /var |
| -L | –dereference | 统计符号链接目标文件的大小 | du -hL /link/path |
查看磁盘I/O
1.iostat工具
可以使用iostat命令实时监控磁盘I/O的使用情况。
iostat -x 1
查看结果如下图所示:

主要查看%util和await两个值,表达含义:
- %util:接近 100% 表示磁盘I/O繁忙
- await:I/O等待时间过长说明有瓶颈
2.iotop工具
使用iotop命令可以实时查看进程的I/O使用情况,常用于排查“哪个进程在疯狂读写磁盘”、“磁盘 I/O 负载高”的问题。相比iostat工具,iotop更能排查IO占用高的进程。
iotop不是Linux默认的命令工具,可能需要安装,安装方法如下:
Debian / Ubuntu
apt -y install iotop
RedHat / CentOS
yum -y install iotop
iotop使用语法如下:
iotop 选项
查看结果如下图所示:

关键字段说明:
- TID / PID:表示线程ID(TID)或进程ID(PID)。使用
-P选项时仅显示进程PID。 - PRIO:I/O调度优先级(priority)。一般格式如 be/4,其中be表示Best Effort(默认调度类),4是优先级等级。
- USER:进程所属的用户名,方便定位是哪个用户发起的I/O操作。
- DISK READ:当前进程每秒读取磁盘的速率,单位通常为KB/s或MB/s。用于判断进程是否在频繁读取磁盘。
- DISK WRITE:当前进程每秒写入磁盘的速率。用于识别占用写带宽的程序(如日志、数据库、备份任务等)。
- SWAPIN:进程从交换分区(swap)换入内存的比例(百分比)。若数值较高,说明内存不足,导致频繁使用 swap。
- IO%:表示进程被I/O阻塞(等待磁盘读写完成)的时间占比。数值高说明该进程大部分时间在等待磁盘操作完成,I/O瓶颈明显。
- COMMAND:执行命令或程序名。通常显示进程的启动命令(包括路径和参数),帮助快速识别应用来源。
iotop命令常用选项
| 选项 | 全写 | 说明 | 示例 |
|---|---|---|---|
| -o | –only | 仅显示有 I/O 活动的进程 | iotop -o |
| -b | –batch | 批处理模式(非交互输出,可用于日志或脚本) | iotop -b -n 10 |
| -n NUM | –iterations=NUM | 设置输出刷新次数 | iotop -b -n 5 |
| -d SEC | –delay=SEC | 设置刷新间隔时间(秒) | iotop -d 2 |
| -p PID | –pid=PID | 仅显示指定 PID 的进程 | iotop -p 1234 |
| -u USER | –user=USER | ||
| -a | –accumulated | 累计显示 I/O 总量(从启动到现在) | iotop -a |
| -k | –kilobytes | 以 KB/s 显示带宽(默认是 MB/s) | iotop -k |
| -P | –processes | 仅显示进程(不显示线程) | iotop -P |
| -t | –time | 在每行前显示时间戳(适合日志模式) | iotop -b -t |
| –version | 无 | 显示版本信息 | iotop --version |
| –help | 无 | 显示帮助信息 | iotop --help |
☆常用技巧☆
1.查找占用空间最大的文件或目录
可以结合du命令和sort命令以及head命令来查找占用空间最大的文件或目录。
使用语法:
du -h -d 查找目录层级 查找目录 | sort -hr | head
【示例】查找根目录/下最大的一个目录,查找层级设为1
du -h -d 1 / | sort -hr | head
2.快速查找大文件
使用find命令的-size选项可以查找指定大小或者多少大小以上的文件。
使用语法:
find 查找目录 -type f -size +文件大小 -exec ls -lh {} \;
【示例】查找根/目录下500M以上的文件
find / -type f -size +500M -exec ls -lh {} \;
★排查磁盘占用神器:ncdu
ncdu是Linux下磁盘空间分析与清理的“神器”,尤其在排查磁盘占用过多问题时比du更直观。
ncdu也不是Linux默认的命令工具,可能需要安装,安装方法如下:
Debian / Ubuntu
apt -y install ncdu
RedHat / CentOS
yum -y install ncdu
ncdu使用语法如下:
ncdu 选项 目录路径
【示例1】从根目录/查找哪个目录占用最多空间
ncdu /
【示例2】分析根目录,但不跨越文件系统
ncdu -x /
【示例3】分析根目录,排除/proc和/tmp目录
ncdu --exclude /proc --exclude /tmp /
【示例4】将扫描结果导出为 JSON 文件,便于离线分析
ncdu -o /tmp/ncdu-report.json /
【示例5】从导出文件加载结果查看
ncdu -f /tmp/ncdu-report.json
分析整个磁盘空间演示
假如我们需要分析从根目录/下所有的目录文件磁盘空间占用的情况,工具会一层一层目录递归进行扫描,如下图所示:

界面会将次级所有目录按照磁盘占用从大到下依次排列展示出来,以及该目录或文件所占用的具体大小显示出来,我们可以一层一层选择排查空间中有哪些目录或文件占用了磁盘空间。如下图所示:

交互操作快捷键
| 按键 | 功能说明 |
|---|---|
| ↑ / ↓ | 上下移动光标 |
| ← | 返回上一级目录 |
| → / Enter | 进入选中目录 |
| g | 跳转到某个目录 |
| d | 删除选中文件或目录(需确认) |
| r | 刷新当前目录统计 |
| n | 按名称排序 |
| s | 按大小排序 |
| q | 退出 ncdu 界面 |
ncdu命令常用选项
| 选项 | 全写 | 说明 | 示例 |
|---|---|---|---|
| -x | –one-file-system | 不跨越文件系统边界(仅分析当前挂载点) | ncdu -x / |
| -a | –all | 包含隐藏文件和目录(以 . 开头) | ncdu -a /home |
| -e | –extended | 显示更多文件信息(如权限、时间戳) | ncdu -e /data |
| -r | –read-only | 以只读模式运行(防止误删) | ncdu -r / |
| -q | –quiet | 不显示扫描进度条 | ncdu -q / |
| -o | –output=FILE | 将扫描结果导出为文件(JSON 格式) | ncdu -o /tmp/ncdu.json / |
| -f | –input=FILE | 从导出文件加载结果查看 | ncdu -f /tmp/ncdu.json |
| –exclude=PATTERN | (无短写) | 排除匹配的文件或目录 | ncdu --exclude /proc --exclude /tmp / |
| –exclude-from=FILE | (无短写) | 从文件中读取排除规则 | ncdu --exclude-from=/etc/ncdu.ignore / |
| –si | (无短写) | 使用 1000 进制(而非 1024)显示大小 | ncdu --si / |
| –apparent-size | (无短写) | 显示文件的逻辑大小(非实际磁盘占用) | ncdu --apparent-size /var/lib |
| –color=MODE | (无短写) | 设置颜色模式(auto, always, never) | ncdu --color=auto / |
| -0 | (无全写) | 以 NUL 分隔符输出结果(脚本分析时使用) | ncdu -0 -o out.json / |
| -v | –version | 显示版本信息 | ncdu -v |
| -h | –help | 显示帮助信息 | ncdu -h |