Skip to content

ZH Storage Policy

SlimRG edited this page Aug 23, 2026 · 1 revision

存储策略

Release 目录视为只读。最终用户包只包含 Shadowsocks.exe;配置、缓存、插件、日志和下载组件都不能写到 EXE 旁。

普通模式

默认根目录:

%LOCALAPPDATA%\Shadowsocks

典型布局:

settings.json
settings.backup.json
Cache\PAC\...
Cache\GeoSite\...
Data\PAC\...
Plugins\<plugin-id>\...
Components\DNSCryptProxy\...
Logs\shadowsocks.log
Runtime\WinDivert\...
Runtime\DNSCryptProxy\...
Startup\Shadowsocks.exe
Temp\NetworkService\...
Temp\Updates\DNSCryptProxy\...
Temp\StartupLogs\...
Temp\Working\...

settings.json 通过 ISettingsStore / JsonFileSettingsStore 持久化。写入采用 temporary file + replacement;settings.backup.json 保存前一个 durable snapshot。配置 schema 升级后,已删除的旧字段会在 typed configuration 的规范化保存中被清理。

Local PAC / GeoSite

Local PAC、GeoSite cache 和 user-rule.txt 位于当前 storage root。user-rule.txt 是 managed C# FilterEngine 的本地规则覆盖;可执行 abp.txt 已不再支持。

SIP003 插件

Managed package 位于:

Plugins\<plugin-id>\

Built-in catalog package 的 .plugin.json 保存 trusted repository、release tag、selected asset、automatic-update preference 与最后一次成功检查时间。Manual ZIP/TAR.GZ import 不参与 background update。Staging/rollback 使用同一 active storage root 下的 .plugin-stage-* / .plugin-backup-* 临时目录;若 directory swap 被进程中断,下一次读取 plugin storage 时会恢复 orphaned backup,并 best-effort 清理旧 transient 目录。Server 配置只保存 managed plugin id/options/arguments。运行时通过 PluginManager 解析,不使用任意绝对路径、PATH 或自由 repository fallback。

DNSCrypt

持久组件:

Components\DNSCryptProxy\...

运行时与更新 staging 位于 Runtime\DNSCryptProxyTemp\Updates\DNSCryptProxydnscrypt-proxy.exe 不打包进 Shadowsocks.exe,仅在需要时下载并验证。 已签名的解析器目录以认证文件对 Runtime\DNSCryptProxy\public-resolvers.md + .minisig 保存。应用通过 Shadowsocks 上的 Cloudflare DoH 刷新该文件对,并以 Google DoH 作为备用;替换文件前会验证固定的 DNSCrypt Minisign 公钥。生成给 dnscrypt-proxy 的目录 profile 使用 urls = [],只读取本地缓存。Clean Mode 在会话根目录内使用相同布局。

WinDivert / NetworkService

WinDivert runtime 只在 Admin Mode 下物化到 Runtime\WinDivert

嵌入的 Shadowsocks.NetworkService 会提取到唯一临时目录:

Temp\NetworkService\<version>\<hash>\<pid-guid>\

提取过程受同步保护并校验 hash。

Clean Mode

当 EXE 文件名(去掉 .exe)以 p 结尾时启用 Clean Mode,例如:

Shadowsocksp.exe
Shadowsocks-5.2p.exe

每次运行创建独立目录:

%TEMP%\Shadowsocks\Clean\<timestamp>-<pid>-<guid>\

Clean Mode:

  • 不读取 %LOCALAPPDATA%\Shadowsocks
  • 不迁移旧 sidecar;
  • 禁用 Start with Windows;
  • plugins/DNSCrypt/cache/logs 都在 Temp session 内;
  • Quit 时 best-effort 删除 session;
  • 后续启动清理 abandoned sessions。

Start with Windows

普通模式维护一个 SHA-256 验证过的启动副本:

%LOCALAPPDATA%\Shadowsocks\Startup\Shadowsocks.exe

HKCU Run 指向该副本,并带 --start-hidden 和内部 startup-origin 参数,使 self-updater 即使从旧 startup copy 启动,也能更新真正的 primary EXE。

Self-update

应用自更新 staging 刻意放在 StorageRoot 之外:

%TEMP%\Shadowsocks\Updates\<transaction>\
  Shadowsocks-win-x64.zip
  Shadowsocks-win-x64.zip.sha256
  Shadowsocks.Update.exe

这样 staging 能在当前进程关闭和 Clean Mode 清理后继续存在。Updater 会再次验证自身 SHA-256,等待旧 PID,保留 rollback copy,替换 target EXE,启动新副本,再由新副本清理 transaction。

Registry 边界

Registry 只用于 Windows 集成:

  • Start with Windows;
  • ss:// protocol association;
  • WinINet/system proxy;
  • launcher/game 的只读发现。

产品设置不存入 Registry。

Release 不变量

产品代码不能在 Shadowsocks.exe 旁创建可变 sidecar。Release validator 强制 one-file distribution,并拒绝旧式 executable-side 配置/runtime 文件。

Clone this wiki locally