【win备份还原工具开发日记】31:保留ACL端到端、进度条解析修复、B键整链与BCD残留清理(v2.6.27→v2.6.31)

举报
任正非 发表于 2026/11/08 02:08:25 2026/11/08
【摘要】 【win备份还原工具开发日记】31:保留ACL端到端、进度条解析修复、B键整链与BCD残留清理(v2.6.27→v2.6.31)对应文档(同日 9 篇):docs/20261023-0230-wimlib保留访问控制列表端到端实机通过-Step-5-Preview.md、docs/20261023-0237-还原进度条恒为空修复-wimlib进度行解析-v2.6.28-Step-5-Pre...

【win备份还原工具开发日记】31:保留ACL端到端、进度条解析修复、B键整链与BCD残留清理(v2.6.27→v2.6.31)

对应文档(同日 9 篇):docs/20261023-0230-wimlib保留访问控制列表端到端实机通过-Step-5-Preview.md、docs/20261023-0237-还原进度条恒为空修复-wimlib进度行解析-v2.6.28-Step-5-Preview.md、docs/20261023-0308-进度条修复端到端实机通过-v2.6.28-Step-5-Preview.md、docs/20261023-0320-接手AI交接说明-v2.6.28-Step-5-Preview.md、docs/20261023-0328-v2.6.29-wimlib依赖库校验缺口修复与交接文档高危项订正-Hy3.md、docs/20261023-0935-v2.6.29部署验证与优先级2图形界面层实机确认-DeepSeek-V4.1-Flash.md、docs/20261023-1025-B键恢复环境内整链实机验收与回退后续跑链文案修复-v2.6.30-DeepSeek-V4.1-Flash.md、docs/20261023-2052-启动配置数据历史osloader条目清理-DeepSeek-V4.1-Flash.md、docs/20261023-2205-v2.6.31-按B回退后重试对话框加警示-DeepSeek-V4.1-Flash.md

今天做了什么

