深浅主题
磁盘被日志占满
问题现象
服务无法写入、数据库报 No space left on device,磁盘使用率 100%,删除日志后可用空间仍没有增加。
适用环境
Linux、Docker json-file 或应用文件日志;需要管理员诊断权限。
本文是可复用的排障示例,不代表某次个人生产事故。命令中的名称、账号和数据均为示例,执行前请替换为已确认的目标。
复现或诊断步骤
- 用 df -hT 与 df -i 区分块空间和 inode 耗尽。
- 对明确目录运行 du -xhd1,逐层定位;避免无范围扫描大型网络挂载。
- 用 lsof +L1 检查已经删除但仍被进程打开的文件,检查 Docker 日志驱动与日志路径。
原因分析
没有轮转的日志持续增长;删除仍打开的文件只移除目录项,空间要等进程关闭描述符才释放。大量小文件可能先耗尽 inode,df 与 du 也会因挂载、权限和已删文件而不同。
修复示例
json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "5"
}
}示例是 Docker daemon 配置片段,必须合并现有配置,不能整文件覆盖。先将必要诊断日志备份到其他磁盘,再按明确文件清理或通过应用轮转;不要直接删除 Docker 管理的日志文件。daemon 默认设置通常只影响新建容器,现有容器需安排重建。重启前保存配置并评估服务影响,失败恢复配置与容器。
验证方法
确认 df 可用空间和 inode 恢复,应用继续写入,日志轮转实际触发。核对备份可读和保留周期,再删除确认可丢弃的备份;不得顺带删除数据库目录或 Docker volumes。
常见误区
docker system prune -a --volumes 不是日志修复命令,可能删除业务数据。truncate 同样丢失内容,只能在明确授权、指定日志且完成必要留存后考虑。