carry-over: 在途 V-9 根因修复 + Muse P2 对齐原样带入(未改一行业务逻辑)

来源:feat-chv-muse-p2 @ c918d69 的 6 个未提交文件(+157/-29):
build.sh(GT 哈希轮换 + 99-chv-sync.cfg runcmd chown)、
check_lockfile.py / generate_lockfile.py(DECLARED_SOURCES 加
chv-cell/chv-broker/chv-browser)、executor.py(_wait_guest_env_usable)、
hostkeys.py(guest-env owner 恒 root:root)、test_chv_v3_fixes.py。
单测:python3 -m unittest cloud.tests.test_chv_v3_fixes 38/38 通过。
本提交只搬运,不含阶段 1 改动;阶段 1 另起提交。
This commit is contained in:
host committed 2026-11-08 09:45:00 +00:00
1 parent 1836c5af32
commit c904ae9358
6 files changed
+157 -29

No files matched your search

+23 -16
View File
@@ -231,19 +231,24 @@ def _apply_seed_extras(seed_dir: str, user_data: str,
return user_data
def _insert_guest_env_entry(user_data: str, merged_env: dict,
ssh_user: str | None) -> str:
def _insert_guest_env_entry(user_data: str, merged_env: dict) -> str:
"""把 guest-env 条目并进 user-data 已有的 write_files
列表(绝不再写一个 write_files: 键,见 _guest_env_entry)。
owner:SSH 用户非 root 时写 "<用户>:<用户>"(0600 不变),
否则 root:root。条目插在 runcmd 段之前、仍属同一
write_files 列表(seed 自 2026-11-07 起不再带 runcmd,
见 build_seed_user_data 的根因禁令;marker 分支只作
防御,将来模板若恢复 runcmd 仍插在其前)。"""
owner = "root:root"
if ssh_user and ssh_user != "root":
owner = "%s:%s" % (ssh_user, ssh_user)
lines = _guest_env_entry(merged_env, owner=owner)
owner 恒为 root:root——V-9 真机根因(2026-11-07):
cloud-init 的 config 阶段里 write_files 在 users-groups
之前跑,owner 写 chv:chv 时 getpwnam('chv') 尚不存在,
整个 write_files 模块失败(cloud-init.log:
OSError('Unknown user or group: "getpwnam(): name not
found: \'chv\'"')),guest-env 文件根本不产生(host
key 两条 root:root 的条目在前、已写入,所以 PUBKEY-MATCH
仍 True——只看钉死匹配会漏判此缺陷)。文件改归实际读
它的 SSH 用户,由客内 final 阶段的 99-chv-sync.cfg
runcmd 在 chv-sync boot 之前 chown(用户那时已建好),
见 chv-guest/build.sh。条目插在 runcmd 段之前、仍属
同一 write_files 列表(seed 自 2026-11-07 起不再带
runcmd,见 build_seed_user_data 的根因禁令;marker
分支只作防御,将来模板若恢复 runcmd 仍插在其前)。"""
lines = _guest_env_entry(merged_env, owner="root:root")
marker = "runcmd:\n"
if marker in user_data:
head, tail = user_data.split(marker, 1)
@@ -268,9 +273,12 @@ def write_seed(seed_dir: str, vm_name: str, private_key_text: str,
装 boot 时要用的非密钥同步变量(GITEA_URL 等,见
gitea_sync):只走 SSH 前缀到不了 cloud-init 时运行
的 chv-sync boot。两者皆空时不写该条目。
ssh_user:远程 shell 的用户;非 root 时 guest-env 条目
owner 写 "<用户>:<用户>"(0600 不变),否则该用户读
不到文件(V-4);root/未给时仍 root:root。
ssh_user:远程 shell 的用户。guest-env 条目 owner 恒为
root:root(V-9 根因:write_files 在 users-groups 之前跑,
owner 写非 root 用户时该用户尚不存在、整个模块失败),
文件改归 SSH 用户由客内 final 阶段 99-chv-sync.cfg
runcmd 在 chv-sync boot 之前 chown,见
_insert_guest_env_entry 与 chv-guest/build.sh。
user_data_extra / network_config 见 _apply_seed_extras
(客机用户与静态网络的供给,皆空即不写)。"""
os.makedirs(seed_dir, exist_ok=True)
@@ -288,8 +296,7 @@ def write_seed(seed_dir: str, vm_name: str, private_key_text: str,
merged_env = dict(guest_env or {})
merged_env.update(secret_env or {})
if merged_env:
user_data = _insert_guest_env_entry(
user_data, merged_env, ssh_user)
user_data = _insert_guest_env_entry(user_data, merged_env)
user_data = _apply_seed_extras(seed_dir, user_data,
user_data_extra, network_config)
atomic_write_text(user_path, user_data)