---
name: disk-cleanup-automation
description: Linux 磁盘空间清理与自动化维护 - 分析磁盘占用、清理 Docker/日志/缓存、配置定时任务和日志轮转
category: devops
trigger: 磁盘空间不足、清理磁盘、disk cleanup、磁盘维护
---

# 磁盘清理与自动化维护

## 触发条件
- 磁盘使用率 > 80%
- 用户请求清理磁盘空间
- 定期系统维护任务

## 完整流程

### 1️⃣ 分析磁盘占用

```bash
# 检查整体磁盘使用
df -h /

# 分析大目录占用
du -sh /root/.hermes/* 2>/dev/null | sort -hr | head -20
du -sh /var/log/* 2>/dev/null | sort -hr | head -10

# 检查 Docker 空间
docker system df

# 检查系统日志占用
journalctl --disk-usage
```

### 2️⃣ 清理 Docker 空间

```bash
# 清理悬空镜像和构建缓存（可回收大量空间）
docker image prune -a -f
docker builder prune -a -f

# 预期效果：通常可回收 1-10GB
```

**注意：**
- `docker image prune -a` 会删除所有未使用镜像（包括未运行容器引用的）
- 确保重要镜像已通过 `docker pull` 可重新获取
- 正在运行的容器镜像不会被删除

### 3️⃣ 清理系统日志

```bash
# 清理 Journal 日志（保留 100M）
journalctl --vacuum-size=100M

# 清空特定日志文件（不删除文件，避免服务报错）
truncate -s 0 /var/log/btmp
truncate -s 0 /var/log/wsgidav.log

# 删除旧日志轮转文件
find /var/log -name "*.log.*" -type f -delete

# 删除特定旧日志文件
rm -f /var/log/btmp-YYYYMMDD
```

**安全提示：**
- 使用 `truncate -s 0` 而非 `rm` 清空日志文件，避免服务因文件句柄失效报错
- `/var/log/secure` 等安全日志建议保留

### 4️⃣ 清理缓存文件

```bash
# 清理临时文件
rm -rf /tmp/*

# 清理应用缓存（根据实际路径调整）
rm -rf /root/.hermes/cache/screenshots/*
rm -rf /root/.hermes/image_cache/*
```

### 5️⃣ 配置自动化维护

#### 创建 Docker 定期清理 Cron 任务

```python
# 使用 cronjob 工具创建
{
    "action": "create",
    "name": "Docker 定期清理",
    "schedule": "0 3 * * 0",  # 每周日凌晨 3 点
    "prompt": "执行 Docker 系统清理任务：\n1. 运行 docker system prune -a -f\n2. 运行 docker volume prune -f\n3. 输出清理结果"
}
```

#### 配置日志轮转

创建 `/etc/logrotate.d/custom-logs`：

```
/var/log/wsgidav.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
}

/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 nginx nginx
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}

/var/log/secure {
    weekly
    rotate 4
    compress
    delaycompress
    missingok
    notifempty
    create 0600 root root
}
```

**测试配置：**
```bash
logrotate -d /etc/logrotate.d/custom-logs  # 测试模式
logrotate -f /etc/logrotate.d/custom-logs  # 强制轮转
```

### 6️⃣ 验证清理效果

```bash
# 检查磁盘空间
df -h /

# 对比清理前后数据
# 清理前：46G (92%) → 清理后：39G (77%)
```

## 预期效果

| 清理项目 | 可回收空间 |
|----------|-----------|
| Docker 悬空镜像 | 200MB - 2GB |
| Docker Build Cache | 1GB - 5GB |
| Journal 日志 | 500MB - 2GB |
| 应用日志 | 100MB - 500MB |
| **合计** | **2GB - 10GB+** |

## 常见陷阱

1. **不要直接 `rm` 日志文件** - 使用 `truncate -s 0`，否则服务继续写入已删除文件句柄，空间不释放
2. **Docker prune 前确认** - 确保重要镜像有备份或可重新拉取
3. **保留关键日志** - `/var/log/secure` 等安全日志建议保留用于审计
4. **Journal 清理适度** - 保留 100M-500M 用于故障排查

## 后续建议

- 设置磁盘使用率监控告警（>85% 触发）
- 定期运行清理任务（每周或每月）
- 配置日志轮转防止无限增长
- 监控 Docker 镜像数量，定期清理

## 相关命令速查

```bash
# 查看 cron 任务
/cron list

# 手动运行清理任务
/cron run <job_id>

# 查看 Docker 空间
docker system df

# 查看日志占用
journalctl --disk-usage
du -sh /var/log/*
```
