Skip to content

[Bug Report] 临时目录空间不足导致模版构建失败 #240

@woshihoujinxin

Description

@woshihoujinxin

Issue: 临时目录空间不足导致模版构建失败

问题描述

CubeSandbox 在从 OCI 镜像创建模版时,模版创建进度卡在 UNPACKING 20% 左右,最终超时失败。

环境信息

  • 磁盘布局:
    • 根分区 /dev/vda2: 50G,系统占用后仅剩 ~5G 空闲
    • 数据分区 /dev/vdb: 200G,挂载至 /data/cubelet,有 ~150G 空闲

根本原因

1. 临时工作目录默认在根分区

CubeSandbox (cubemaster) 在创建模版时需要大量临时空间用于:

  • 镜像解压
  • rootfs 构建
  • ext4 文件系统创建

默认情况下,临时工作目录 CUBEMASTER_ROOTFS_ARTIFACT_DIR/tmp/cubemaster-rootfs-artifacts/,位于根分区。

2. 空间需求

对于一个 1.6GB 的 OCI 镜像,模版创建过程大约需要 8-10GB 的临时空间:

  • 镜像层解压
  • 中间文件
  • ext4 镜像构建

根分区仅剩 5GB 空间,无法满足需求。

解决方案

修改启动脚本 /usr/local/services/cubetoolbox/scripts/one-click/up.sh

添加 CUBEMASTER_ROOTFS_ARTIFACT_DIR 环境变量,将临时工作目录指向大分区:

# 新增:临时工作目录配置
CUBEMASTER_ROOTFS_ARTIFACT_DIR_DEFAULT="/data/cubelet/tmp/cubemaster-rootfs-artifacts"
CUBEMASTER_ROOTFS_ARTIFACT_DIR_CONFIGURED="${CUBEMASTER_ROOTFS_ARTIFACT_DIR:-}"
CUBEMASTER_ROOTFS_ARTIFACT_DIR="${CUBEMASTER_ROOTFS_ARTIFACT_DIR_CONFIGURED:-${CUBEMASTER_ROOTFS_ARTIFACT_DIR_DEFAULT}}"

# 配置临时工作目录(大分区)
if [[ -n "${CUBEMASTER_ROOTFS_ARTIFACT_DIR_CONFIGURED}" ]]; then
  mkdir -p "${CUBEMASTER_ROOTFS_ARTIFACT_DIR}"
  CUBEMASTER_ARTIFACT_DIR_EXPORT="export CUBEMASTER_ROOTFS_ARTIFACT_DIR=\"${CUBEMASTER_ROOTFS_ARTIFACT_DIR}\";"
elif mkdir -p "${CUBEMASTER_ROOTFS_ARTIFACT_DIR}" >/dev/null 2>&1; then
  CUBEMASTER_ARTIFACT_DIR_EXPORT="export CUBEMASTER_ROOTFS_ARTIFACT_DIR=\"${CUBEMASTER_ROOTFS_ARTIFACT_DIR}\";"
else
  log "cubemaster artifact work dir ${CUBEMASTER_ROOTFS_ARTIFACT_DIR} unavailable, using /tmp fallback"
fi

# 启动时传递环境变量
start_with_pidfile \
  "cubemaster" \
  "export CUBE_MASTER_CONFIG_PATH=\"${CUBEMASTER_CFG}\"; ${CUBEMASTER_ARTIFACT_STORE_EXPORT} ${CUBEMASTER_ARTIFACT_DIR_EXPORT} \"${CUBEMASTER_BIN}\""

环境变量说明

变量 用途 默认值 建议值
CUBEMASTER_ROOTFS_ARTIFACT_DIR 临时工作目录 /tmp/cubemaster-rootfs-artifacts /data/cubelet/tmp/cubemaster-rootfs-artifacts
CUBEMASTER_ROOTFS_ARTIFACT_STORE_DIR 最终存储目录 /data/CubeMaster/storage /data/CubeMaster/storage

建议改进

  1. 文档更新: 在部署文档中明确说明磁盘空间要求,建议根分区至少保留 20GB 空闲空间

  2. 默认配置优化: 建议官方安装脚本/配置默认将临时目录设置到大分区

  3. 空间检查: 在模版创建前检查临时目录可用空间,不足时提前报错而非卡住

  4. 清理机制: 添加失败模版的临时文件自动清理机制

验证方法

# 1. 检查环境变量是否生效
cat /proc/<cubemaster-pid>/environ | tr '\0' '\n' | grep CUBEMASTER_ROOTFS_ARTIFACT_DIR

# 2. 监控临时目录使用情况
watch -n 5 'du -sh /data/cubelet/tmp/cubemaster-rootfs-artifacts/*'

# 3. 检查模版创建进度
cubemastercli tpl ls

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions