feat(chv-guest): 阶段 1 数据盘独立持久(客内挂载)
- 新增 chv-guest/chv-data-mount.sh:按 LABEL=CHVDATA 找盘 (不依赖 /dev/vd? 固定名;seed ISO 与根盘排除),无 fs 即 mkfs.ext4 -L CHVDATA,挂到 /home/chv/workspace,幂等; 无数据盘即静默退出 0(copy 模式旧 VM 不报错)。 - build.sh:缺脚本即失败(与 chv-sync.sh 同款门);拷入 镜像 /usr/local/bin/chv-data-mount;99-chv-sync.cfg runcmd 在 chv-sync boot 之前调它(工作区先挂好再 clone)。 - buildinfo.py BASE_CONTENTS 与两 lockfile DECLARED_SOURCES 登记 chv-data-mount(repo_commit,随 P2 三脚本先例)。 - tests:test_chv_opt_stage1.DataMountScriptTest(脚本内容、 构建接线、lockfile 登记);P2 干跑夹具补新文件。 回归:discover test_chv_*.py 与 test_cloud_hypervisor.py 全过。 不推、不合、不部署;只本地分支。
This commit is contained in:
1 parent
7a6fae7993
commit
a5f836e9fd
7 files changed
+118
-2
No files matched your search
+10
-1
@@ -172,6 +172,13 @@ if [ ! -f "$SCRIPT_DIR/chv-sync.sh" ]; then
|
||||
echo "缺少 chv-sync.sh(Gitea 双向同步脚本):$SCRIPT_DIR" >&2
|
||||
exit 1
|
||||
fi
|
||||
# feat-chv-opt-landing(阶段 1):数据盘挂载脚本缺失即失败
|
||||
#(与 chv-sync.sh 同款门:构建产物须含它,否则工作区落回
|
||||
# 系统盘、"独立持久" 只剩文档声称)。
|
||||
if [ ! -f "$SCRIPT_DIR/chv-data-mount.sh" ]; then
|
||||
echo "缺少 chv-data-mount.sh(数据盘挂载脚本):$SCRIPT_DIR" >&2
|
||||
exit 1
|
||||
fi
|
||||
# 对齐 Muse P2:单元启动器 / broker / 浏览器子代理三脚本缺一即失败。
|
||||
for p2_script in chv-cell.py chv-broker.py chv-browser.py; do
|
||||
if [ ! -f "$SCRIPT_DIR/$p2_script" ]; then
|
||||
@@ -281,11 +288,13 @@ VC_ARGS=(-a "$OUT/disk.raw"
|
||||
--run-command 'mkdir -p /app/work && chmod 1777 /app/work && test -d /app/work && [ "$(stat -c %a /app/work)" = "1777" ]'
|
||||
--copy-in "$SCRIPT_DIR/chv-sync.sh:/usr/local/bin/"
|
||||
--run-command 'mv /usr/local/bin/chv-sync.sh /usr/local/bin/chv-sync && chmod +x /usr/local/bin/chv-sync'
|
||||
--copy-in "$SCRIPT_DIR/chv-data-mount.sh:/usr/local/bin/"
|
||||
--run-command 'mv /usr/local/bin/chv-data-mount.sh /usr/local/bin/chv-data-mount && chmod +x /usr/local/bin/chv-data-mount'
|
||||
--copy-in "$SCRIPT_DIR/chv-cell.py:/usr/local/bin/"
|
||||
--copy-in "$SCRIPT_DIR/chv-broker.py:/usr/local/bin/"
|
||||
--copy-in "$SCRIPT_DIR/chv-browser.py:/usr/local/bin/"
|
||||
--run-command 'mv /usr/local/bin/chv-cell.py /usr/local/bin/chv-cell && mv /usr/local/bin/chv-broker.py /usr/local/bin/chv-broker && mv /usr/local/bin/chv-browser.py /usr/local/bin/chv-browser && chmod +x /usr/local/bin/chv-cell /usr/local/bin/chv-broker /usr/local/bin/chv-browser'
|
||||
--run-command 'printf "runcmd:\n - systemctl restart ssh || service ssh restart || true\n - test -f /etc/chv/guest-env && chown chv:chv /etc/chv/guest-env || true\n - /usr/local/bin/chv-sync boot >>/var/log/chv-sync.log 2>&1 || true\n" > /etc/cloud/cloud.cfg.d/99-chv-sync.cfg'
|
||||
--run-command 'printf "runcmd:\n - systemctl restart ssh || service ssh restart || true\n - test -f /etc/chv/guest-env && chown chv:chv /etc/chv/guest-env || true\n - /usr/local/bin/chv-data-mount >>/var/log/chv-data-mount.log 2>&1 || true\n - /usr/local/bin/chv-sync boot >>/var/log/chv-sync.log 2>&1 || true\n" > /etc/cloud/cloud.cfg.d/99-chv-sync.cfg'
|
||||
--run-command 'git config --system user.name chv && git config --system user.email chv@localhost && git config --system credential.helper store && git config --system init.defaultBranch main'
|
||||
--run-command "$GT_INSTALL_CMD"
|
||||
--run-command '/usr/local/bin/gt version > /app/guest-versions-gt.txt'
|
||||
|
||||
@@ -39,6 +39,8 @@ BASE_CONTENTS = [
|
||||
"/app/host.py", "gt", "chv-sync",
|
||||
# 对齐 Muse P2:nspawn 单元启动器 + broker + 浏览器子代理。
|
||||
"systemd-container", "chv-cell", "chv-broker", "chv-browser",
|
||||
# feat-chv-opt-landing(阶段 1):数据盘挂载脚本。
|
||||
"chv-data-mount",
|
||||
]
|
||||
|
||||
# 执行器默认内核 cmdline(config.py),构建产物须与它一起记录(B-12),
|
||||
|
||||
@@ -30,6 +30,9 @@ DECLARED_SOURCES = {
|
||||
"chv-cell": "repo_commit",
|
||||
"chv-broker": "repo_commit",
|
||||
"chv-browser": "repo_commit",
|
||||
# feat-chv-opt-landing(阶段 1):数据盘挂载脚本,版本随
|
||||
# repo_commit(与 chv-sync 同款)。
|
||||
"chv-data-mount": "repo_commit",
|
||||
}
|
||||
|
||||
|
||||
|
||||
Executable
+48
@@ -0,0 +1,48 @@
|
||||
#!/bin/sh
|
||||
# chv-data-mount:把数据盘(LABEL=CHVDATA)挂到 /home/chv/workspace。
|
||||
#
|
||||
# 由镜像 99-chv-sync.cfg runcmd 在 chv-sync boot 之前调(final 阶段,
|
||||
# 用户 chv 已存在,可 chown)。幂等:已挂载即返回;已有 CHVDATA
|
||||
# 标签的盘即直接挂;无数据盘(copy 模式旧 VM 没有第三块盘)即
|
||||
# 静默退出 0,不报错、不挡启动。
|
||||
#
|
||||
# 找盘不依赖 /dev/vd? 固定名:先按 LABEL 找;找不到则在所有整盘里
|
||||
# 找一块无文件系统、不是根盘的盘——seed ISO 有 iso9660,不会被选
|
||||
# 中;根盘本身无 fs,但按持有 / 分区的盘排除;分区(/dev/vda1 等)
|
||||
# 不参与(glob 只取整盘名)。
|
||||
#
|
||||
# 阶段 1(feat-chv-opt-landing):工作区与浏览器 profile 的载体从
|
||||
# 系统盘 overlay 里剥离出来,独立持久;快照只登记系统盘 overlay,
|
||||
# 数据盘不进快照(见 cloud/chv/disk.py)。
|
||||
set -u
|
||||
MOUNT=/home/chv/workspace
|
||||
LABEL=CHVDATA
|
||||
|
||||
log() { echo "chv-data-mount: $*"; }
|
||||
|
||||
mountpoint -q "$MOUNT" 2>/dev/null && { log "already mounted"; exit 0; }
|
||||
|
||||
DEV=$(blkid -L "$LABEL" 2>/dev/null || true)
|
||||
if [ -z "$DEV" ]; then
|
||||
ROOT_SRC=$(findmnt -n -o SOURCE / 2>/dev/null || echo "")
|
||||
ROOT_DISK=$(printf '%s' "$ROOT_SRC" | sed -e 's/p[0-9]*$//' -e 's/[0-9]*$//')
|
||||
for d in /dev/vd[a-z] /dev/sd[a-z] /dev/xvd[a-z]; do
|
||||
[ -b "$d" ] || continue
|
||||
[ "$d" = "$ROOT_DISK" ] && continue
|
||||
TYPE=$(blkid -o value -s TYPE "$d" 2>/dev/null || echo none)
|
||||
[ "$TYPE" = "none" ] || continue
|
||||
DEV=$d
|
||||
break
|
||||
done
|
||||
fi
|
||||
|
||||
[ -n "$DEV" ] || { log "no data disk found, skip"; exit 0; }
|
||||
if [ "$(blkid -o value -s LABEL "$DEV" 2>/dev/null || echo "")" != "$LABEL" ]; then
|
||||
log "formatting $DEV as $LABEL"
|
||||
mkfs.ext4 -L "$LABEL" "$DEV" || { log "mkfs failed on $DEV"; exit 0; }
|
||||
fi
|
||||
mkdir -p "$MOUNT"
|
||||
mount "LABEL=$LABEL" "$MOUNT" || { log "mount failed"; exit 0; }
|
||||
chown chv:chv "$MOUNT" || true
|
||||
log "mounted $DEV -> $MOUNT"
|
||||
exit 0
|
||||
@@ -51,6 +51,9 @@ DECLARED_SOURCES = {
|
||||
"chv-cell": "repo_commit",
|
||||
"chv-broker": "repo_commit",
|
||||
"chv-browser": "repo_commit",
|
||||
# feat-chv-opt-landing(阶段 1):数据盘挂载脚本,版本随
|
||||
# repo_commit(与 chv-sync 同款)。
|
||||
"chv-data-mount": "repo_commit",
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user