1. Linux磁盘空间管理的重要性
作为一名Linux系统管理员,我每天上班第一件事就是检查服务器的磁盘空间使用情况。记得有一次,凌晨三点被报警电话吵醒,原来是生产环境的日志把磁盘撑爆了,导致关键服务崩溃。从那以后,我养成了定期检查磁盘空间的习惯,也深刻理解了掌握这些基础命令的重要性。
Linux系统提供了多种原生命令来监控磁盘使用情况,无需安装任何第三方工具。这些命令各有所长,有的适合快速查看整体情况,有的擅长分析具体目录,还有的能显示底层设备信息。下面我将结合自己五年的运维经验,详细介绍这些命令的使用场景和实用技巧。
2. 基础命令详解与实战应用
2.1 df命令:文件系统空间概览
df(disk filesystem)是我最常用的命令,它能快速显示所有挂载文件系统的空间使用情况。基本用法很简单:
bash复制df -h
这里的-h参数表示"human-readable",会自动将字节转换为KB、MB、GB等更易读的单位。在我的日常工作中,这个命令的输出通常长这样:
code复制Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 15G 4.3G 78% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
/dev/sdb1 100G 82G 13G 87% /data
经验之谈:重点关注Use%超过80%的分区,这些是需要优先处理的高风险区域。特别是/var和/home这类经常增长的分区。
进阶用法:
df -i:查看inode使用情况(小文件多的系统要特别注意)df -T:显示文件系统类型(ext4/xfs等)df --total:在最后一行显示汇总信息
2.2 du命令:目录级空间分析
当df显示某个分区空间不足时,下一步就是用du(disk usage)找出到底是哪些目录占用了空间。我最常用的组合是:
bash复制du -sh /*
这个命令会显示根目录下所有一级目录的大小(-s表示汇总,-h表示易读格式)。比如在/data分区空间告急时,我可以快速定位到是哪个子目录出了问题:
code复制12G /data/logs
68G /data/database
120K /data/config
更精细的分析可以结合sort命令:
bash复制du -h /data/logs | sort -rh | head -10
这会列出/data/logs下占用空间最大的10个文件/目录,按从大到小排序。
避坑指南:在目录文件特别多的情况下,du可能会很慢。这时可以先用
ls -lS按大小排序快速查看大文件,或者使用ncdu这个交互式工具。
2.3 lsblk命令:块设备拓扑视图
lsblk命令提供了比df更底层的视角,它能显示磁盘和分区的物理结构:
bash复制lsblk -f
典型输出:
code复制NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 5f3e-1a2b /boot
├─sda2 swap 7b8c-9d0e [SWAP]
└─sda3 xfs 1234-5678 /
sdb
└─sdb1 ext4 abcd-ef01 /data
这个视图特别有用:
- 查看未挂载的磁盘空间(比如新加的硬盘)
- 理解多磁盘系统的物理布局
- 排查挂载点配置问题
实用技巧:结合
-o参数可以自定义输出列,比如lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
2.4 fdisk命令:分区表专家
虽然fdisk主要用于分区操作,但它的查看功能也很强大:
bash复制sudo fdisk -l
输出示例:
code复制Disk /dev/sda: 50 GiB, 53687091200 bytes
Disklabel type: gpt
Device Start End Sectors Size Type
/dev/sda1 2048 1050623 1048576 512M EFI System
/dev/sda2 1050624 104857599 103806976 49.5G Linux filesystem
关键信息包括:
- 磁盘总容量和物理信息
- 分区表类型(MBR/GPT)
- 每个分区的起止位置和大小
- 分区类型标识
安全提示:fdisk是危险命令,普通查看时记得加
-l参数,避免误入修改模式。
3. 高级技巧与自动化监控
3.1 组合命令的威力
在实际运维中,我经常组合使用这些命令。比如这个一行命令可以显示空间使用率最高的5个分区:
bash复制df -h | grep -v tmpfs | sort -k5 -rn | head -5
另一个实用例子是找出大于100MB的日志文件:
bash复制find /var/log -type f -size +100M -exec ls -lh {} \;
3.2 自动化监控方案
对于重要服务器,我建议设置自动化监控。一个简单的方案是使用crontab定期检查:
bash复制# 每天检查一次,空间超过90%时发邮件报警
0 9 * * * df -h | awk '$5 > 90 {print $6 " is at " $5}' | mail -s "Disk Space Alert" admin@example.com
更专业的方案可以结合Prometheus+Grafana,使用node_exporter采集磁盘指标并设置告警规则。
3.3 性能优化技巧
-
对于海量小文件的场景,
du可能会很慢。这时可以:- 使用
find . -type f -printf "%s\n" | awk '{sum+=$1} END {print sum}'快速计算 - 或者先用
tar打包再查看大小
- 使用
-
在SSD上,
fstrim可以回收未使用的块,延长寿命并提升性能 -
对于数据库等IO敏感应用,建议单独分区并使用
noatime挂载选项减少写入
4. 常见问题排查指南
4.1 df和du显示不一致
有时会遇到df显示空间已满,但du统计的使用量却小很多。这通常是因为:
- 有进程占用了已删除的文件(用
lsof | grep deleted查找) - 文件系统存在损坏(需要
fsck检查) - 配额限制(检查
quota -v)
4.2 空间突然被占满
应急处理步骤:
- 用
df -h确认哪个分区出问题 - 用
du -sh /*定位大目录 - 检查日志文件(
/var/log) - 查找core dump文件(
find / -name core -size +100M) - 检查是否有僵尸进程占用空间
4.3 扩容后的空间不显示
扩容云磁盘后,有时需要:
- 用
lsblk确认OS识别了新大小 - 用
growpart扩展分区 - 用
resize2fs或xfs_growfs扩展文件系统
5. 最佳实践总结
经过多年运维实践,我总结出以下经验:
- 监控先行:对关键分区设置85%的预警阈值
- 日志轮转:配置logrotate防止日志爆炸
- 分离存储:将易增长的目录(如/var、/home)放在独立分区
- 定期维护:清理缓存、临时文件和旧版本软件包
- 文档记录:记录每台服务器的磁盘布局和清理策略
最后分享一个实用alias,我把它加在了~/.bashrc中:
bash复制alias diskspace='df -h; echo; lsblk; echo; du -sh /* 2>/dev/null | sort -h'
这样只需输入diskspace就能一次性获取所有关键信息。记住,预防胜于治疗,定期检查磁盘空间可以避免很多深夜紧急呼叫。