Linux磁盘空间不足时,除了检查文件系统容量,还必须排查inode是否被耗尽,这是两个相互独立又密切关联的维度。判断磁盘状态不能只看df -h的输出,要同时执行df -h和df -i两条命令,前者反映数据块的占用情况,后者反映文件索引节点的消耗情况。只有将两者结合分析,才能准确定位磁盘告警的根因。
df命令是Linux下查看文件系统磁盘空间占用情况的标准工具,其中-h选项以人类可读的格式显示容量信息,-i选项则显示inode的使用情况。磁盘容量耗尽时文件无法写入,inode耗尽时同样无法创建新文件,两者引发的现象都是磁盘报错。
df -h df -i
输出结果中需要关注Use%这一列,当Mount字段对用的分区Use%达到100%时,说明该分区已经没有可用空间或可用inode。根据红帽官方知识库文档《Red Hat Enterprise Linux troubleshooting disk space》的建议,系统管理员应当同时监控这两个指标,而不是单一依赖df -h的输出。
| 命令 | 检查维度 | 耗尽时的现象 | 典型场景 |
|---|---|---|---|
| df -h | 数据块容量 | 提示No space left on device | 大文件堆积、日志膨胀 |
| df -i | inode数量 | 同样提示No space left on device | 大量小文件、邮件队列 |
运行rm命令删除了大文件但磁盘空间仍不释放,原因是该文件正被某个进程占用,删除操作只是移除了目录项,文件数据仍留在磁盘上。这时需要用lsof命令找出占用文件的进程,然后重启该进程或让进程重新打开文件。
lsof +L1 2>/dev/null | head -20
+L1参数专门筛选出链接数小于1的已删除文件,输出中包含了进程PID和文件名。得到PID后执行kill命令终止对应进程,系统会自动回收文件占用的数据块。常见的文件占用场景是Nginx或Apache的access.log被误删,此时只需要执行nginx -s reopen即可让Nginx重新打开日志文件,无需重启服务,这是生产环境下最稳妥的处理方式。
当df -i显示IUse%达到100%而df -h显示空间还很充足时,说明文件系统陷入了inode耗尽状态。这种情况多见于邮件服务器、消息队列、缓存目录或临时文件目录,这些场景共同的特征是创建了海量的小文件。定位思路是找到文件数量最多的目录,然后批量清理。
find /data -xdev -type f 2>/dev/null | wc -l for dir in /data/*; do count=$(find $dir -xdev -type f 2>/dev/null | wc -l); echo "$count $dir"; done | sort -rn | head -20
这段脚本先统计/data目录下的总文件数,再逐级对子目录进行计数和排序。执行后发现某个子目录的文件数量异常庞大,再进入该目录逐层定位。find命令加上-xdev参数可以避免跨文件系统遍历,减少重复劳动。清理时用find配合-delete选项或-exec rm {} \;批量删除,前提是确认这些文件确实无用。
磁盘空间不足的根因往往指向日志文件无限增长,这里给出三个具体措施:使用logrotate管理日志轮转、配置系统日志持久化策略、为关键目录设置空间配额。据Splunk《State of Observability》报告显示,日志数据量每年增长约2.5倍,缺乏轮转机制的系统在3到6个月内就会耗尽默认磁盘分区。
/etc/logrotate.d/nginx
logrotate配置样例如下,daily表示每天轮转一次,rotate 7保留7份历史日志,compress开启压缩,Dateext使用日期后缀区分版本,missingok忽略缺失日志文件避免报错,copytruncate在复制日志后清空原文件,确保Nginx无需重启即可继续写入。
/var/log/nginx/*.log {
daily
rotate 7
compress
dateext
missingok
copytruncate
}systemd-journald默认将日志存储在/var/log/journal目录,积压的日志会持续占用磁盘空间。通过修改/etc/systemd/journald.conf中的SystemMaxUse参数限制日志占用上限,例如设置SystemMaxUse=500M,然后重启systemd-journald服务生效。这个参数定义了日志占用磁盘的最大绝对容量,超出后journald会自动清理历史日志。
[Journal] Storage=persistent SystemMaxUse=500M SystemMaxFileSize=100M
配置xfs文件系统的项目配额,为易膨胀的目录设置容量上限,防止单个服务耗尽整个分区的空间。xfs_quota工具提供了资项目配额功能,初始化时需要挂载参数pquota并将project文件值写入/etc/projects。精确的项目配额配置后,当目录占用达到限制时,超出部分会被拒绝写入,从而保护同一分区上的其他业务。
mkdir -p /data/logs echo "100:/data/logs" >> /etc/projects echo "logs:100" >> /etc/projid xfs_quota -x -c 'project -s logs' / xfs_quota -x -c 'limit -p bhard=10g logs' /
排查完日志问题后,如果空间仍然紧张,用du命令找出占用最大的目录层级。du结合sort和head可以快速列出指定目录下的容量排行,从根目录一级一级向下追踪。命令中的--max-depth=1控制层级深度,-h选项输出人类可读的容量格式。
du -h --max-depth=1 /var 2>/dev/null | sort -hr | head -10
配合sort -hr参数,输出按容量倒序排列,排名靠前的目录即为排查重点。进入排名第一的目录后重复执行此命令,两三轮循环即可找到占磁盘空间最大的具体文件。需要注意的是du扫描大量小文件时耗时较长,可以配合timeout命令限制执行时长,避免对生产环境造成过大IO压力。
Linux磁盘空间管理本质上是对数据块和inode两种资源的综合管理,df -h和df -i双命令排查法能够覆盖90%以上的磁盘告警场景。养成定期巡检的习惯,将日志轮转和磁盘配额提前配好,远比故障发生时紧急扩容更可靠。核心要点总结为:删除文件后空间未释放优先用lsof找进程,inode耗尽优先找小文件集中目录,日志增长优先配置logrotate和journald限额。
评论
加载中...