1. 磁盘管理基础与核心命令概览
在Linux系统管理中,磁盘空间管理是每个运维人员和开发者必须掌握的硬核技能。记得刚入行时,我曾因为没及时监控磁盘使用率,导致生产环境MySQL服务崩溃——那个不眠之夜教会了我df、du、fdisk这三个命令的真正价值。
这三个命令各司其职:df(disk filesystem)展示文件系统整体使用情况,du(disk usage)统计目录/文件的实际磁盘占用,fdisk则是磁盘分区管理的瑞士军刀。它们就像汽车仪表盘(df)、油量检测仪(du)和发动机调校工具(fdisk)的组合,共同保障存储系统健康运行。
2. df命令深度解析
2.1 基础使用与输出解读
执行df -h会看到如下典型输出:
code复制Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p2 476G 312G 140G 70% /
tmpfs 16G 0 16G 0% /dev/shm
关键列解析:
- Filesystem:设备路径或网络存储标识
- Use%:警戒阈值建议不超过80%(实测超过90%会导致服务异常)
- Mounted on:挂载点路径,
/dev/shm是内存虚拟文件系统
经验:总有人问为什么df显示使用率100%但du统计不到大文件?这通常是进程占用文件后又被删除导致的,用
lsof | grep deleted能找到这些"幽灵文件"。
2.2 实用参数组合
df -Th:显示文件系统类型(ext4/xfs等)df -i:监控inode使用情况(小文件多的系统要特别关注)df --total:末尾添加汇总行(适合脚本处理)
我曾用watch -n 60 df -h实现简易磁盘监控,配合mailx在达到阈值时自动报警,这个临时方案在缺乏专业监控工具时特别管用。
3. du命令实战技巧
3.1 精准定位大文件
du -sh /* | sort -rh | head -10这个命令组合是我的最爱:
-s:只显示汇总大小-h:人类可读格式(GB/MB)sort -rh:按数值逆序排序head -10:显示前10大目录
最近用这个方法发现某日志目录占用了200GB,原因是未配置logrotate导致调试日志暴增。建议将这类检查加入crontab定期执行。
3.2 高级用法与坑点规避
du --apparent-size:显示文件逻辑大小而非物理占用(对稀疏文件重要)du -x:不跨越文件系统边界(避免统计到挂载的NFS)du -c:最后显示总计(配合sort时注意顺序)
避坑指南:在NFS环境下执行du可能极慢,添加
--time参数可以看到时间消耗在哪些目录上。遇到百万级小文件时,改用find . -type f -printf '%s\n' | awk '{total+=$1}END{print total}'更高效。
4. fdisk分区管理详解
4.1 分区操作全流程
以给新增的/dev/sdb磁盘分区为例:
bash复制sudo fdisk /dev/sdb
交互命令序列:
n创建新分区(主分区/扩展分区)p查看当前分区表t修改分区类型(Linux默认83,交换分区82)w将改动写入磁盘
血泪教训:操作前务必用
lsblk确认磁盘设备名!有次误将sdb输成sda,差点格式化系统盘...
4.2 分区对齐优化
现代SSD建议使用2048扇区对齐:
bash复制(echo g; echo n; echo; echo; echo; echo +100G; echo w) | sudo fdisk /dev/sdb
其中g创建GPT分区表,+100G分配100GB空间。对齐不当会导致SSD性能下降30%以上。
5. 综合应用场景
5.1 磁盘扩容标准流程
- 用
fdisk删除旧分区并创建更大新分区(确保起始扇区相同) partprobe让内核重读分区表resize2fs调整文件系统大小(XFS用xfs_growfs)
5.2 自动化监控脚本
bash复制#!/bin/bash
THRESHOLD=90
CURRENT=$(df / --output=pcent | tail -1 | tr -d '% ')
[ $CURRENT -ge $THRESHOLD ] && \
echo "Warning: / usage $CURRENT%" | mail -s "Disk Alert" admin@example.com
6. 进阶工具链
当基础命令无法满足需求时:
ncdu:交互式磁盘分析工具(比du更直观)lsblk:显示块设备拓扑关系smartctl:监控磁盘健康状态iotop:实时I/O监控
最近处理的一个案例:df显示空间不足但du找不到大文件,最终用ncdu发现是Docker容器日志未限制大小导致的。建议将此类工具加入日常巡检清单。
7. 性能优化实践
- 对于频繁写入的目录(如MySQL数据目录),建议单独挂载XFS文件系统
- 使用
noatime挂载选项减少metadata写入 - SSD环境下启用discard(TRIM)功能:
bash复制# /etc/fstab示例
UUID=xxx / ext4 defaults,discard 0 1
在Kubernetes节点上,我曾通过将/var/lib/docker挂载到单独SSD并采用XFS+discard方案,使容器部署速度提升40%。这些实战经验才是真正值钱的部分。