host
|
adc7bf6666
|
part 5 修复 2:默认 dispatch 在只读 /app 下建不了 worktree——workspace 绑定 /app/work
RETEST4 新发现 2:make_worktree 把 worktree 建在 HERE/work/
host-worktrees,单元内 HERE=/app 而 /app 是 --bind-ro,带 repo
的默认 dispatch 撞 OSError Errno 30(--no-worktree 的同任务
越过此关、跑到真实 turn)。
二选一取 (a) 给 worktree 一条单元内可写路径:客机 workspace
下的 .chv-worktrees 以可写 --bind 挂到单元内 /app/work 上
(build_nspawn_argv 新增 worktrees_dir 参数,默认
WORKTREE_DIR=/home/chv/workspace/.chv-worktrees;run_cell 起
单元前 _ensure_bind_source 建好该目录并 chown 回 chv)。
取舍:
- 不选 (b) 执行器默认 dispatch 带 --no-worktree:worktree
隔离就丢了——任务改动直接落进 repo 本身,多任务同仓互撞,
merge/discard/seed-dir 语义全坏;且只修 dispatch,goal/fork
同样调 make_worktree,照样撞 Errno 30。
- (a) 内不选可写 tmpfs:tmpfs 随单元退出即丢 worktree,跨
cell 的 run/merge 续跑找不着工作区;workspace 绑定随客机
磁盘持久化,worktree 语义、隔离与落盘位置(仍是
/app/work/host-worktrees/<任务>)全都不变,也不碰 P2 的
/usr 只读约束。
- bind 必须排在 --bind-ro=/app 之后(nspawn 按顺序挂载,后挂
的才盖住只读子树下的子路径),单测钉住该顺序。
未决(须 RETEST5 真机验证):nspawn 对 --bind 目的路径的
处理(目的不存在时是否自动建挂载点)与挂载叠加顺序只能在
真机上验证,单测只能钉住 argv 形状;本轮不建镜像、不跑真机。
新测试 cloud/tests/test_chv_muse_p2.py::CellPart5WorktreeTest
(4 项):可写 bind 在位且在 workspace 下、顺序在
--bind-ro=/app 之后、自定义目录参数生效。
|
2026-11-07 12:07:01 +00:00 |
|
host
|
7a227323f2
|
part 4 缺陷 3:并发 cell 撞毁——唯一身份 + run_cell 接线
RETEST3 缺陷 3:固定 ve-chv-cell 名 + 固定 10.200.0.1/24,
第二个 cell 在 nspawn 建 veth 时即 File exists/Address
already assigned。
- CellNet + allocate_cell_net():每次 run_cell 在 flock 锁下
(/run/chv/.cell-alloc.lock,30 秒超时)分配唯一身份:
machine chv-cell-<xx>(11 字符)、宿主 ve-chv-cell-<xx>
(14 字符,接口名 15 字符上限内)、10.200.<xx>.0/24;
扫描活接口 + 地址 + machinectl 在册名,避让注销滞后的下标。
- 配网命令表(host/cell/cleanup)与 build_nspawn_argv 接受
net/cell_net 参数;None 时仍用旧常量(argv 子命令与旧测试)。
- run_cell 重写:分配身份 -> 生成专属文件 -> 起步门 payload
-> 等 veth(20 秒)-> 宿主配网 -> 轮询 init pid(10 秒)
-> 写 pid 文件 -> 单元内配网 -> 开门 -> 等退出码;
nspawn 已死返回其退出码;finally 清 NAT/pid/专属文件。
共享网络模式跳过门与身份(无配网可等)。
- broker:pid ns 对照改多 cell 版(peer_allowed_multi +
_read_cell_pids:cell-<machine>.pid glob + 兼容旧 cell.pid;
对端 ns 与任一活单元同 ns 即放行;残留 pid 文件只跳过,
全部读不到才拒绝,不降级)。
新测试:CellAllocTest、CellPart4NetworkTest、
CellPart4ArgvTest(cell_net 两法)、BrokerMultiTest。
|
2026-11-07 10:30:30 +00:00 |
|
host
|
2be69af92c
|
part 4 缺陷 2:volatile 空根缺 /app 与 /etc 关键文件
RETEST3 缺陷 2:--volatile=yes 下单元根是基本空的 tmpfs,
/app、/etc/resolv.conf、/etc/hosts、/etc/ssl/certs 全无,
执行器单元路径一律 ENOENT、DNS/TLS 不可用。
- build_nspawn_argv:固定只读绑 --bind-ro=/app 与
--bind-ro=/etc/ssl/certs;新增 extra_ro_binds 参数
(单元专属 resolv.conf/hosts 由 run_cell 传进来)。
- prepare_cell_files():按客机有效 DNS 生成单元专属
resolv.conf/hosts(/run/chv/resolv.conf.<machine>、
hosts.<machine>,0644——单元 root 映射为客机 uid 1000,
0600 的 root 文件单元内读不到;DNS/hosts 不含秘密)。
客机 resolv.conf 可能是 systemd-resolved stub
(127.0.0.53),单元内无 resolved,直接绑 stub 即 DNS
全灭,故过滤 stub 后备选 /run/systemd/resolve/resolv.conf,
两处都没有即大声失败。nsswitch.conf 故意不绑(客机版
可能含 resolve 模块;glibc 默认 files+dns 正是单元需要的)。
新测试:CellFilesTest、CellPart4ArgvTest(绑定两法)。
run_cell 接线在缺陷 3 的重写里做。
|
2026-11-07 10:29:31 +00:00 |
|
host
|
fc33eed262
|
part 4 缺陷 1:cell 启动竞态——起步门 + init pid 轮询
RETEST3 缺陷 1:run_cell 里配网与 payload 零同步,快 payload
(run -- true)在配网完成前退出即撞墙,11 次只成 6 次。
本提交先落 helper(接线在缺陷 3 的 run_cell 重写里做):
- gate_wrapper_command():payload 包一层 sh 起步门,等
/run/chv/.cell-gate-<machine> 出现再 exec(绝对路径
/usr/bin/sh:volatile 单元根里 /bin 未必有)。
- find_cell_init_pid() 改带超时轮询(timeout 默认 0.0 = 单次,
旧调用行为不变;缺目录不再直接回 None;proc_alive 回调让
nspawn 已死时立刻回,不空等)。
新测试:CellGateTest、CellInitPidPollTest(5 个)。
|
2026-11-07 10:29:13 +00:00 |
|
host
|
581e850eb7
|
fix(chv-muse-r11fix): cell 只遮 /usr 下路径(复测新发现 1)
--volatile=yes 下容器根是基本空的 tmpfs(只挂进只读 /usr),
nspawn 按容器根解析 --inaccessible 路径,/etc/chv 与
/home/chv/.git-credentials 在容器根里根本不存在,解析失败即
Failed to resolve 而起不来;两条 /usr 旗可解析,保留。
凭证文件按构造即不可达(容器根里无 /home、无 /etc/chv),
遮蔽不再是必须项,安全属性不变。
探针证据:celldiag2/3/4——去 inaccessible 后完整 argv 0.4s/rc=0,
单元内 $HOME/.cache 可写,单元内 ls /etc/chv 本来就不存在。
|
2026-11-07 07:02:37 +00:00 |
|
host
|
c1d00b3620
|
fix(chv-muse-r11fix): cell 改 --volatile=yes(复测纠正缺陷 2)
复测(RETEST.md §cell):--ephemeral 在客内 ext4 根盘(2.4G、
已用 1.8G、可用 593M)上做整盘快照拷贝,空间不够即 ENOSPC,
全部 cell 调用失败(每次约 10.5s veth 超时后 rc=1)。改
--volatile=yes:根为基本空的 tmpfs、/usr 只读挂进,单元内除
bind 出去的目录外一律可写、用完即弃——与 --ephemeral 的设计
意图一致,但不拷盘、不占空间(systemd-nspawn 手册口径)。
--volatile=state 不行:整树只读、仅 /var 为 tmpfs,codex 写
$HOME/.cache 等非 bind 路径会失败。探针已证实 yes/state 均可
启动(0.4s,rc=0),取 yes 保可写性;真机 codex 入 cell 由
第二轮复测验证。测试:CellArgvTest 断言新值、--ephemeral
不再出现。
|
2026-11-07 05:24:30 +00:00 |
|
host
|
e02828c590
|
fix(chv-muse-r11fix): nspawn 255 拒裸 --no-new-privileges 与 --directory=/(缺陷 2)
systemd 255 把裸 --no-new-privileges 当作带必填参数的选项,吞掉
下一个参数后报错(p2.log 实测);--directory=/ 也被拒,须
--ephemeral 或 --volatile。改 --no-new-privileges=yes,
--directory=/ 后加 --ephemeral:根快照 + overlay,单元内除 bind
出去的目录外一律可写、用完即弃,与 P2 共享客机 rootfs 设计一致;
--volatile 会把根置只读,codex 写 $HOME 下非 bind 路径会失败。
测试:CellArgvTest 断言新值、裸值不再出现。
|
2026-11-07 03:52:34 +00:00 |
|
host
|
c61484aa68
|
feat(chv-guest): 对齐 Muse P2——nspawn 单元 + broker + 浏览器子代理
- chv-cell:systemd-nspawn 单命令单元,--private-users=1000:65536
(单元 root → 客机 chv),丢 8 项能力(含 SYS_PTRACE/NET_ADMIN),
syscall 过滤扣 io_uring,遮蔽 /etc/chv 与 playwright,
--network-veth(10.200.0.0/24 + NAT),白名单环境透传
- chv-broker:Unix socket + SO_PEERCRED(uid 范围 + pid ns 对照),
白名单 ping/sync/browser;sync 只调 chv-sync(runuser -u chv)
- chv-browser:单元外独立进程,只暴露 open/snapshot/screenshot/
close/ping,返回无障碍树快照(截断);evaluate/content 拒绝
- build.sh:装 systemd-container/iproute2/iptables,拷入三脚本,
建 chv-browser 用户与两个 systemd 单元;vsock_notify 条件拷入
- buildinfo:内容项加 P2 四项,支持可选 extra_contents
- 测试:cloud/tests/test_chv_muse_p2.py 40 项全过;broker/browser
真实 socket 回路冒烟通过(root 连 broker 被拒)
- 差距表:docs/chv-muse-p2-gap.md;真机验证待测试机空闲(round 11)
本地做,不推、不合、不部署
|
2026-11-06 20:53:15 +00:00 |
|