wimlib 保留访问控制列表端到端实机通过(02:30,Step-5-Preview):v2.6.27(commit 2c8b588 去掉 wimlib_args 的 --no-acls)收尾,覆盖式还原链(任务 356f0b55-dee2-4fd0-8bf3-190f63946fc4)在恢复环境内全过。wimlib(开源 WIM 镜像工具)覆盖式应用不带 --no-acls 时,属主/访问控制列表(Access Control List,ACL)/protected 标志完整还原:8 个样本安全描述符逐字节一致、0 条不同(含 WindowsApps 的 TrustedInstaller+protected、Clipchamp 商店应用的 WIN://SYSAPPID 条件 ACE 与两条 S-1-15-3-* app package SID;还原前后、与 C: 参考双向一致)。反证基线:概念验证 pass1 已证实带 --no-acls 时样本退化为 O:BA 裸默认 ACE 集——本轮 8 条保持镜像原值,即反证该参数已不生效。规模:633,699 个文件 / 68 GiB / 11 分 43 秒;部署哈希 3ef72e73…5b82(2,877,952 B)。三项判据:status.json success/100;H:\BRImages\Recovery.log 第 2,203,313 行 wimlib 命令行尾无 --no-acls、本会话零 dism /Apply-Image;哨兵存活+hosts 覆写标记 GONE+卷序列号 6A2D-BA03 不变+事件标识符 1000 零新增。新踩坑 5 条:①prepare 只认 --operation create-secondary,子命令式写法报 unknown option;②resume 首参是工作区根 H:\brwork,误传任务目录报 os error 3;③bcdedit 的 {current}/{default} 是显示别名不是存储损坏;④任务目录 recovery.log 只有 resume 三行,跨重启主日志在镜像卷 H:\BRImages\Recovery.log(H:\brwork\Recovery.log 被运行中图形用户界面占用,findstr/copy 都失败);⑤还原系统自启弹「持续跑的还原任务」对话框须选否。

进度条恒为空根因修复 + 端到端(02:37/03:08,Step-5-Preview):用户问「还原期间进度条一直是空」→ v2.6.28(5aa17bf)。根因:parse_percent 是给 DISM 的 [= 45.6% =] 写的,而 wimlib 用 \r 原地刷新且行首带计数——Extracting file data: 15 GiB of 68 GiB (22%) 拼出 156822>100 → 恒 None → 进度条恒 0,剩余时间判据 pos>0 恒 --:--;只影响 v2.6.25 起的 wimlib 覆盖式通道,格式化还原(DISM,部署映像服务与管理工具)一直正常。修复(全在 text_parsing.rs):①parse_wimlib_progress 按关键字认三阶段(Creating files/Extracting file data/Applying metadata)取行尾括号百分比;②wimlib_overall_percent 按实测耗时(约 1 分钟/9 分半/1 分 15 秒)加权 10/80/10 折成一条单调 0→100,不倒退不走三遍;③wimlib_detail_line 把英文计数改写成中文进度行,不再每秒刷掉真实消息;④先试 wimlib、认不出回落 DISM(DISM 零改动)。验证:macOS 单测 210 过 +3 新增;真实日志回放 fragments=5278 parsed=5278 regress=0;实机(任务 9fa774c4,部署 cc985f93…ed73f)四帧截图 41%→57%→74%→89% 单调推进、剩余 --:--→04:14→01:06,展开 37%→整体 39.6≈41 映射吻合,apply 10 分 1 秒,33 B 占位被 13,107,200 B 真 hive 覆写,第 2,249,834 行无 --no-acls。新操作口径:①「否(N)」是 Alt+N 加速键,vmkey.sh n 单按无效、绝不能按 enter(默认按钮是「是」,会重启续跑历史任务);②覆盖式判据只看 Windows\System32\config\SYSTEM 是否存在,目标卷格式化后要先放占位,否则走 DISM 测不到 wimlib 解析。

wimlib 依赖库校验缺口 + 交接文档高危项订正(03:28,Hy3):v2.6.29(951c342,macOS 侧静态修复,未动虚拟机)。缺口:locate_wimlib 只查 wimlib-imagex.exe 不查同目录 libwim-15.dll——两者是独立部署件(恢复环境载荷注入与部署脚本都分开拷),漏拷动态库时 Windows 加载器直接终止 wimlib,报错不点名文件也不落日志,无法归因「部署清单漏拷」。修复:分两步校验,缺依赖库给独立可操作报错并保留「不会回退 DISM」语义;单测修正 1 条 + 新增 locate_wimlib_rejects_exe_without_companion_dll。交接文档订正:docs/20261023-0320 §8.4 把 H1(A 入口目标卷硬闸)、H3(Esc 误转编辑器 handle_key)两条高危误判为「未见修复标记」,逐条核对确认 2026-10-18 已修(native_gui.rs:6599+windows_prepare.rs:2521 两层;recovery_progress.rs:1906-1913 Esc 拦截)——不订正会让下一个接手者重复实现甚至改坏;并注明 macOS cargo clippy 15 条「未使用」告警是假阳性不要删(Windows 专属函数被 #[cfg(windows)] 门控)。验收:cli 211 过/core 44 过、clippy 0 error、交叉编译产物 2,875,392 B(888951c9…,与虚拟机原生产物大小不可混比)。

v2.6.29 部署验证 + 优先级 2 图形界面层实机确认(09:35,DeepSeek-V4.1-Flash):v2.6.29 虚拟机原生构建增量 10.42 秒,a81026ae…d1cdd(2,883,072 B)八联 SHA 全对;虚拟机全量单测 cli 246 过+core 44 过/7 ignored(较 v2.6.27 基线 242+6 多出的是 v2.6.28/29 新用例)。验收语义已变:优先级 2「数据卷硬拒」自 v2.6.25 起被有意改为「路由 + 确认框」,本轮按新语义实机——F: 放 15 B 占位 → 提权启动 --tab 3 → 取消格式化(CHECKBOX id=1214 before=1 after=0)→ 弹「确认覆盖式还原(wimlib 通道)」→ 点「否」(id=7)后零任务落盘(tasks 仍 17 个)。顺带发现:删占位后目标卷下拉仍显「Windows」是显示层缓存,判据在准备期由 target_is_windows_volume 重新探测,不影响安全。部署坑复现:自启图形界面占着 exe,--current-user 的 taskkill 报拒绝访问,必须走 SYSTEM 通道先杀。

B 键恢复环境内整链验收 + 回退续跑链文案修复(10:25,DeepSeek-V4.1-Flash):补掉长期挂账的「B 键(BCD 回退)在恢复环境内从未单独跑」(预安装环境已有 v2.6.18 run3/run4 结论)。任务 4d99dac3(v2.6.29 实机):恢复环境内 ESP(EFI 系统分区)无盘符,回退走 plan A verbatim 卷 GUID(全局唯一标识符)路径 \\?\Volume{d08d796f-…}\EFI\Microsoft\Boot\BCD,Restored byte-for-byte 字节级还原(非 bcdedit /import 字段级重建)——这正是本轮核心未知项,实机证明可用;回退发生在 apply 44%(01:53:15)而 apply 跑到 100%,回退与主流程互不阻塞(M5 工作线程收益二次印证)。实机缺陷修复(v2.6.30,ca7e09b):按 B 后任务自建 loader/device options 随快照消失,续跑链校验在 BootRepaired 阶段必然失败(预期后果),但旧文案「续跑启动链字段不符:device」不说因果,用户看不出是自己按了 B;修复=①进程级标记 BCD_ROLLED_BACK(放静态量而非 ProgressShared 字段,因回退跑在工作线程手上无 Arc,进程生命周期即「本次运行」)②纯函数 annotate_chain_failure 补中文因果说明+对话框追加「属预期」,只改说明不改行为(失败仍保留现场可重试);③顺手修 invalid task: 双前缀(TaskError 的 Display 自带前缀又被 err 包一层,strip_prefix 剥掉)。验收:macOS cli 212 过、虚拟机 cli 247+core 44 过、部署 cb561059…31ada(2,884,608 B)八联全对,第二次实机对话框三处文案齐全。重要新坑:从 macOS 写进虚拟机的 .cmd 必须 CRLF 行尾——LF 会让 cmd 把多行拼成一行,报「‘ey’ 不是内部或外部命令」这类半截单词碎片且第一行都不执行(此前脚本碰巧能用只因行短);判定特征=报错含脚本内容碎片;修法 s.replace('\n','\r\n').encode('ascii')。另确认 .cmd 不能出现中文(按 GBK 解析成乱码零匹配)。覆盖边界:前缀去重仅单测锁定未再实机;回退后是否自动终态留用户拍板。

启动配置数据历史 osloader 条目清理(20:52,DeepSeek-V4.1-Flash):按空间纪律先 bcdedit /export 导出回滚材料(503,808 B)再动手。全量枚举 548 个对象、启动加载器 11 个,删 12 个:6 个历史 Windows Recovery Environment 加载器(ramdisk=[F:]\Recovery\WindowsRE\Winre.wim,F: 已格式化全空=可证明悬空)+ 6 个只被各自加载器引用的设备选项对象;三条判定同时成立(指向已空 F: / 全文仅出现 1 次零引用 / RE 型 ramdisk 源于历轮「还原到 F:」测试残留)。结果:启动加载器 11→5,default/displayorder/resumeobject/timeout=10 与清理前逐字一致,重启原系统正常(C:=BCD4-EAAB)。保留 5 个:原系统 {077a3904}、预安装环境 {177f3ea3}、Y: 恢复链 {264caa29}、指向活动系统卷 C: 的 {c76d3c5a}/{ef55d218}(有意不动,待单独分析)。CRLF 坑当天第三次撞见(第一版清理脚本又是 LF),结论「必须靠工具不靠记忆」;另发现管道后的 find /c 报「参数格式不正确」不可靠,计数改用 PowerShell -match 全量比对。未改源码,版本保持 2.6.30。

按 B 回退后重试对话框加警示(22:05,DeepSeek-V4.1-Flash):v2.6.31(595155f)。用户拍板:不自动终态(明确否掉「回退即自动收口」——回退只动引导链不动已写入镜像,误触 B 或回退后仍想跑完的用户会被堵死退路;「保留现场可重试」是 v2.6.8 用悬置任务换来的教训),改为把信息说清。实现:failure_policy.rs::retry_prompt 新增 bcd_rolled_back 参数,为真时在错误行后插入中英双语警示「重试很可能再次失败……若确实想中止请选『取消』」;调用点 main.rs:1469 传入 v2.6.30 的进程级标记。实机(任务 6d8433da):部署 87696eac…52289(2,885,120 B)八联全对,虚拟机 cli 248 过+core 44 过;失败对话框三处文案齐全(因果说明+新警示+「已保存的任务与恢复材料会保留」),invalid task: 双前缀未复现。单测锁两条:回退过必带警示且「取消」退路仍写明、没回退一个字不许多(macOS cli 213 过)。覆盖边界:未按「重试」再走一遍(预期仍失败无新信息);pause_prompt 未加警示。

教训与经验

  • 进度解析必须认准两套格式,行首计数拼数字必然越界:DISM 的 [= 45.6% =] 与 wimlib 的 \r 三段计数行不能共用一个解析器;三阶段各自报 0–100,要按实测耗时加权(10/80/10)折成一条单调 0→100——权重换镜像可能前快后慢,但单调性与终值 100% 不受影响,要调只改 wimlib_overall_percent 一处。
  • 主程序与依赖库是独立部署件,校验必须成对:漏拷 dll 时 Windows 加载器直接终止进程且报错不点名,只能在定位函数里补校验并给「点名缺哪个文件」的可操作报错,否则白白消耗一轮排查。
  • 接手文档的错误判断要复核后再信:把已修高危写成「未修」会诱导下一个 AI 重复实现甚至改坏已正确的代码(H1/H3 实为 10-18 已修);复核方式=按修复标记与代码位置逐条对。
  • macOS 写进虚拟机的 .cmd 必须 CRLF + 纯 ASCII,必须工具化不能靠记忆:LF 报「半截单词」且第一行不执行、判定特征是报错含脚本内容碎片;中文按 GBK 乱码零匹配。当天三次撞见(10:25 首证、20:52 又犯),统一走 s.replace('\n','\r\n').encode('ascii') 的写文件函数才是解。
  • 验收项的语义会随产品演进改变:「优先级 2 硬拒」已变「路由+确认框」,旧验收清单不能照旧文案跑,动手前先确认要验的行为现在是哪一版。
  • 预期后果要写进文案:按 B 回退后续跑链校验必然失败是设计使然,不说因果会被用户当故障、被接手者当回归;修法是进程级标记+纯函数补写,只改说明不改行为,不掩盖真缺陷。
  • 删启动配置数据残留的三条判据 + 先留回滚材料:指向已格式化卷(可证明悬空)+ 全文仅出现 1 次(零引用)+ 类型可解释来源;先 /export 再删,删后启动管理器各项逐字比对+重启验证。
  • 程序只负责把信息说清,选择权留给用户:回退后不自动终态是用户明确拍板——自动收口会堵死「回退后仍想跑完」用户的退路,警示文案须保留「取消」这条退路。
  • 恢复日志落点三层:任务目录 recovery.log 只有 resume 三行;跨重启主日志在镜像卷 H:\BRImages\Recovery.log;H:\brwork\Recovery.log 常被运行中图形界面占用(findstr/copy 都会失败)。

下次接手的注意

  • (03:20 接手 AI 交接说明的待办并入)需用户拍板三项:①#38 A/B 入口+备份+预安装环境安装全链复跑专场是否投入;②H:\brwork\tasks 证据目录保留边界(日终 20 个,9fa774c4/356f0b55/ab95a79a/6d8433da 为端到端证据建议保留);③TaskStore 任务目录是否搬离程序目录 C:(10-18 用户问过,动前先问)。
  • 清理项待确认后执行:包目录 3 个解析失败任务(ef71fccc 等,均终态);T: 5 GB 空卷处置。
  • 启动配置数据剩余待分析:{c76d3c5a}/{ef55d218} 指向活动系统卷 C: 的恢复环境条目(先确认 C:\Recovery\WindowsRE\Winre.wim 是否存在)与恢复对象(从休眠状态恢复)同类残留,单开一轮,不混批量清理。
  • 覆盖缺口:v2.6.30 的 invalid task: 前缀去重仅单测锁定未再实机;v2.6.31 未按「重试」再走一遍;wimlib 安全描述符还原的失败行为本机不可构造(失败即退出码非 0、不静默降级)。
  • 产品取舍待用户表态:pause_prompt(暂停对话框)是否也加「按过 B 回退」警示。
  • 进度条权重 10/80/10 是本机实测经验值,换条目数/体积比差异大的镜像可能前快后慢;调整只改 wimlib_overall_percent 一处。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。