挂载外部对象存储(S3 / GCS)
除了托管的 dozycat 持久盘,你还可以把自己的 S3 或 GCS 桶通过 FUSE 挂进 VM——只读或读写,落在你指定的 guest 路径上。
能力概述
每个 cat(microVM)默认有两块盘:持久盘(dozycat,JuiceFS→S3,由我们托管)挂在 /mnt/dozycat,以及临时盘(本地 EBS)挂在 /tmp。在此之上,你可以自带桶(bring-your-own-bucket):把你账户里的 S3 或 GCS 桶挂进 VM,落在任意 guest 路径,比如 /mnt/data。
这条路径完全走 FUSE 协议:宿主机用一个 libfuse 驱动(s3fs / mount-s3 / gcsfuse / rclone / juicefs)把桶挂到宿主目录,再用一台独立的 virtiofsd 通过 virtio-fs 把这个目录暴露给 guest,guest 用 mount -t virtiofs <tag> <target> 落地。与 dozycat 持久盘同一套机制,所以它能挺过冷启动的 reboot+remount——重启时按 boot-spec 重新拉起 virtiofsd,挂载点原样回来。
为什么放在宿主侧(而不是 guest 里)
guest 是一个极小的 initramfs,跑不动 s3fs/gcsfuse 这类带依赖的驱动;而且把云凭证塞进每个 guest 既不安全也难轮换。把 FUSE 驱动留在宿主侧意味着:凭证只在宿主、由平台管理;guest 只看到一个普通的 POSIX 挂载点;同一台宿主上多个 cat 的挂载互相隔离(按 cat_id + mount_id 命名空间)。
用 CLI 挂载
# 把一个 S3 桶只读挂到 /mnt/data(带 key 前缀)
dozycat mount add --db $DB \
--volume-id vol-123 --provider s3 --bucket my-data \
--target /mnt/data --prefix projects/ --region us-east-1
# 一个 GCS 桶(默认驱动 gcsfuse),读写
dozycat mount add --db $DB \
--volume-id vol-123 --provider gcs --bucket my-gcs-bucket \
--target /mnt/gcs --rw --credentials-ref gcs-sa-key
# S3 兼容端点(R2 / MinIO / Ceph):传 --endpoint
dozycat mount add --db $DB \
--volume-id vol-123 --provider s3 --bucket bkt \
--target /mnt/r2 --endpoint https://<acct>.r2.cloudflarestorage.com
dozycat mount ls --db $DB --volume-id vol-123 # 列出
dozycat mount get <mount-id> --db $DB # 详情
dozycat mount rm <mount-id> --db $DB # 卸载(detach)
CLI、HTTP API(POST /api/volumes/<id>/mounts、GET /api/mounts、POST /api/mounts/<id>/detach)和控制面 Web UI 三个入口能力对齐——同一组操作,三处都能做。
参数
| 字段 | 含义 |
|---|---|
provider | s3 或 gcs(S3 兼容端点也用 s3 + --endpoint) |
bucket / prefix | 桶名与可选的 key 前缀(只挂子路径) |
target | guest 内的挂载点;/mnt/dozycat、/tmp、根目录等被平台保留,禁止占用 |
fuse_driver | 不填则按 provider 取默认:s3→s3fs,gcs→gcsfuse |
read_only | 默认只读;--rw 开读写 |
region / endpoint | S3 区域;S3 兼容服务的自定义端点 |
credentials_ref | 宿主侧凭证密钥的名字(绝不存明文);S3 留空则回退到实例角色 |
凭证与安全
我们从不把桶的密钥明文存进 registry——只存一个 credentials_ref(宿主侧密钥的名字)。S3 在 AWS 上可直接用实例角色(iam_role=auto),无需任何静态 key。挂载默认只读,要写显式加 --rw。
dozycat