# 系统盘快速清理指南

> 生成日期：2026-04-29
> 适用机器：Hermes Agent 运行主机
> 系统盘：30G（已用 93%，仅剩 2.1G）
> 数据盘：60G（已用 1%，几乎全空）

---

## 一、存储状况摘要

| 占用源 | 当前大小 | 可释放 | 优先级 |
|--------|---------|--------|--------|
| Docker 未使用镜像层 | 6.84 GB | **6.7 GB** | ⭐⭐⭐ |
| `/home/bernard/.cache` | 3.3 GB | 1.4 GB（可选） | ⭐⭐ |
| `/var/cache/apt` | 360 MB | **360 MB** | ⭐⭐⭐ |
| `/var/log/journal` | 476 MB | **400 MB** | ⭐⭐⭐ |
| `/tmp`（camoufox 残留） | 680 MB | **680 MB** | ⭐⭐ |
| `~/.npm/_cacache` | 501 MB | **500 MB** | ⭐⭐ |
| 合计可释放 | — | **≈9.5 GB** | ⭐⭐⭐ |

---

## 二、执行前环境自检

开始清理前，先记录当前状态以便对比效果：

```bash
# 查看磁盘整体使用
df -h

# 查看根目录下主要目录的占用（排除挂载点和虚拟文件系统）
sudo du -sh /* 2>/dev/null | grep -v -E 'proc|sys|dev|run|data' | sort -rh | head -20

# 查看 Docker 镜像占用的可回收空间
docker system df
```

---

## 三、快速清理步骤

步骤之间彼此独立，可按任意顺序执行。

### 步骤 1：清理 Docker 未使用的镜像层

```bash
# 先查看所有镜像，确认是否有需要保留的
docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedSince}}'

# 执行清理（仅删除未被任何容器引用的镜像层，需确认）
docker image prune -a

# 若要跳过交互确认（自动化场景）
docker image prune -af

# 确认清理结果
docker system df
```

**预期释放：** ~6.7 GB
**影响：** 运行中的 10 个容器不受影响。已停止的容器如果还在磁盘上（`docker ps -a` 可见），其引用的镜像也不会被删除。
**注意：** 如果存在暂时停止、但计划稍后快速拉起的容器，其关联镜像也会被清理。执行前请查看 `docker images` 确认。
**后续影响：** 以后若需要启动已删除的镜像，需重新 pull，首次拉取略慢。

### 步骤 2：清理 apt 包缓存

```bash
# 清理已下载的 .deb 包缓存
sudo apt clean

# 清理已不再需要的旧版本包缓存
sudo apt autoclean

# 查看缓存目录大小变化
du -sh /var/cache/apt
```

**预期释放：** ~360 MB
**影响：** 无。apt 缓存仅为加速重新安装，删后依然能正常安装包。

### 步骤 3：限制 systemd 日志保留时间

> ⚠️ 使用 drop-in 配置方式修改，不直接覆盖原文件，避免丢失已有配置。

```bash
# 先备份现有配置（安全兜底）
sudo cp /etc/systemd/journald.conf /etc/systemd/journald.conf.bak

# 查看当前日志占用
journalctl --disk-usage

# 立即清理：仅保留最近 7 天的日志（可选：先导出备份）
sudo journalctl --vacuum-time=7d

# 创建 drop-in 配置目录（如果不存在）
sudo mkdir -p /etc/systemd/journald.conf.d

# 写入容量限制配置——不覆盖原文件，仅补充此规则
cat << 'EOF' | sudo tee /etc/systemd/journald.conf.d/limit-size.conf
[Journal]
SystemMaxUse=200M
ForwardToSyslog=no
EOF

# 重启 journald 服务使配置生效
sudo systemctl restart systemd-journald

# 确认限制生效
journalctl --disk-usage
```

**预期释放：** ~400 MB（后续可维持在 200M 以下）
**影响：** 7 天前的日志会被永久删除。如果需要回溯旧日志，建议先备份：

```bash
sudo journalctl --since "2026-01-01" --until "2026-04-22" > /tmp/journal-backup.log
```

### 步骤 4：清理 /tmp 临时文件

```bash
# 查看 /tmp 中内容
du -sh /tmp/* | sort -rh | head -10

# 清理一天前的 camoufox 运行时文件（而非全部删除，更安全）
find /tmp/camoufox-* -atime +1 -exec rm -rf {} + 2>/dev/null

# 清理其他编译/运行时临时文件
rm -rf /tmp/node-compile-cache /tmp/jiti

# 注意：不要删除 /tmp 中正在被使用的 socket/pid 文件
```

