1. Linux磁盘管理基础与场景需求
作为Linux系统管理员,磁盘空间管理是最基础也最频繁遇到的运维场景之一。记得刚入行时,我负责维护的Nginx日志服务器突然报错,排查半天才发现是磁盘写满导致日志无法滚动记录。那次教训让我深刻认识到,掌握磁盘管理命令不是选修课,而是运维人员的生存技能。
在Linux系统中,磁盘管理主要涉及三个核心需求:
- 空间监控:实时掌握各分区使用情况,预防写满风险
- 容量分析:定位大文件/目录,针对性清理
- 分区管理:调整存储结构,优化空间分配
这三个需求正好对应着df、du、fdisk这"磁盘管理三剑客"。它们就像汽车仪表盘——df是油量表,告诉你还剩多少空间;du是故障诊断仪,找出耗油大户;fdisk则是维修工具箱,可以改装油箱结构。
提示:生产环境中建议将磁盘监控纳入Zabbix等运维系统,但命令行工具仍是故障排查的终极手段。
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
/dev/nvme0n1p1 599M 187M 413M 32% /boot
关键字段解析:
- Filesystem:设备路径或网络存储标识
- Size/Avail:注意某些文件系统会保留5%空间给root
- Use%:超过80%就需要警惕,90%以上可能引发问题
- Mounted on:挂载点路径,/表示根分区
2.2 高阶应用场景
场景1:inode耗尽排查
某次收到磁盘警报但df -h显示空间充足,使用df -i才发现/tmp目录的inode用尽。这是因为小文件过多导致inode耗尽,即使磁盘空间有余也会无法写入。
场景2:网络存储监控
对于NFS等网络存储,建议组合使用:
bash复制df -hT | grep nfs # 筛选网络文件系统
df -h --output=source,target,pcent # 自定义输出列
场景3:容器环境排查
在Docker环境中,经常需要定位容器占用的存储:
bash复制df -h | grep overlay # 查看容器分层存储
docker system df # Docker专用磁盘分析
2.3 实用技巧汇总
bash复制# 监控特定目录所在分区的空间变化
watch -n 60 'df -h /var/log'
# 排除tmpfs等特殊文件系统
df -h -x tmpfs -x devtmpfs
# 生成CSV格式报告便于处理
df --output=source,fstype,size,pcent | sed 's/ \+/,/g'
3. du命令实战指南
3.1 基础用法精要
du -sh *是最常用的目录分析命令,但实际有更多实用姿势:
bash复制# 找出当前目录下最大的5个目录
du -h --max-depth=1 | sort -h | tail -n 5
# 排除特定目录扫描
du -h --exclude="*.iso" --max-depth=2 /
# 按修改时间筛选大文件
find /var -type f -mtime -7 -exec du -h {} + | sort -h
3.2 企业级应用案例
案例1:日志文件分析
某次MySQL性能下降,通过以下命令定位问题:
bash复制du -ah /var/lib/mysql | grep -E '\.ibd$' | sort -h
发现某个表空间文件异常增大,最终确认是未加索引导致的日志表膨胀。
案例2:用户磁盘配额审计
结合awk实现自动化审计:
bash复制du -s /home/* | awk '$1 > 1000000 {print $2}' # 找出超过1GB的用户目录
3.3 性能优化技巧
对于大型文件系统,du可能扫描缓慢,可以采用:
bash复制# 使用ncdu交互式工具(需安装)
ncdu /path/to/scan
# 跳过特定文件系统
du -h --exclude-from=/etc/du_exclude.list /
其中/etc/du_exclude.list可配置如/proc、/sys等虚拟文件系统路径。
4. fdisk高级分区管理
4.1 分区表类型选择
现代Linux系统主要涉及两种分区表:
- MBR:传统方案,最大支持2TB,最多4个主分区
- GPT:支持超过2TB磁盘,理论上无限分区
使用fdisk -l时注意区别:
code复制Disk /dev/sda: 1.8 TiB # GPT会显示为"Disklabel type: gpt"
Disk /dev/sdb: 500 GiB # MBR显示为"Disklabel type: dos"
4.2 交互模式实战
以在/dev/sdb创建分区为例:
bash复制fdisk /dev/sdb
交互命令序列:
g创建新的GPT分区表n新建分区(默认回车使用全部空间)t更改类型为Linux filesystem (代码8300)w写入并退出
危险操作:
d命令会立即删除分区,务必先p确认分区表
4.3 非交互式自动化
对于批量部署,可用sfdisk脚本化操作:
bash复制echo 'start=2048, size=2097152, type=83' | sfdisk /dev/sdc
或使用parted更灵活:
bash复制parted /dev/sdc mklabel gpt mkpart primary ext4 0% 100%
5. 综合故障排查手册
5.1 磁盘满应急处理流程
-
快速定位:
bash复制df -h # 确认满的分区 du -xh --max-depth=1 / 2>/dev/null | sort -h # 从根目录开始排查 -
常见清理目标:
- /var/log (日志文件)
- /tmp (临时文件)
- 用户家目录的.core文件
- Docker/容器残留数据
-
特殊场景处理:
bash复制# 删除超过30天的日志 find /var/log -type f -mtime +30 -delete # 清空大文件内容而不删除 : > /path/to/large_file.log
5.2 性能优化建议
-
分区规划原则:
- /var单独分区(日志频繁写入)
- 数据库目录使用XFS文件系统(处理大文件更优)
- SSD磁盘启用discard选项
-
监控方案:
bash复制# 加入crontab的每日检查 df -h | mail -s "Disk Report" admin@example.com -
LVM进阶技巧:
bash复制vgextend vg0 /dev/sdc1 # 扩容卷组 lvextend -r -L +20G /dev/vg0/lv_root # 在线扩容分区
6. 图形化工具替代方案
虽然命令行是运维首选,但某些场景下图形工具更高效:
-
GNOME Disks:
- 可视化SMART检测
- 便捷的基准测试功能
- 分区调整的拖拽操作
-
Baobab(磁盘使用分析器):
bash复制baobab /home # 生成直观的树状图特别适合向非技术人员展示空间占用情况
-
Cockpit网页控制台:
- 实时磁盘I/O监控
- 网页端的分区管理
- 集成到系统服务管理
实际工作中,我通常保持SSH会话开着watch -n 1 df -h,同时用Baobab定期扫描开发团队的共享目录。这种组合既能实时监控,又能快速定位问题根源。