リモート Mac APFS 磁盘水位线与 SFTP rsync アップロード失败治理示意

2026 年リモート Mac ディスク満杯による SFTP/rsync アップロード失敗:APFS 水位線・成果物 LRU・CI Job ゲート決定マトリクス

リモート Mac で No space left on device 时,SFTP/rsync 往往在中途断开,而 ssh 登录仍可能正常。本文把 APFS 真满盘、inode、配额与中间设备 reset 分层归因,并给出 20%/12%/10% 水位线、成果物 LRU 与アップロード前 df 探测,并联原子リリース、link-dest、SHA256 闸门与並列 SFTP 関連稿。

当租赁或自建リモート Mac 同时承载 Xcode 编译、成果物アップロード与 link-dest 快照时,空间压力很少来自单一目次。更常见的是 APFS 容器、purgeable 字节与多路 SFTP 並列叠加。建议阅读顺序对齐 原子リリースlink-destSHA256 闸门並列 SFTPDerivedData 関連稿。

2026 生产里为何「ディスク満杯」会让 SFTP/rsync アップロード像网络故障

痛点一:把 df 的 Available 当成「还能传」。APFS 的 purgeable 与本地快照会让可用空间在压力下骤降;アップロード前应同时看容器空闲百分比与 tmutil listlocalsnapshots,而不是只看 Finder 圆饼图。

痛点二:满盘时仍 in-place rsync 覆盖 release。半写入的 bundle 会破坏 原子リリース 假设;应先停新 Job、清可再生目次,再对 staging 做 dry-run。

痛点三:link-dest 保留 N 过大。硬链接快照省空间但代数叠加仍可能吃满 NVMe;满盘治理应先降 N,再动 DerivedData,避免删除当前 staging 指向的一代。

痛点四:並列 SFTP 与编译抢同一卷。多路大文件アップロード会放大元数据 IO;应联读 並列 SFTPDerivedData 的降载规则。

痛点五:把 ENOSPC 与 Operation not permitted 混为一谈。后者可能是 TCC/SIP 或只读挂载;用 errno 与 unified log 对照,避免误删业务树。

痛点六:无 SHA256 闸门就强行重试アップロード。ディスク満杯后的部分文件可能已损坏;恢复顺序应为:释放空间 → dry-run → 整合性検証 → 再切可见性。

ディスク満杯盘治理決定マトリクス:水位线、LRU 与 CI 闸门

矩阵原则:先判层(真满盘 / inode / 配额),再按空闲百分比选动作;禁止在 <12% 时启动全量 mirror 或多路大文件並列。

水位线CI / アップロード动作风险下一跳
≥20% 空闲正常アップロード/编译常规 rsync + SHA256
12–20%仅增量、禁全量 mirror降並列 SFTP
<12%停新 Job(exit 75)LRU + 扩卷/外迁
inode>90%停 --delete清小文件集群

How-to:七步完成 APFS 水位探测、成果物 LRU 与アップロード恢复

在扩卷/外迁前,先完成 SHA256 清单 快照与 原子リリース 工单字段,避免满盘清理删掉仍被 rollback 指针引用的目次。

# APFS disk watermark — pre-upload probe (remote Mac)
df -H / /System/Volumes/Data 2>/dev/null
diskutil info / | rg -i 'Volume Free Space|Container Free Space|APFS'
tmutil listlocalsnapshots / 2>/dev/null | head
du -sh ~/Library/Developer/Xcode/DerivedData/* 2>/dev/null | sort -hr | head -5
FREE_PCT=$(df -g / | awk 'NR==2{print int($4*100/($3+$4))}')
[ "$FREE_PCT" -lt 12 ] && echo "DEFER_CI_UPLOAD" && exit 75
rsync -a --info=stats2 --dry-run ./artifact/ user@remote:/var/staging/incoming/ || true
  1. 冻结变更:记录 df、容器 UUID、当前 link-dest 代数与正在跑的 CI Job 清单。
  2. 判层:区分真满盘、inode 耗尽、配额与中间设备 reset。
  3. 执行水位线:空闲 ≥20% 正常;12–20% 只允许增量;<12% 停新アップロード(exit 75)。
  4. LRU 清理:DerivedData → 旧 releases → 降 link-dest N → 本地快照(可再生的优先)。
  5. アップロード前探测:df + rsync dry-run;並列度按水位自动下调。
  6. 恢复传输:先 staging,再 SHA256,最后原子 swap。
  7. 验收:写入工单「释放空间 GB、删除类别、是否影响回滚」并设定下周 Top10 报表。

参照データ:APFS 空闲比例与清理边界

下表为规划用中位数,请在自家リモート Mac 实测后写入 SLO。

指标常见观测建议动作関連稿
DerivedData 单机80–220 GB周期 LRU関連稿
link-dest 保留 5 代1.2–3.5× 单次全量满盘先降 N関連稿
並列 SFTP 4 路元数据 IO +40%<12% 改 2 路関連稿
本地 TM 快照10–80 GBtmutil thin与 release 分账

建议阅读顺序:link-dest 缩面 → 本文水位/LRU → SHA256原子リリース swap → 並列 SFTP 降载。

FAQ

问:アップロード中途断开一定是ディスク満杯吗?答:不一定。需先区分 ENOSPC、配额、inode 与中间设备 reset;ディスク満杯时 ssh 往往仍可登录但写入失败。

问:满盘时能否继续 in-place rsync?答:不建议。应先停新 Job、清可再生成果物或扩卷,再按 原子リリースSHA256 闸门 顺序恢复。

问:link-dest 快照占多少空间?答:取决于保留代数与增量比例;满盘时应先降 N、再清 DerivedData,避免删当前 staging。

まとめ与 SFTPMAC リモート Mac 收束

本文价值在于把「ディスク満杯」从模糊的 rsync 失败,拆成 APFS 水位、成果物 LRU 与 CI 闸门三层可执行规则,并与站内原子リリース、完整性、並列関連稿串成同一套交付顺序。

自建リモート Mac 的局限是:快照代数、清理窗口与监控仍由团队自管;多 Job 同机时,一次满盘会同时打断编译、アップロード与回滚能力,SLA 代价高于单次 rm。

若要把磁盘水位与成果物 LRU 写进长期基线,租赁 SFTPMAC リモート Mac可预设分离构建卷与成果物卷、内置水位告警与アップロード闸门,减少 No space left 导致的发布事故。见 プランとトップ