From e02828c590601681fb8d5c6d9b53f7b89444232d Mon Sep 17 00:00:00 2001 From: host Date: Sat, 7 Nov 2026 03:52:34 +0000 Subject: [PATCH] =?UTF-8?q?fix(chv-muse-r11fix):=20nspawn=20255=20?= =?UTF-8?q?=E6=8B=92=E8=A3=B8=20--no-new-privileges=20=E4=B8=8E=20--direct?= =?UTF-8?q?ory=3D/=EF=BC=88=E7=BC=BA=E9=99=B7=202=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 断言新值、裸值不再出现。 --- chv-guest/chv-cell.py | 10 +++++++++- cloud/tests/test_chv_muse_p2.py | 7 ++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/chv-guest/chv-cell.py b/chv-guest/chv-cell.py index dfdd654..41e03bc 100644 --- a/chv-guest/chv-cell.py +++ b/chv-guest/chv-cell.py @@ -131,9 +131,17 @@ def build_nspawn_argv(command, network="veth", "systemd-nspawn", "--quiet", "--machine=%s" % MACHINE, "--directory=/", + # round-11 真机修复:nspawn 255 拒裸 --directory=/(须 + # --ephemeral 或 --volatile),也拒裸 --no-new-privileges + #(把它当作带必填参数的选项,吞掉下一个参数后报错)。 + # 选 --ephemeral:根文件系统快照 + overlay,单元内除 bind + # 出去的目录外一律可写、用完即弃——与 P2“共享客机 rootfs、 + # 只 bind workspace/.codex//run/chv”的设计一致;--volatile + # 会把根置只读,codex 写 $HOME 下非 bind 路径时会失败。 + "--ephemeral", "--as-pid2", "--private-users=%d:%d" % (UID_BASE, UID_COUNT), - "--no-new-privileges", + "--no-new-privileges=yes", "--system-call-filter=%s" % SYSCALL_FILTER, ] for cap in DROP_CAPABILITIES: diff --git a/cloud/tests/test_chv_muse_p2.py b/cloud/tests/test_chv_muse_p2.py index 0beeaa3..c510e40 100644 --- a/cloud/tests/test_chv_muse_p2.py +++ b/cloud/tests/test_chv_muse_p2.py @@ -43,7 +43,12 @@ class CellArgvTest(unittest.TestCase): self.assertIn("--machine=chv-cell", argv) self.assertIn("--directory=/", argv) self.assertIn("--as-pid2", argv) - self.assertIn("--no-new-privileges", argv) + # round-11 真机修复:nspawn 255 拒裸 --no-new-privileges + #(当作带必填参数的选项)与裸 --directory=/(须 + # --ephemeral/--volatile),见 p2.log 的解析报错。 + self.assertIn("--no-new-privileges=yes", argv) + self.assertNotIn("--no-new-privileges", argv) + self.assertIn("--ephemeral", argv) def test_muse_named_capabilities_dropped(self): argv = CELL.build_nspawn_argv(["true"])