1. 为什么 Hermes Agent 迁移到外部硬盘会踩 venv 路径的坑
Hermes Agent 是一个把程序本体和用户数据都塞进~/.hermes/的本地智能体工具,它自带 Python 虚拟环境、Node 依赖、会话历史、跨会话记忆和技能库。默认安装后,这个目录会随着你聊天、跑任务、装技能持续膨胀,我见过从 1GB 涨到十几 GB 的情况。对于内置 SSD 只有 256GB 或 512GB 的机器来说,系统盘被吃掉一大块空间是很现实的问题,尤其是 macOS 用户,系统盘写满之后连系统更新都做不了。
把 Hermes Agent 迁移到外部硬盘,核心要解决的不是「复制文件」这么简单,而是venv 里硬编码的绝对路径。Python 虚拟环境在创建时,bin/下的可执行脚本 shebang 会写死成类似#!/Users/你的用户名/.hermes/hermes-agent/venv/bin/python3这样的路径。你如果只是把目录挪走、再用HERMES_HOME环境变量指过去,venv 内部的路径全部断裂,hermes命令直接跑不起来。这就是很多人迁移失败的根本原因。
所以正确思路是:数据物理上搬到外部硬盘,但逻辑上仍然让系统认为它在~/.hermes/。实现这个效果最稳的手段就是符号链接(symlink)。符号链接让所有硬编码路径透明解析到外部硬盘,venv 感知不到任何变化,hermes命令照常工作。这篇教程会给出可复制的目录结构、ln -s命令、HERMES_HOME的正确用法与禁用场景,以及迁移后的启动自检和回滚验证动作,适合想把 Hermes Agent 从系统盘迁到外部硬盘、又不想重装环境的用户。
需要提前说明的是,外部硬盘的文件系统必须是 APFS 或 Mac OS Extended (HFS+),因为符号链接和 Unix 权限在 NTFS/exFAT 上支持不完整,跨平台盘符挂载后经常出现权限丢失、链接失效的问题。这一点在动手前就要确认,否则后面会白折腾。
2. 迁移前的前置检查与 TaoToken 配置备份
在动任何文件之前,先把 Hermes Agent 彻底停下来,并且确认外部硬盘状态。这一步看起来啰嗦,但跳过它导致state.db损坏的案例非常多。Hermes 运行时会持续写会话和记忆数据库,迁移过程中如果有进程还在读写,数据库文件很容易写坏,恢复起来很麻烦。
先检查进程:
ps aux | grep -i hermes | grep -v grep如果有输出,说明 Hermes 还在跑,用官方命令停:
hermes stop停不掉就强制终止:
pkill -f hermes然后确认外部硬盘挂载情况和文件系统类型:
ls /Volumes/ diskutil info /Volumes/你的硬盘名 | grep "File System" df -h /Volumes/你的硬盘名File System那一行必须显示 APFS 或 HFS+。如果是 exFAT 或 NTFS,先备份数据再重新格式化为 APFS,否则符号链接会失效。
接下来是很多人忽略的一步:备份你的 API 配置。Hermes Agent 的~/.hermes/auth.json里存着模型服务的密钥,config.yaml里存着 Base URL 和默认模型。如果你用的是 TaoToken 这类聚合接入服务,配置通常长这样:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的密钥", "model": "claude-sonnet-4-5" }迁移前把auth.json和config.yaml单独复制一份到安全位置,比如~/Desktop/hermes-backup/。这样即使迁移过程中出问题,你也能快速恢复接入配置,不用重新去控制台生成密钥。TaoToken 的密钥可以在控制台的 API Keys 页面管理,接入文档里有完整的 Base URL 和模型 ID 对照表,迁移后如果发现模型调用报 401,多半是auth.json没跟着搬过去或者权限变了。
确认外部硬盘可用空间足够。当前 Hermes 本体大约 1GB,但sessions/、memories/、audio_cache/、image_cache/会持续增长,建议预留至少 20GB。用df -h看一眼可用空间,别等到搬到一半空间不够。
最后记录一下当前版本,方便迁移后对比:
hermes --version把版本号记下来,比如v0.10.0,迁移完成后要确认版本一致,说明环境没被破坏。
3. 可复制的迁移配置:mv 搬数据 + ln -s 建符号链接
这一步是整篇教程的核心。先给出目标目录结构,让你心里有数:
~/.hermes/ → 符号链接到 /Volumes/你的硬盘名/.hermes ├── hermes-agent/ (程序本体 ~1 GB) │ ├── venv/ (Python 虚拟环境, ~538 MB) │ ├── ui-tui/ (TUI 界面, ~191 MB) │ ├── node_modules/ (Node.js 依赖, ~146 MB) │ ├── skills/ (内置技能) │ └── agent/ (核心代理逻辑) ├── skills/ (自定义/学习到的技能, 会增长) ├── sessions/ (会话历史, 会增长) ├── memories/ (跨会话记忆, 会增长) ├── audio_cache/ (语音缓存, 会增长) ├── image_cache/ (图片缓存, 会增长) ├── config.yaml (配置文件) ├── SOUL.md (Agent 人格定义) ├── auth.json (API 密钥) └── state.db (状态数据库)搬数据用mv:
mv ~/.hermes /Volumes/你的硬盘名/.hermes为什么用mv而不是cp?在同一文件系统上mv只改指针,瞬间完成;跨文件系统时它等价于cp + rm,但语义更简洁,也不会留下两份数据占空间。注意目标目录名以.开头,Finder 默认隐藏,按Cmd + Shift + .可以切换显示。
然后创建符号链接:
ln -s /Volumes/你的硬盘名/.hermes ~/.hermes验证链接是否正确:
ls -la ~/.hermes期望输出类似:
lrwxr-xr-x 1 cc staff 38 Apr 22 10:30 /Users/cc/.hermes -> /Volumes/WDBlueSN5000/.hermes看到箭头指向外部硬盘就对了。
关于 HERMES_HOME 环境变量,这里必须说清楚:不要用它来替代符号链接。Hermes 的 venv 里所有脚本 shebang 硬编码了#!/Users/你的用户名/.hermes/hermes-agent/venv/bin/python3。如果你设置export HERMES_HOME="/Volumes/你的硬盘名/.hermes"并直接mv目录,venv 内部路径全部断裂,hermes命令会报No such file or directory或者 Python 解释器找不到。符号链接让系统「以为」数据还在~/.hermes/,所有硬编码路径都能正常解析,这才是正确方案。
那HERMES_HOME什么时候有用?当你需要临时切换到一个完全独立的 Hermes 实例做测试时,可以配合符号链接一起用,但日常迁移场景下,符号链接是唯一稳妥的选择。如果你确实想用环境变量,正确做法是保留~/.hermes符号链接,同时不设置HERMES_HOME,让默认路径生效。
如果你对外部硬盘上的目录名不满意,比如想从hermes-data改成.hermes,流程是:停 Hermes → 删旧链接 →mv重命名 → 重建链接:
hermes stop 2>/dev/null && pkill -f hermes 2>/dev/null rm ~/.hermes mv /Volumes/你的硬盘名/旧目录名 /Volumes/你的硬盘名/新目录名 ln -s /Volumes/你的硬盘名/新目录名 ~/.hermes ls -la ~/.hermes hermes --version4. 迁移后启动自检与成功结果验证
符号链接建好之后,先别急着跑复杂任务,按顺序做几项自检,确认环境完整。
第一项,确认hermes命令可用:
hermes --version期望输出v0.10.0或你迁移前记录的版本号。如果报command not found,说明 PATH 里的hermes入口指向了旧路径,检查which hermes,通常它是个软链到~/.hermes/hermes-agent/venv/bin/hermes,符号链接生效后应该能正常解析。
第二项,确认配置文件可读:
cat ~/.hermes/config.yaml能正常打印内容说明符号链接和权限都没问题。如果报Permission denied,检查外部硬盘挂载时是否带了noowners选项,APFS 默认不会,但某些第三方挂载工具会。
第三项,确认 venv 内部路径解析正常:
~/.hermes/hermes-agent/venv/bin/python3 --version这条命令直接调用 venv 里的 Python,能打印版本号说明 shebang 硬编码路径通过符号链接透明解析成功。这是判断迁移是否真正成功的关键指标。
第四项,跑一次模型调用验证接入配置。如果你用 TaoToken 接入,可以先用模型对话页面确认密钥和模型 ID 有效,再在 Hermes 里发一条测试消息:
hermes "你好,测试一下迁移后的环境"如果返回正常回复,说明auth.json里的 Base URL、API Key、Model ID 三件套都正确加载了。TaoToken 的 Base URL 是https://taotoken.net/api,模型 ID 要和你config.yaml里写的一致,比如claude-sonnet-4-5。如果报 401,去控制台的 API Keys 页面确认密钥没过期;如果报模型不存在,对照接入文档里的模型 ID 列表检查拼写。
第五项,确认数据目录可写:
touch ~/.hermes/.write_test && rm ~/.hermes/.write_test能创建和删除文件说明写权限正常,Hermes 后续写会话和记忆不会失败。
五项都通过,迁移就算成功了。我实测下来,整个流程从停止 Hermes 到验证完成大约 5 分钟,其中大部分时间花在mv跨文件系统复制上,1GB 数据在 USB 3.0 硬盘上大概 30 秒。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
迁移过程中和迁移后,最容易碰到几类报错,这里逐个对照排查。
报错一:401 Unauthorized或invalid api key
这是接入配置没跟着迁移导致的。检查~/.hermes/auth.json是否存在且内容完整:
cat ~/.hermes/auth.json如果文件为空或不存在,从你迁移前的备份里恢复。如果你用 TaoToken,去控制台的 API Keys 页面重新生成一个密钥,然后更新auth.json:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-新密钥", "model": "claude-sonnet-4-5" }注意 Base URL 不要带末尾斜杠,模型 ID 要和接入文档一致。
报错二:local proxy failed或connection refused
这个报错通常和网络代理配置有关。Hermes 如果配置了本地代理端口,迁移后代理进程可能没起来。检查config.yaml里是否有proxy相关字段,如果有,确认代理服务在运行。如果你没有主动配置代理,把config.yaml里的 proxy 字段注释掉再试。另外确认外部硬盘挂载后路径没变,符号链接指向正确。
报错三:reading choices或KeyError: 'choices'
这是模型返回格式不符合预期导致的,常见于 Base URL 配错或者模型 ID 写成了不支持的名称。检查config.yaml里的base_url是否是https://taotoken.net/api,模型 ID 是否在支持列表里。如果用的是 OpenAI 兼容格式,确认请求路径拼接正确。这个报错和迁移本身无关,但迁移后重新配置时容易写错。
报错四:OAuth相关报错或token expired
如果你用 OAuth 方式登录某些模型服务,迁移后 token 缓存路径变了会导致认证失败。检查~/.hermes/下是否有.oauth或credentials目录,确认它们跟着搬到了外部硬盘。如果 token 过期,重新走一次 OAuth 授权流程即可。注意 OAuth 回调地址可能绑定localhost,确保本地端口没被占用。
报错五:hermes: command not found
符号链接建好了但 PATH 没生效。检查which hermes,如果为空,说明 shell 的 PATH 里没有~/.hermes/hermes-agent/venv/bin。在~/.zshrc或~/.bashrc里加上:
export PATH="$HOME/.hermes/hermes-agent/venv/bin:$PATH"然后source ~/.zshrc重新加载。
报错六:外部硬盘推出后 Hermes 崩溃
这是没先停 Hermes 就拔盘导致的。正确流程是:
hermes stop 2>/dev/null pkill -f hermes 2>/dev/null lsof +D /Volumes/你的硬盘名/.hermes 2>/dev/null diskutil eject /Volumes/你的硬盘名lsof有输出说明还有进程占用,逐一 kill 掉再推出。重新插入硬盘后符号链接自动生效,直接运行hermes即可。
6. 回滚方案与长期使用建议
迁移不是单向操作,如果你后来想把数据迁回内置硬盘,或者换一块外部硬盘,回滚流程要清楚。
回滚到内置硬盘:
hermes stop 2>/dev/null && pkill -f hermes 2>/dev/null rm ~/.hermes mv /Volumes/你的硬盘名/.hermes ~/.hermes hermes --version注意rm ~/.hermes删的是符号链接本身,不会删外部硬盘上的数据,所以这一步是安全的。mv把数据搬回原位后,~/.hermes重新变成真实目录,venv 路径自然生效。
换外部硬盘时,先把新盘格式化为 APFS,挂载后把旧盘数据rsync过去:
rsync -aH --info=progress2 /Volumes/旧盘/.hermes/ /Volumes/新盘/.hermes/-aH保留权限和硬链接,--info=progress2显示总进度。复制完成后对比文件数量:
find /Volumes/旧盘/.hermes -type f | wc -l find /Volumes/新盘/.hermes -type f | wc -l数量一致再删旧链接、建新链接。
长期使用有几点建议。第一,外部硬盘尽量用 SSD,机械盘跑 venv 和数据库会有明显延迟。第二,养成「先停 Hermes 再拔盘」的习惯,state.db损坏恢复成本很高。第三,定期备份auth.json和config.yaml,这两个文件很小但最关键,丢了要重新配置接入。第四,如果你经常在不同机器间切换,可以把 Hermes 数据放在 TaoToken 的 Coding Plan 配合的云端工作区里做同步,但本地符号链接方案仍然是性能最好的选择。
最后提醒一句,符号链接方案对 Hermes 这种自带 venv 的工具是通用解法,其他类似结构的 Agent 工具迁移时也可以参考这个思路:先停进程,再mv数据,最后ln -s建链接,不要用环境变量硬指路径。