🐳 第八章 设计自己的Harness
📄 一句话概括

接缝放错层的后果不是报错,而是静默无效——改动写进去了,树里两条并存,谁也没变。

📝 本节和前面几节的关系

8.2.1 定了四件事,这一节补上最容易翻车的一步:这些字段写在哪一层。

一、实测:两次【想在错的地方改东西】

两次都没有报错——第一次给了一行警告,第二次连警告都没有。

二、为什么是【静默】无效

因为两层各自都是合法的写法,语法上没有毛病。

预设的 plugins 列表,是预设自己的装配清单;宿主层的 sandbox-policy,是进程级的策略。

你把 A 层的写法用在 B 层,系统能做的只有:要么告诉你【找不到】(警告并跳过),要么照单收下但管不着。

三、怎么判断该放哪层

两个问题:

两问过一遍,'哪里写' 基本没有悬念。

四、本课的四层栈,实盘对应

dsh --help 原话:profile 是一叠插件包补丁层,排在【你自己的覆盖】下面(4.2.1)。

实盘上你只碰两处:

改自己的层,别去戳别人的层——这是本课最省事的一条纪律。

五、动手 Demo:接缝放错层会怎样

两次实测,都是【想在错的地方改东西】:

tries = [("顶层补丁", "预设内部的一条"),
         ("预设内部", "宿主层的沙箱范围")]
for where, what in tries:
    print("  在 %s 改 %s -> 静默无效" % (where, what))

实跑输出:

--------------------------------------------------------------------
接缝放错层会怎样
--------------------------------------------------------------------
  两次实测,都是【想在错的地方改东西】:

  你想改什么         在哪一层改     实测结果
  ----------------------------------------------------------
  预设内部的一条     顶层补丁       not found,只警告并跳过
  宿主层沙箱范围     预设内部       宿主层原文一个字没动
  ----------------------------------------------------------

  第二条是本轮新跑的实验:预设里塞了一条 `sandbox-policy`,
  dump 出来树里**两条并存**,宿主层那条仍是
  `DSH_PERMISSION_MODE ?? 'workspace-write'`。

  结论:**哪一层的规矩,就在哪一层的写法里改**;
  接缝放错层,不是报错,是**静默无效**——这才是最危险的。

第一次给了一行 not found 警告,第二次连警告都没有——所以不能靠【有没有报错】来判断改对了没有。 要靠 dump 出来对 diff——这是本课反复用的那个方法。 哪一层的规矩,就在哪一层的写法里改。

30 秒实验

  1. 用 --dump-config 打出你自己的树,先找到【你自己的那一层】在哪。
  2. 随便改一个顶层字段,对比 diff 里是哪几行变了。
  3. 试着改一个预设内部的字段,看它给不给警告。

常见误区

  1. 错误:只要没报错,就说明改对了。——纠正:静默无效比报错更危险——报错至少告诉你没成,静默无效会让你以为成了。
  2. 错误:层级是官方的事,我只要写配置。——纠正:你自己也在某一层里——profile 目录里那个 patch 文件就是你的层,认识它才知道自己能改到什么范围。
  3. 错误:同一件事写在两层,哪层生效都行。——纠正:两层并存等于两本账——dump 里会出现两条同名项,以后排查时你会先怀疑人生。
自测三问(点开对答案) 1. 接缝放错层,最典型的症状是什么? —— **静默无效**——改动写进去了,树里两条并存,实际谁也没变。 2. 判断该放哪层,问哪两个问题? —— **它该活多久**(跨会话/随会话)和**谁能改它**(宿主/会话)。 3. 改完怎么确认真的生效了? —— **dump 出来对 diff**——不能靠【有没有报错】判断,因为有的错连警告都没有。

相关笔记