"""Cloud Hypervisor 每任务磁盘供给(叶子模块)。 单任务单 VM 的文件系统独立性就靠这里:copy 模式每任务 复制一份基础镜像,两个任务绝不写同一文件;reuse 模式 直接返回基础镜像路径(仅单租户实验,生产禁用,见 CloudHypervisorExecutor 的类 docstring)。 """ import os import shutil from cloud.chv.errors import ChvFailure def check_disk_quota(rootfs, disk_gb): """磁盘配额门:CHV_DISK_GB 已设且基础镜像超过该 GB 数 即拒绝(kind=disk_quota_exceeded)。未设则不检查; 镜像读不到时不拦(preflight 自会报 image_missing, 这里不抢它的错)。""" if disk_gb is None or not rootfs: return try: size = os.path.getsize(rootfs) except OSError: return if size > disk_gb * 1024 ** 3: raise ChvFailure( "disk_quota_exceeded", "磁盘镜像 %d 字节超过配额 %.1f GB" % (size, disk_gb)) def provision_task_disk(state_dir, vm_name, rootfs, disk_mode): """每任务磁盘路径:copy 模式复制到 state_dir//disk.raw(已存在则复用,不重复复制); reuse 模式直接返回基础镜像路径。""" if disk_mode == "reuse": return rootfs task_dir = os.path.join(state_dir, vm_name) os.makedirs(task_dir, exist_ok=True) task_disk = os.path.join(task_dir, "disk.raw") if not os.path.exists(task_disk): shutil.copyfile(rootfs, task_disk) return task_disk