#!/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 # feat-chv-opt-landing(阶段 3):浏览器持久 profile 落数据盘。 # chv-browser 以 chv-browser 身份跑,工作区根属 chv、它写不进; # 此处以 root 预建 profile 目录并定好属主与 0700,服务重启后 # 同一 profile 即登录态跨恢复保留。数据盘不在时浏览器服务 # 自己回落 /var/lib/chv-browser/profile(见 chv-browser.py)。 mkdir -p "$MOUNT/.chv-browser-profile" || true chown chv-browser:chv-browser "$MOUNT/.chv-browser-profile" 2>/dev/null || true chmod 0700 "$MOUNT/.chv-browser-profile" 2>/dev/null || true # feat-chv-opt-landing(阶段 5):具名会话的 storage-state 落 # 数据盘 .chv-browser-sessions/<会话>/storage-state.json。工作区 # 根属 chv,chv-browser 自己建不进子目录,此处以 root 预建并 # 定好属主与 0700;浏览器服务自己建目录失败时只记 # storage_saved=false,不谎报 open/close 成功。 mkdir -p "$MOUNT/.chv-browser-sessions" || true chown chv-browser:chv-browser "$MOUNT/.chv-browser-sessions" 2>/dev/null || true chmod 0700 "$MOUNT/.chv-browser-sessions" 2>/dev/null || true # 阶段 3 live 实证(2026-11-08,构建 #8 驱动):/home/chv 默认 # 0750 chv:chv,chv-browser 穿不过家目录去够数据盘 profile—— # ismount 判假、profile 静默回落本机盘(服务本身不报错)。 # 放到 0751:只放行穿过(+x),不放行列表(无 r), # chv-browser 能进已知子目录,看不见家目录内容。 chmod 0751 /home/chv 2>/dev/null || true log "mounted $DEV -> $MOUNT" exit 0