Skip to content

用内核原生 selector 持久化替代 web_save (cache.db cp 同步)#1298

Open
abcfy2 wants to merge 1 commit into
juewuy:devfrom
abcfy2:feat/native-selector-persistence
Open

用内核原生 selector 持久化替代 web_save (cache.db cp 同步)#1298
abcfy2 wants to merge 1 commit into
juewuy:devfrom
abcfy2:feat/native-selector-persistence

Conversation

@abcfy2

@abcfy2 abcfy2 commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

close #1296

启用内核原生选择持久化,替代 web_save 的 API 拉取 + 回推:

  • mihomo: profile.store-selected
  • singbox: cache_file

cache.db 跑 tmpfs(bbolt 需 mmap,持久分区 jffs2/ubifs 不支持 MAP_SHARED):

  • singbox cache_file.path 直指 $TMPDIR/cache.db
  • mihomo 路径不可配(-d $BINDIR),bfstart 启动前软链 $BINDIR/cache.db → tmpfs;小内存模式($BINDIR=$TMPDIR)守卫跳过防自指

备份/恢复用 cache.db cp 同步,保留 web_save/web_restore 函数名与 hook(向后兼容旧 crontab):stop → web_save 备份,bfstartweb_restore 启动前恢复,task 106 每10分钟定时备份。

选择持久化交给内核自己存(bbolt),不再依赖外部脚本拉 API 解析回推——根除 web_save 解析比对 bug(#1264 / #1276 / #998 配置丢失的根因)。

已知问题

configs/web_save 被废弃,更新之后会造成上一次配置丢失,未来改为内核自己的配置保存方案。所以更新之后第一次需要重新保存一次面板配置

@abcfy2 abcfy2 changed the title feat: 用内核原生 selector 持久化替代 web_save (cache.db cp 同步) 用内核原生 selector 持久化替代 web_save (cache.db cp 同步) Jun 29, 2026
@abcfy2
abcfy2 force-pushed the feat/native-selector-persistence branch from b24c926 to d33eda9 Compare June 29, 2026 15:05
@abcfy2
abcfy2 force-pushed the feat/native-selector-persistence branch from d33eda9 to 9d1e26f Compare July 11, 2026 14:41
启用 mihomo profile.store-selected 与 singbox cache_file, cache.db 运行于
tmpfs(bbolt 依赖 mmap, 持久分区 jffs2/ubifs 不支持):
- mihomo cache.db 路径不可配(-d $BINDIR), bfstart 启动前软链
  $BINDIR/cache.db 到 $TMPDIR; 小内存模式($BINDIR=$TMPDIR)守卫跳过防自指
- singbox 直接 cache_file.path 指向 $TMPDIR/cache.db

web_save/web_restore 保留原函数名与 hook 位置(向后兼容旧 crontab), 内部改为
cache.db cp 同步:
- start.sh stop 调 web_save 备份(kill 前)
- bfstart 调 web_restore 启动前恢复(仅 tmpfs 无时恢复, 防覆盖更新)
- task 106 web_save_auto 每10分钟定时备份
- 小内存模式 web_save 守卫跳过(与软链守卫一致)

解决面板配置丢失类 issue juewuy#1264 juewuy#1276 juewuy#998close juewuy#1296
@abcfy2
abcfy2 force-pushed the feat/native-selector-persistence branch from 9d1e26f to 3812694 Compare July 11, 2026 15:05
@juewuy

juewuy commented Jul 13, 2026

Copy link
Copy Markdown
Owner

这个功能我希望能做成一个可选性功能而非强制性,暂时先不合并

@abcfy2

abcfy2 commented Jul 13, 2026

Copy link
Copy Markdown
Contributor Author

当前进展

mihomo 内核已经在目前最新版本 (v1.19.28) 解决了 cache.dbjffs 分区上的存储问题: MetaCubeX/mihomo#2922

但是 sing-box 尚无回应: SagerNet/sing-box#4251

所以当前 PR 的解决方案就是,对于 singbox/singboxr内核继续使用 web_save 每10分钟将 $TMPDIR 下的 cache.db 同步到 $CRASHDIR 中,对于 mihomo 内核web_save实际是无动作的(no-op)的。

不知道“做成可选性功能”是怎么考虑?这个功能还需要增加一个单独的菜单吗?

@juewuy

juewuy commented Jul 13, 2026

Copy link
Copy Markdown
Owner

@abcfy2 是的,就是在功能设置里加一个开关,用户可以选择,当然简单方法是直接根据用户是否启用了每x分钟自动保存节点的定时任务来判断,这个也可以

@abcfy2

abcfy2 commented Jul 13, 2026

Copy link
Copy Markdown
Contributor Author

通过定时任务来判断这个方案感觉实现起来特别丑,加开关的话这里会让整个代码非常冗余。

也许可以等一等。mihomo 已经修复了 jffs 的兼容性,最理想的情况是 sing-box 也能解决 jffs 的兼容性问题,那么整个 web_save / restore 和定时任务相关的代码通通可以移除了。这里我看了下代码能精简不少

@juewuy

juewuy commented Jul 13, 2026

Copy link
Copy Markdown
Owner

@abcfy2 官方的cache.db本身存档还是比较臃肿的,脚本内置的存档非常精简,对小闪存的设备要更友好一些

@abcfy2

abcfy2 commented Jul 13, 2026

Copy link
Copy Markdown
Contributor Author

我这边跑了半个月的 cache.db,占用容量 1MB, 还算是能接受。

大部分容量似乎是被 fake-ip 占用掉的。如果取消 fake-ip 存储应该会节省非常多的空间 (store-fake-ip: false)

configs/web_save 的主要问题是有太多边界情况可能没有处理,导致时不时就会意外丢失配置的情况,如果都处理这些边界情况的话,代码量又是一个大问题。所以如果能用内核原生的持久化方案就更完美了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] 考虑使用内核原生的配置记录功能替代 web_save

2 participants