**预期释放：** ~680 MB
**影响：** 安全。camoufox、node-compile-cache、jiti 都是编译/运行时的临时产物，会在下次使用时重新生成。

### 步骤 5：清理 npm 缓存

```bash
# 先验证 npm 缓存完整性（可选）
npm cache verify

# 清理 npm 全局缓存
rm -rf ~/.npm/_cacache

# 清理 npx 缓存
rm -rf ~/.npm/_npx
```

**预期释放：** ~500 MB（_cacache）
**影响：** npm install 速度略有下降（需重新下载缓存），不影响已安装的包。

### 步骤 6：（可选）清理 Homebrew 缓存

```bash
# 查看 Homebrew 缓存占用
du -sh ~/.cache/Homebrew

# 清理过期的 Homebrew 缓存
brew cleanup
```

**预期释放：** ~391 MB
**影响：** 仅删除旧版本的 .tar.gz 缓存，不影响已安装的 formula。

---

## 四、清理效果预估

| 步骤 | 操作 | 预估释放 | 耗时 |
|------|------|---------|------|
| 1 | `docker image prune -a` | 6.7 GB | 10-30s |
| 2 | `apt clean && apt autoclean` | 360 MB | 5s |
| 3 | `journalctl --vacuum-time=7d` + drop-in 配置 | 400 MB | 10-30s |
| 4 | `rm -rf /tmp/camoufox-*` | 680 MB | 2s |
| 5 | `rm -rf ~/.npm/_cacache` | 500 MB | 2s |
| 6 | `brew cleanup`（可选） | 391 MB | 10-60s |
| **合计** | | **≈9.5 GB** | **约 1-2 分钟** |

清理后系统盘使用率从 **93%（2.1G 剩余）** 降至约 **60%（约 11.6G 剩余）**，恢复到健康水平。

---

## 五、后续迁移方案（将持久数据迁至 `/data`）

完成快速清理后，建议将以下持久性数据迁移到 `/data` 数据盘，防止缓存再次填满系统盘。

### 前置检查

```bash
# 确认数据盘已挂载
df -h /data

# 确认有写入权限
touch /data/.write-test && rm /data/.write-test && echo "OK"
```

### 5.1 Docker data-root 迁移（最优先）

Docker 镜像和卷会随使用重新增长。将 Docker 数据目录迁移到 `/data` 是最持久的解决方案。

**详细完整的迁移指南请参阅：[Docker数据盘迁移指南.md](Docker数据盘迁移指南.md)**

该指南已由 GPT-5.5 专项编写并通过审计，包含：
- 前置检查（确认 data-root、daemon.json 内容、/data 空间）
- 使用 `rsync -aHAXS --numeric-ids` 保留 overlay2 元数据
- 使用 `jq` 合并 daemon.json，不覆盖已有配置
- 旧数据重命名备份而非直接删除
- 7-14 天观察期建议
- 完整的回滚方案

### 5.2 用户缓存迁移

```bash
# 停止可能使用缓存的进程后执行

# 迁移 ~/.cache
mv ~/.cache /data/cache
ln -s /data/cache ~/.cache

# 迁移 ~/.npm-global
mv ~/.npm-global /data/npm-global
ln -s /data/npm-global ~/.npm-global
```

### 5.3 Homebrew 迁移

```bash
# 停止 Homebrew 相关进程后执行

sudo mv /home/linuxbrew /data/linuxbrew
sudo ln -s /data/linuxbrew /home/linuxbrew
```

### 5.4 Hermes 会话数据迁移（可选）

```bash
# 停止 Hermes Gateway 后执行

# 迁移会话数据库和会话记录
mv ~/.hermes/sessions /data/hermes/sessions
ln -s /data/hermes/sessions ~/.hermes/sessions

mv ~/.hermes/state.db /data/hermes/state.db
ln -s /data/hermes/state.db ~/.hermes/state.db
```

---

## 六、危险操作清单（不要做）

| 操作 | 原因 |
|------|------|
| `docker system prune -a --volumes` | 会删除所有存储卷（volume），导致数据库数据丢失 |
| `rm -rf ~/.hermes` | 删除 Hermes Agent 的认证/配置/会话数据 |
| `rm -rf /var/lib/docker/volumes` | 删除所有容器持久化数据（PostgreSQL、Redis 等） |
| `rm -rf /opt/1panel` | 删除 1Panel 面板及其配置 |
| 迁移操作前未先停止对应服务 | 可能导致数据损坏或进程崩溃 |
