diff --git a/chv-guest/build.sh b/chv-guest/build.sh index 7a00e81..6719d81 100755 --- a/chv-guest/build.sh +++ b/chv-guest/build.sh @@ -105,7 +105,7 @@ if [ "$DRY_RUN" = "0" ]; then echo "CHV_GUEST_BUILD needs a KVM host: /dev/kvm 不存在" >&2 exit 1 fi - for tool in curl qemu-img virt-customize virt-get-kernel python3 virt-cat; do + for tool in curl qemu-img virt-customize virt-get-kernel python3 virt-cat sgdisk guestfish; do if ! command -v "$tool" >/dev/null 2>&1; then echo "缺少构建工具:$tool,构建失败" >&2 exit 1 @@ -148,6 +148,24 @@ else fi fi run qemu-img convert -f qcow2 -O raw "$IMG" "$OUT/disk.raw" +# B-16:云镜像根分区只有 ~2.4G,apt 全量清单(texlive + +# Playwright --with-deps + Chromium + CJK 字体)会写满根分区 +# (No space left on device,首轮真机构建实测)。先扩盘: +# qemu-img resize 扩文件;sgdisk 把 1 号分区尾移到磁盘末尾 +# (只动 1 号分区,14/15/16 不动);guestfish resize2fs 扩 +# 文件系统。注意不能用 virt-resize:它会重写分区表、把根分区 +# 从 1 号重编号为 4 号,而执行器默认 cmdline 是 root=/dev/vda1, +# 重编号后无法启动。根分区起始扇区从 sgdisk -i 1 实测取,不写死。 +if [ "$DRY_RUN" = "0" ]; then + run qemu-img resize "$OUT/disk.raw" +12G + run sgdisk -e "$OUT/disk.raw" + ROOT_START="$(sgdisk -i 1 "$OUT/disk.raw" | awk '/^First sector:/ {print $3}')" + [ -n "$ROOT_START" ] || { echo "读不到根分区起始扇区" >&2; exit 1; } + run sgdisk -d 1 -n "1:${ROOT_START}:0" -t 1:8300 "$OUT/disk.raw" + run guestfish -a "$OUT/disk.raw" -m /dev/sda1 resize2fs /dev/sda1 +else + echo "DRY-RUN: qemu-img resize $OUT/disk.raw +12G; sgdisk 扩 1 号分区; guestfish resize2fs /dev/sda1" +fi # 清单软件(照抄 cloud/docker/Dockerfile 的 apt/pip 清单, # 中文 LaTeX xelatex 故意不装,见 README;fonts-noto-cjk 只 # 是浏览器渲染用的中文字体,不是 LaTeX。Playwright 默认开启