# 08 · 数据存储与备份 ## 1. 数据都存在哪 ### 1.1 主配置 | 平台 | 路径 | |---|---| | Linux | `~/.live2D/live2d.conf.json` | | macOS | `~/.live2D/live2d.conf.json` | | Windows | `%USERPROFILE%\.live2D\live2d.conf.json` | > ⚠️ **注意 Linux 大小写**:是 `.live2D`(大写 D),不是 `.live2d`。代码写死。 文件大致结构(见 [03-首次启动配置.md §5](03-首次启动配置.md))。 ### 1.2 会话数据 存在 Tauri 提供的**系统 app-data 目录**: | 平台 | 路径 | |---|---| | Linux | `~/.local/share/com.ezviber.plus/sessions/` | | macOS | `~/Library/Application Support/com.ezviber.plus/sessions/` | | Windows | `%APPDATA%\com.ezviber.plus\sessions\` | 子目录结构: ``` sessions/ ├── _index.json ← 会话索引(标题/消息数/时间) ├── 2026-06-19_153500/ ← 会话 id = 创建时间戳 │ ├── chat.jsonl ← 消息流(一行一条 JSON) │ └── images/ │ ├── .png ← 截图原图(给 LLM 多模态) │ └── .jpg ← 截图压缩预览(给聊天气泡) ├── 2026-06-19_180200/ │ ├── chat.jsonl │ └── images/ └── __reminders__/ ← 提醒中心(特殊 id) ├── chat.jsonl └── images/ ← 一般为空 ``` ### 1.3 数据库 **`ezvibe_memory.db`**(SQLite,向量记忆) | 平台 | 路径 | |---|---| | 全部 | **`<工作目录>/ezvibe_memory.db`** ⚠️ | > ⚠️ **坑**:这个路径是相对当前工作目录的,**不是 app-data 目录**。如果你用 `cd /tmp && /opt/ezviber-plus/live2d` 启动,db 就会在 `/tmp/ezvibe_memory.db`。 > > 实际影响不大——RAG embedder 是 `DummyEmbedder`,数据库几乎是空的。 ### 1.4 模型缩放 / 位置 存在主配置的**每个 URL 下**(嵌套对象): ```jsonc { "https://...shizuku.model.json": { "position": { "x": 100, "y": 200 }, "scale": { "x": 1.0, "y": 1.0 } } } ``` ## 2. 数据迁移 搬家 / 换电脑 / 重装系统的标准流程: ```bash # 1. 旧机器:备份 tar -czf ezviber-backup.tgz \ ~/.live2D/ \ ~/.local/share/com.ezviber.plus/ # Linux # ~/Library/Application\ Support/com.ezviber.plus/ # macOS # %APPDATA%\com.ezviber.plus\ # Windows # 2. 同步到新机器 # 3. 新机器:解压到对应路径 tar -xzf ezviber-backup.tgz -C ~/ # 4. 装好 EzVibeR+ 之后启动一次 ``` > ⚠️ **聊天里的图片用相对路径**(`sessions/.../images/xxx.png`),所以**只要保证两台机器的 `app-data` 绝对路径一致**(如都在 `~/.local/share/com.ezviber.plus/`),图片就能正常显示。**改了用户名就坏**。 ## 3. 启动时 GC(自动清理) 每次启动会**异步**跑一次图片孤儿 GC: 1. 扫所有 `/sessions//images/*.png|jpg|jpeg` → 候选集合 A 2. 扫所有 session 的 `chat.jsonl` → 引用集合 R(只取 `imagePath` / `imagePngPath` 的文件名) 3. `A - R` = 孤儿 4. 删孤儿 + 打印日志 **保守策略**: - 单个 session 读 jsonl 失败 → 该 session 的所有图片**保留**(宁可漏删不误删) - 只动 `.png / .jpg / .jpeg`,其他扩展名不动 - GC 失败只 `warn`,不阻断启动 日志格式(终端看): ``` 启动 GC: 扫描 42 张,引用 35 张,删除 7 张孤儿,释放 1234567 字节 ``` ## 4. 删除某条消息 / 整个会话 - **整个会话**:聊天面板点 🗑 → 整个目录(含 jsonl 和 images)都删 - **单条消息**:当前**不支持** UI 操作 - **绕过 UI 直接删**(高级): - 删整个会话:删 `/sessions//` 目录 + 手动编辑 `_index.json` 移除该条目 - 删某条消息:用文本编辑器打开 `chat.jsonl`,删对应行(保持一行一条 JSON 的格式) - 改完**重启**软件让索引重读 ## 5. 备份建议 | 频率 | 备份什么 | 工具 | |---|---|---| | 每周 | `~/.live2D/live2d.conf.json` | 任何同步盘 | | 每次重要对话后 | 导出会话(`⬇ MD` 或 `⬇ JSON`) | 内置导出 | | 每月 | 整个 `app-data` 目录 | 任何备份工具 | | 跨机器 | 同上 + 复制 `model_dir` | rsync / 同步盘 | > 💡 **最稳的备份**是定期用「⬇ MD / ⬇ JSON」导出关键会话,文件名自带时间戳和会话标题,永久可读。 ## 6. 隐私 & 安全 - 所有数据**只在本地**——不传给任何第三方 - LLM 调用按你配的 provider 走(你用哪家就是哪家,**没中间商**) - `live2d.conf.json` 里的 `llm_api_key` 是**明文**存盘的,注意文件权限 - Linux/macOS:`chmod 600 ~/.live2D/live2d.conf.json` - 截图保存在 `app-data/sessions//images/`,**全屏内容都包括**——如果你截了敏感页面,记得手动删 ## 7. 完全卸载 ```bash # Linux rm -rf ~/.live2D/ rm -rf ~/.local/share/com.ezviber.plus/ # macOS rm -rf ~/.live2D/ rm -rf ~/Library/Application\ Support/com.ezviber.plus/ rm -rf /Applications/EzVibeR+.app # 图形界面拖废纸篓也行 # Windows (PowerShell) Remove-Item -Recurse -Force "$env:USERPROFILE\.live2D" Remove-Item -Recurse -Force "$env:APPDATA\com.ezviber.plus" ``` --- 下一步:[09-常见问题FAQ.md](09-常见问题FAQ.md)。