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:
host committed 2026-11-08 09:45:00 +00:00
1 parent 7a6fae7993
commit a5f836e9fd
7 files changed
+118 -2

No files matched your search

+48
View File
@@ -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