From 8013431f6348b22e5c53de3d229894a8ab51fb3a Mon Sep 17 00:00:00 2001 From: host Date: Sat, 7 Nov 2026 11:41:15 +0000 Subject: [PATCH] =?UTF-8?q?fix(chv):=20=E9=98=B6=E6=AE=B5=202=20syncd=20?= =?UTF-8?q?=E5=86=99=E8=B7=AF=E5=BE=84=E6=94=B9=E5=88=B0=20chv=20=E6=89=80?= =?UTF-8?q?=E6=9C=89=E7=9A=84=20/run/chv/syncd/=20=E5=AD=90=E7=9B=AE?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /run/chv 是 0755 root:root,chv 身份的 syncd 写不进状态文件 与 socket,_atomic_write 抛错致进程反复退出、systemctl 长期 activating(2026-11-07 真机实测)。socket 与状态文件改到 tmpfiles 预建的 /run/chv/syncd/(0755 chv:chv,与 chv-browser 的 shots 同款);daemon 的 sync 摘要读同一路径;驱动的 syncd socket 路径与 ls 检查同步更新;另修驱动 SSH poller 线程残留(daemon=True + wake 失败也 set 事件)。 --- chv-guest/build.sh | 2 +- chv-guest/chv-daemon.py | 6 +++++- chv-guest/chv-syncd.py | 4 ++-- cloud/tests/test_chv_opt_stage2.py | 15 +++++++++++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/chv-guest/build.sh b/chv-guest/build.sh index ccf9398..86dce9f 100755 --- a/chv-guest/build.sh +++ b/chv-guest/build.sh @@ -319,7 +319,7 @@ VC_ARGS=(-a "$OUT/disk.raw" --run-command 'printf "[Unit]\nDescription=CHV guest runtime daemon (stage 2: heartbeat/resources/snapshot)\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/usr/bin/python3 /usr/local/bin/chv-daemon\nRestart=always\nRestartSec=2\n\n[Install]\nWantedBy=multi-user.target\n" > /etc/systemd/system/chv-daemon.service' --run-command 'printf "[Unit]\nDescription=CHV guest exec daemon (stage 2: shell/files/codex hosting)\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/usr/bin/python3 /usr/local/bin/chv-execd\nRestart=always\nRestartSec=2\n\n[Install]\nWantedBy=multi-user.target\n" > /etc/systemd/system/chv-execd.service' --run-command 'printf "[Unit]\nDescription=CHV Gitea sync daemon (stage 2: resident pull/push loop)\nAfter=network.target\n\n[Service]\nType=simple\nUser=chv\nGroup=chv\nExecStart=/usr/bin/python3 /usr/local/bin/chv-syncd\nRestart=always\nRestartSec=2\n\n[Install]\nWantedBy=multi-user.target\n" > /etc/systemd/system/chv-syncd.service' - --run-command 'printf "d /run/chv 0755 root root -\nd /run/chv/shots 0755 chv-browser chv-browser -\nd /run/chv/tasks 0755 root root -\n" > /etc/tmpfiles.d/chv.conf && systemctl enable chv-broker chv-browser chv-daemon chv-execd chv-syncd || true') + --run-command 'printf "d /run/chv 0755 root root -\nd /run/chv/shots 0755 chv-browser chv-browser -\nd /run/chv/tasks 0755 root root -\nd /run/chv/syncd 0755 chv chv -\n" > /etc/tmpfiles.d/chv.conf && systemctl enable chv-broker chv-browser chv-daemon chv-execd chv-syncd || true') # P1 交接(Muse P1 的 vsock_notify.py):文件在仓库里存在时拷入 # 镜像(P1 分支才有,本分支尚无);不存在时只警告、不失败—— # 合并后自动生效,P2 不改该脚本内容。 diff --git a/chv-guest/chv-daemon.py b/chv-guest/chv-daemon.py index 9435515..96b216a 100644 --- a/chv-guest/chv-daemon.py +++ b/chv-guest/chv-daemon.py @@ -41,7 +41,11 @@ DAEMON_SOCK = "/run/chv/daemon.sock" SNAPSHOT_READY_PATH = "/run/chv/snapshot-ready.json" EXECD_SOCK = "/run/chv/execd.sock" EXECD_TASKS = "/run/chv/execd-tasks.json" -SYNC_STATUS = "/run/chv/sync-status.json" +# syncd 的状态文件在它自己的 chv 所有子目录里(见 build.sh +# tmpfiles:/run/chv 本身 0755 root:root,chv 身份的 syncd +# 写不进——2026-11-07 真机实测:状态文件写失败致 syncd +# 反复退出、systemctl 长期 activating)。 +SYNC_STATUS = "/run/chv/syncd/sync-status.json" WORKSPACE = "/home/chv/workspace" HEARTBEAT_INTERVAL = 10.0 MAX_REQUEST_BYTES = 65536 diff --git a/chv-guest/chv-syncd.py b/chv-guest/chv-syncd.py index 9555f2a..0e2165b 100644 --- a/chv-guest/chv-syncd.py +++ b/chv-guest/chv-syncd.py @@ -30,8 +30,8 @@ import sys import threading import time -SYNC_SOCK = "/run/chv/syncd.sock" -STATUS_PATH = "/run/chv/sync-status.json" +SYNC_SOCK = "/run/chv/syncd/syncd.sock" +STATUS_PATH = "/run/chv/syncd/sync-status.json" WORKSPACE = "/home/chv/workspace" SYNC_BIN = "/usr/local/bin/chv-sync" DEFAULT_INTERVAL = 300.0 diff --git a/cloud/tests/test_chv_opt_stage2.py b/cloud/tests/test_chv_opt_stage2.py index a4f073f..43f8cc4 100644 --- a/cloud/tests/test_chv_opt_stage2.py +++ b/cloud/tests/test_chv_opt_stage2.py @@ -289,6 +289,21 @@ class SyncdTest(unittest.TestCase): os.makedirs(os.path.join(path, ".git"), exist_ok=True) return path + def test_syncd_paths_under_chv_owned_subdir(self): + # 2026-11-07 真机教训:/run/chv 是 0755 root:root, + # chv 身份的 syncd 写不进状态文件与 socket,反复退出、 + # systemctl 长期 activating。socket 与状态文件须在 + # chv 所有的 /run/chv/syncd/ 子目录里。 + self.assertTrue(self.mod.SYNC_SOCK.startswith( + "/run/chv/syncd/")) + self.assertTrue(self.mod.STATUS_PATH.startswith( + "/run/chv/syncd/")) + daemon = _load_guest_script("chv-daemon.py") + self.assertEqual(daemon.SYNC_STATUS, self.mod.STATUS_PATH) + with open(_repo("chv-guest", "build.sh")) as fh: + text = fh.read() + self.assertIn("d /run/chv/syncd 0755 chv chv -", text) + def test_resolve_repo_zero_one_many(self): repo, reason = self.mod.resolve_repo(self.mod.WORKSPACE) self.assertIsNone(repo)