fix(chv): cell 不再把 /run/chv 的组改回 root
chv-cell 每次跑 cell 都 _ensure_bind_source(BROKER_DIR, uid=0, gid=0),把 /run/chv 的组改回 root,抹掉 tmpfiles 的 chv-browser 组;之后 chv-browser 重启时 os.remove(browser.sock) 报 Permission denied、无限 crash-loop(构建 #8 客机 62 次重启才 被发现,03:42 驱动两次跑 cell 正好在补丁后、重启前)。改:组 改取 chv-browser 的 gid(不存在回落 0);serve() 删 socket 失败时报错说清修法,不再只剩裸 traceback。
This commit is contained in:
1 parent
0bfb00ab1b
commit
435664925e
3 files changed
+105
-3
No files matched your search
+17
-1
@@ -57,6 +57,7 @@ nsenter 进单元 init 的 netns 做。veth 建不起来即大声失败,不静
|
||||
未装;本启动器由 root 写映射,不碰这两处限制。
|
||||
"""
|
||||
import ctypes
|
||||
import grp
|
||||
import json
|
||||
import os
|
||||
import pwd
|
||||
@@ -519,6 +520,20 @@ def cell_network_commands(cell_pid):
|
||||
]
|
||||
|
||||
|
||||
def _broker_dir_gid():
|
||||
"""broker 目录(/run/chv)的组:chv-browser 要在里面建 socket,
|
||||
组须是 chv-browser(0775 时组可写);该组不存在时回落 root(0)。
|
||||
|
||||
2026-11-08 构建 #8 live 实证:这里曾写死 gid=0,每次跑 cell 都
|
||||
把 /run/chv 的组改回 root,抹掉 tmpfiles 的 chv-browser 组;
|
||||
之后 chv-browser 重启时 os.remove(browser.sock) 报 Permission
|
||||
denied、无限 crash-loop(62 次重启才被发现)。"""
|
||||
try:
|
||||
return grp.getgrnam("chv-browser").gr_gid
|
||||
except KeyError:
|
||||
return 0
|
||||
|
||||
|
||||
def _ensure_bind_source(path, uid=CELL_UID, gid=CELL_GID):
|
||||
"""bind 源目录须存在且属 chv(单元内 root 即客机 chv,属主不对
|
||||
就写不进 workspace)。root 建的目录要 chown 回 chv。"""
|
||||
@@ -738,7 +753,8 @@ def run_cell(command, network="veth"):
|
||||
return 2
|
||||
_ensure_bind_source(WORKSPACE)
|
||||
_ensure_bind_source(CODEX_HOME)
|
||||
_ensure_bind_source(BROKER_DIR, uid=0, gid=0)
|
||||
# broker 目录不写死 gid=0:组须留给 chv-browser(见 _broker_dir_gid)。
|
||||
_ensure_bind_source(BROKER_DIR, uid=0, gid=_broker_dir_gid())
|
||||
spec = build_sandbox_spec(command, network=network)
|
||||
print("chv-cell: 启动单元:%s"
|
||||
% json.dumps(spec, ensure_ascii=False), file=sys.stderr)
|
||||
|
||||
Reference in new issue
Block a user