1. 磁盘管理三剑客:df、du、fdisk 核心解析
在 Linux 系统管理中,磁盘空间管理是每个运维人员和开发者必须掌握的基础技能。无论是排查存储空间不足的问题,还是规划分区方案,df、du、fdisk 这三个命令都是不可或缺的工具。它们就像瑞士军刀中的不同功能模块,各司其职又相互配合。
我曾在一次线上事故中深刻体会到它们的重要性:当时一个日志服务突然宕机,用 df 快速发现是根分区爆满,通过 du 定位到是某个应用的调试日志异常增长,最后用 fdisk 扩展了磁盘空间。整个过程不到 15 分钟就解决了问题,这就是掌握这些基础工具的价值。
2. df 命令:磁盘空间宏观监控
2.1 基础用法与关键参数
df (disk filesystem) 命令用于显示文件系统的磁盘空间使用情况。最基本的用法是直接输入:
bash复制df
这个命令会列出所有已挂载文件系统的使用情况,包括总容量、已用空间、可用空间和使用百分比。但实际工作中我们通常需要更精确的信息,这时就需要了解几个关键参数:
-h:人类可读格式显示(自动转换为 KB、MB、GB)-T:显示文件系统类型-i:显示 inode 使用情况而非块使用情况--total:在最后一行显示总计信息
一个实用的组合命令是:
bash复制df -hT --total
这个命令会输出类似如下的信息:
code复制Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 50G 32G 16G 67% /
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
total - 54G 32G 20G 61% -
2.2 生产环境实用技巧
在实际运维中,df 命令有几个特别实用的技巧:
- 监控特定文件系统:当你有多个挂载点时,可以指定只查看某个路径:
bash复制df -h /var/log
- 排除特定文件系统类型:使用
-x参数可以排除某些文件系统类型,比如不想显示 tmpfs:
bash复制df -h -x tmpfs
- inode 监控:有时候磁盘空间充足但系统仍报"no space",可能是 inode 耗尽了:
bash复制df -i
- 自动化监控:可以结合 watch 命令实现动态监控:
bash复制watch -n 5 'df -h /'
重要提示:某些 NAS 或网络存储设备可能不会实时更新空间信息,这时 df 显示的数据可能有延迟。对于关键业务存储,建议使用存储设备自带的监控工具进行交叉验证。
3. du 命令:磁盘使用微观分析
3.1 命令基础与常用参数
如果说 df 是望远镜,那么 du (disk usage) 就是显微镜。它用于估算文件和目录的磁盘使用空间,特别适合定位大文件或找出空间占用异常的目录。
基本语法:
bash复制du [选项] [文件或目录]
最常用的参数组合:
bash复制du -sh *
这个命令会以人类可读格式(-h)显示当前目录下所有文件和目录的总大小(-s)。输出类似:
code复制4.0K backup.sh
1.2G logs
24K config
8.0M app.tar.gz
其他重要参数:
-c:显示总计--max-depth=N:限制显示的目录深度-a:显示所有文件而不仅是目录--time:显示最后修改时间
3.2 高级用法与性能优化
du 命令在处理大量文件时可能会变慢,这时可以采用一些优化技巧:
- 快速定位大文件:
bash复制du -ah / | sort -rh | head -20
这个命令会找出系统中最大的 20 个文件/目录。注意在生产环境执行可能需要 sudo 权限。
- 排除特定目录:
bash复制du -h --exclude='*.log' /var
- 按时间筛选:
bash复制du -ah --time /var/log | grep '2023-10'
- 并行处理加速:
对于特别大的目录,可以使用 GNU parallel 加速:
bash复制find /data -type d | parallel -j 8 'du -s {}' | sort -n
经验之谈:du 统计的是磁盘实际占用空间,而 ls 显示的是文件逻辑大小。对于稀疏文件或压缩文件系统,这两个值可能有显著差异。在排查空间问题时,应该始终以 du 的统计为准。
4. fdisk 命令:磁盘分区管理专家
4.1 分区管理基础操作
fdisk 是 Linux 下最经典的磁盘分区工具,虽然现在有 parted 等更现代的工具,但 fdisk 仍然是许多系统管理员的首选。它的基本用法是:
bash复制sudo fdisk -l # 列出所有磁盘信息
sudo fdisk /dev/sdb # 对特定磁盘进行操作
进入交互模式后,常用命令包括:
n:新建分区d:删除分区p:打印分区表w:写入并退出q:不保存退出
一个典型的分区创建流程:
- 列出当前磁盘:
bash复制sudo fdisk -l
- 选择要操作的磁盘(假设是 /dev/sdb):
bash复制sudo fdisk /dev/sdb
- 在交互界面中:
- 输入
n创建新分区 - 选择主分区(p)或扩展分区(e)
- 设置分区号(1-4)
- 指定起始和结束扇区(通常直接回车使用默认值)
- 输入
t可以修改分区类型(如 83 是 Linux,8e 是 LVM) - 最后
w保存退出
- 输入
4.2 高级分区技巧与注意事项
- 分区对齐优化:
现代磁盘(特别是 SSD)需要正确的分区对齐以获得最佳性能。通常建议使用 1MiB 对齐:
bash复制sudo fdisk /dev/sdb
# 在第一个扇区输入 2048(即 1MiB 边界)
- 处理大于 2TB 的磁盘:
对于大容量磁盘,fdisk 可能不适用,应该使用 parted 或 gdisk:
bash复制sudo parted /dev/sdb
- 分区后操作:
创建分区后,还需要创建文件系统并挂载:
bash复制sudo mkfs.ext4 /dev/sdb1
sudo mkdir /data
sudo mount /dev/sdb1 /data
- 修复分区表:
如果分区表损坏,可以尝试:
bash复制sudo fdisk /dev/sdb
# 使用 'x' 进入专家模式
# 然后 'r' 恢复分区表
严重警告:fdisk 是直接操作磁盘分区表的工具,错误的操作可能导致数据永久丢失。执行前务必:1) 备份重要数据 2) 确认操作的是正确的磁盘设备 3) 在生产环境建议先在测试系统上演练。
5. 综合应用场景与问题排查
5.1 典型磁盘问题排查流程
结合这三个命令,我们可以建立一个标准的磁盘问题排查流程:
- 宏观空间检查:
bash复制df -hT
确认哪个挂载点空间不足
- 微观空间分析:
bash复制du -sh /path/to/full/mount/*
找出占用空间最大的目录
- 进一步定位:
bash复制du -ah --max-depth=2 /path/to/large/dir | sort -rh | head -20
找出具体的文件
- 如果需要扩容:
bash复制sudo fdisk -l
检查磁盘空间情况,然后决定是清理文件还是扩容
5.2 常见问题解决方案
问题1:df 显示磁盘空间不足,但 du 统计的空间总和远小于磁盘使用量
可能原因:
- 文件被删除但仍有进程占用(lsof 检查)
- 文件系统元数据占用过多空间
- 磁盘配额限制
解决方案:
bash复制lsof +L1 # 查找被删除但仍被占用的文件
sudo tune2fs -l /dev/sda1 | grep 'Block count' # 检查文件系统元数据
问题2:无法删除文件,提示磁盘空间不足,但 df 显示有空间
可能原因:
- inode 耗尽
- 磁盘配额限制
解决方案:
bash复制df -i # 检查 inode 使用情况
find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n # 查找 inode 使用大户
问题3:fdisk 分区后系统不识别新分区
解决方案:
bash复制sudo partprobe /dev/sdb # 重新读取分区表
sudo blockdev --rereadpt /dev/sdb # 另一种方法
5.3 自动化监控脚本示例
对于需要持续监控的环境,可以创建一个简单的监控脚本:
bash复制#!/bin/bash
THRESHOLD=90
MOUNT_POINT="/"
USAGE=$(df -h --output=pcent "$MOUNT_POINT" | tail -1 | tr -d '% ')
if [ "$USAGE" -ge "$THRESHOLD" ]; then
echo "警告: $MOUNT_POINT 使用率 ${USAGE}% 超过阈值 ${THRESHOLD}%"
echo "空间占用最大的10个目录:"
du -h --max-depth=1 "$MOUNT_POINT" 2>/dev/null | sort -rh | head -11 | tail -10
fi
这个脚本可以加入 crontab 定期执行,或在系统启动时执行。
6. 进阶工具与替代方案
虽然 df、du、fdisk 是经典组合,但在特定场景下,其他工具可能更适合:
- ncdu:交互式磁盘使用分析器,比 du 更直观
bash复制sudo apt install ncdu
ncdu /
- lsblk:更清晰的块设备列表
bash复制lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL
- parted:更适合现代大容量磁盘的分区工具
bash复制sudo parted -l
- iotop:实时监控磁盘 I/O
bash复制sudo iotop -o
- btrfs/zfs:现代文件系统自带的空间管理工具
bash复制sudo btrfs filesystem usage /
对于需要长期维护的系统,建议将这些命令的常用组合保存为脚本或别名,比如在 ~/.bashrc 中添加:
bash复制alias diskspace='df -hT --total'
alias bigfiles='du -ah --max-depth=1 2>/dev/null | sort -rh | head -20'
alias listdisks='lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL'