1. 磁盘空间不足的常见表现与诊断当系统提示No space left on device错误时意味着某个挂载点的可用空间已经耗尽。这个错误看似简单但背后可能隐藏着多种复杂情况。我处理过上百次这类问题发现新手和老手都可能在这个问题上栽跟头。首先我们需要确认这是真正的磁盘空间耗尽还是inode耗尽。执行以下命令可以同时检查两者df -h # 查看磁盘空间使用情况 df -i # 查看inode使用情况典型的输出会显示类似这样的信息Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 48G 2.0G 96% /当Use%接近或达到100%时就会触发这个错误。但有时候明明df显示还有空间却仍然报错这可能是因为已删除文件仍被进程占用空间未释放文件系统预留空间通常为5%磁盘配额限制某些特殊文件系统如docker overlay2的虚拟占用经验之谈在生产环境中建议在磁盘使用率达到80%时就采取行动而不是等到报错。我曾见过一个数据库在磁盘95%时性能已经严重下降。2. 快速定位空间占用大户当空间不足时第一步是找出哪些文件或目录占用了大量空间。我常用的组合命令是# 查看当前目录下各子目录大小 du -h --max-depth1 | sort -h # 查找大于100MB的文件 find / -type f -size 100M -exec ls -lh {} \; | awk { print $9 : $5 }对于数据库服务器特别需要关注以下几个目录/var/lib/mysql (MySQL数据目录)/var/log (系统日志)/tmp (临时文件)/home (用户文件)在Ubuntu系统中/var/log/journal目录的日志文件常常会不断增长。可以通过以下命令限制日志大小# 设置journal日志最大为100M sudo journalctl --vacuum-size100M3. 数据库相关空间问题处理数据库是磁盘空间的大户也是问题高发区。以MySQL为例常见问题包括3.1 表空间回收删除数据后InnoDB表空间不会自动收缩。要回收空间需要-- 优化表回收未使用空间 OPTIMIZE TABLE 表名; -- 对于大表更安全的做法是导出数据、删除表、重新导入3.2 二进制日志清理MySQL的binlog可能会占用大量空间。检查当前设置SHOW VARIABLES LIKE expire_logs_days;建议设置为7-14天SET GLOBAL expire_logs_days 7; PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 7 DAY);3.3 临时文件处理大型查询可能产生临时文件位置由tmpdir参数指定。可以通过以下命令查找SHOW VARIABLES LIKE tmpdir;4. 系统级空间清理技巧4.1 清理旧内核在Ubuntu系统中旧内核可能占用大量/boot分区空间# 列出已安装内核 dpkg --list | grep linux-image # 删除旧内核保留当前和上一个版本 sudo apt purge linux-image-5.4.0-XX-generic4.2 清理包缓存apt会保留下载的包文件sudo apt clean # 清理所有缓存的包 sudo apt autoclean # 只清理过期的包4.3 查找并删除大文件使用ncdu工具可以交互式查看磁盘使用情况sudo apt install ncdu ncdu /5. 高级问题排查与解决5.1 文件已删除但空间未释放当文件被删除但仍有进程在使用时空间不会释放。解决方法# 查找被删除但仍被占用的文件 lsof | grep deleted # 然后重启相关进程或直接kill进程5.2 LVM扩容实战如果确实需要扩容LVM是最灵活的方式。基本步骤# 查看当前VG空间 vgs # 扩展物理卷 pvresize /dev/sdb # 扩展逻辑卷 lvextend -L 20G /dev/mapper/vg-root # 调整文件系统大小 resize2fs /dev/mapper/vg-root5.3 使用fallocate快速测试测试磁盘空间不足场景时可以快速创建大文件# 创建10G的测试文件 fallocate -l 10G testfile.img # 测试完成后删除 rm testfile.img6. 预防措施与最佳实践根据我的运维经验预防胜于治疗监控设置配置磁盘空间监控在达到80%时报警日志轮转配置logrotate管理日志文件定期维护每月检查一次磁盘使用情况分离挂载将日志、数据和系统文件放在不同分区自动化清理设置定期任务清理临时文件一个简单的监控脚本示例#!/bin/bash THRESHOLD80 CURRENT$(df / | grep / | awk { print $5} | sed s/%//g) if [ $CURRENT -gt $THRESHOLD ]; then echo Warning: 根分区使用率 $CURRENT% | mail -s 磁盘空间警告 adminexample.com fi7. 特殊文件系统注意事项7.1 Docker存储Docker默认使用overlay2驱动可能会占用大量空间# 查看docker磁盘使用 docker system df # 清理无用数据 docker system prune -a7.2 虚拟内存交换交换分区也会占用磁盘空间可以通过free -h查看使用情况。7.3 稀疏文件处理某些数据库如MongoDB使用稀疏文件df显示的使用量可能不准确# 查看实际占用空间 du -h --apparent-size8. 终极解决方案架构优化当频繁遇到空间不足问题时可能需要考虑架构调整使用分布式存储系统实现冷热数据分离考虑云存储方案实施自动扩展策略比如可以设置一个自动化的数据归档流程# 将超过30天的数据归档到备份服务器 find /data -type f -mtime 30 -exec rsync -av {} backup-server:/archive \; find /data -type f -mtime 30 -exec rm {} \;在实际工作中我发现90%的磁盘空间问题都可以通过定期维护和监控来避免。关键是要建立规范的操作流程而不是等到报警才手忙脚乱地处理。每次处理空间问题时我都会记录下原因和解决方案这逐渐形成了一个有价值的知识库帮助团队更快地定位和解决类似问题。