- 分區:系統/資料/可選外接冷儲分卷;寫死掛載點與重啟後順序。
- 分層:
hot(NVMe/快速 APFS)放近期模型與高頻暫存;warm放完整權重;ephemeral僅供清理腳本刪除。 - 鏈結:以
ln -s將預設快取路徑指到分層根,並用環境變數雙保險(互動 shell 與 plist 一致)。 - 時間窗:每日 1–2 個離峰時段跑清理;拉取高峰前後禁止全目錄
rm -rf。 - 告警:磁碟使用率、inode、單一目錄體積三軸;超閾值先只讀或降併發。
前置條件與環境分區
在開始 symlink 之前,先決定「誰擁有目錄」與「哪塊磁碟承載寫入峰值」。建議為 OpenClaw 使用專用系統使用者或至少專用家目錄子樹,避免與個人帳號的 Xcode Derived Data、Docker 鏡像混在同一 APFS 容器而難以配額。
磁碟:用 diskutil apfs list 確認容器與卷;外接碟請在「能源」設定中避免睡眠中斷寫入,並用 /etc/fstab 或登入項確保掛載順序(實務上常改用固定掛載點如 /Volumes/mp-fast)。
權限:快取根目錄 chown 給執行使用者,目錄 750/敏感設定 700;CI 若以 ssh 非登入 shell 執行,確認 ~/.zshenv/plist 是否載入相同變數。
與閘道一致:若模型拉取由本機 gateway 觸發,請與閘道 LaunchAgent使用同一使用者與 WorkingDirectory,否則會出現「互動式拉取有快取、守護拉取又下一份」。
# 範例:建立分層根(路徑請替換為你的快速卷)
sudo mkdir -p /Volumes/mp-fast/oc-cache/{hot,warm,ephemeral,logs}
sudo chown -R "$(whoami):staff" /Volumes/mp-fast/oc-cache
chmod -R u+rwX /Volumes/mp-fast/oc-cache
快取路徑與分層方案
分層的本質是把「讀多寫少」與「可丟棄」拆目錄,讓清理腳本只掃 ephemeral,避免誤刪權重本體。實際環境變數名稱請以你所用的推理後端為準(例如常見的 HF_HOME、TRANSFORMERS_CACHE、GGML_CACHE 等);OpenClaw 外掛若另有設定檔,應與下列路徑對齊。
| 決策維度 | 方案 A:單卷單樹 | 方案 B:symlink 分層(推薦) | 方案 C:僅環境變數 |
|---|---|---|---|
| 磁碟類型 | 全系統共用一 APFS 卷 | 熱資料在快速卷、冷資料可外接 | 依變數指向任意掛載點 |
| 可複現性 | 高(路徑簡單) | 高(Runbook 記鏈結與掛載) | 中(易漏 plist/CI) |
| 清理風險 | 易誤刪混放目錄 | 低(ephemeral 獨立) | 中(需嚴格命名規範) |
| 適用場景 | 單人輕量試用 | 遠端 Mac/長期線上 | 容器化或路徑已由編排注入 |
下列為示意鏈結:請先備份原有目錄,若已存在非空目錄應 mv 到 warm 再建鏈結。
# 示意:將使用者快取鏈到分層 hot(請依實際工具鏈調整目錄名) mkdir -p ~/.cache mv ~/.cache/huggingface /Volumes/mp-fast/oc-cache/warm/huggingface.bak 2>/dev/null || true ln -s /Volumes/mp-fast/oc-cache/hot/huggingface ~/.cache/huggingface
建議在 Runbook 用表格列出「工具/預設路徑/實際解析路徑/負責人」,每季稽核一次 symlink 是否斷鏈(find -xtype l)。
定時清理與日誌輪轉
遠端節點 7×24 運行時,清理策略必須可預測:固定時間窗、固定刪除範圍、固定退出碼供監控告警。macOS 上優先使用使用者 LaunchAgent(與 gateway 同一 gui uid),需要 root 級任務再考慮 LaunchDaemon。
時間窗示例:每日 04:10 與週日 03:30(本地時區);避開你觀察到的預設 CI 高峰。可用 StartCalendarInterval 多組字典實現。
清理內容:ephemeral/*、超過 N 天的暫存、以及 logs/*.log 超過大小閾值時 truncate 或 gzip 輪轉(保留索引檔名便於 log show 對照)。
互斥:腳本開頭 flock -n 鎖檔,偵測到 OpenClaw/拉取行程持有鎖時直接退出 0 並寫 audit 行,避免半寫入檔案。
#!/usr/bin/env bash
set -euo pipefail
exec 200>"${TMPDIR:-/tmp}/oc-cache-clean.lock"
flock -n 200 || exit 0
find /Volumes/mp-fast/oc-cache/ephemeral -type f -mtime +3 -delete
find /Volumes/mp-fast/oc-cache/logs -name '*.log' -size +200M -print0 | xargs -0 truncate -s 0
將 StandardOutPath/StandardErrorPath 指到 oc-cache/logs,並在巡檢腳本中對清理任務的退出碼做非 0 告警。
配額與磁碟水位閾值
企業卷常見「容量還剩 20%,但 inode 或單目錄小檔已爆」。建議同時監控:卷使用率、inode 使用率、oc-cache 根下 du。閾值可從保守值起步,再按實測調整。
| 指標 | 建議黃燈 | 建議紅燈 | 自動動作示例 |
|---|---|---|---|
| 卷使用率(df -h) | ≥ 78% | ≥ 88% | 黃:通知+降拉取併發;紅:觸發只讀保護或暫停非關鍵任務 |
| inode(df -i) | ≥ 80% | ≥ 92% | 清理索引/暫存小檔;必要時遷移子樹 |
| 單一目錄(du -sh) | > 配額 soft | > 配額 hard | soft:刪 ephemeral;hard:LRU 僅限標記子樹 |
# 簡易水位檢查(可掛在巡檢 LaunchAgent)
df -h / | awk 'NR==2 {gsub(/%/,"",$5); exit ($5+0>85)}'
df -i / | awk 'NR==2 {gsub(/%/,"",$5); exit ($5+0>90)}'
配額腳本可用 du -sk 週期寫入 Prometheus node_exporter textfile、或發 webhook;重點是與清理窗口聯動,避免告警後無人執行刪除。
失敗重試與排錯
| 現象 | 高概率原因 | 可複現處置 |
|---|---|---|
拉取寫入 ENOSPC | 系統卷滿、或快取未指到資料卷 | df -h/readlink 驗證鏈結;將 warm 遷到大卷後更新鏈結 |
ENOENT 或斷鏈 | 外接碟未掛載、路徑變更 | 登入項/diskutil mount 修復;Runbook 增加掛載自檢 |
| 守護與互動快取不一致 | plist 未注入變數 | launchctl print gui/$UID/label 比對 EnvironmentVariables |
| 清理後模型損壞 | 刪到未完成下載目錄 | 清理腳本排除 *.partial;拉取加校驗與冪等重試(見站內失敗重試) |
若與 CI 並行,請一併參考構建資源池與磁碟 FAQ,把「拉取/編譯/清理」拆隊列,降低同時滿載機率。
上線驗收清單
- 路徑:
readlink -f ~/.cache/…與推理行程lsof顯示路徑一致。 - 環境:互動 shell、SSH 非登入、LaunchAgent 三處
printenv抽樣一致。 - 清理:乾跑(
echo取代刪除)與實跑各一次,日誌有開始/結束/刪除筆數。 - 水位:人為填滿測試卷至黃燈閾值,告警與降載策略按預期觸發。
- 恢復:斷電或卸載外接碟後重啟,Runbook 步驟可在 15 分鐘內恢復服務。
小結與購買引導
總結:在遠端 Mac上讓 OpenClaw 與大模型模型快取長期穩定,關鍵不是「更大的單一目錄」,而是分層儲存+可預測的清理策略+自動化水位與配額。把 hot/warm/ephemeral 拆清楚、用 symlink 與環境變數鎖定解析路徑,再用 LaunchAgent 落在離峰時間窗,就能把故障收斂成可重試事件,而不是半夜磁碟打滿的緊急搶修。
若你需要可掛載高速資料卷、長期線上且網路穩定的 Apple Silicon 遠端 Mac來承載上述 Runbook,歡迎先瀏覽首頁了解場景,至定價比對方案,並在購買頁(免登入)選擇套餐;連線與部署細節請見說明中心。想延伸閱讀 OpenClaw 與 CI 主題,請回到技術部落格瀏覽系列文章。