# Microsandbox + Mirage FUSE Run an untrusted [Microsandbox](https://microsandbox.dev) microVM that reads S3 through a host-side Mirage FUSE mount. Mirage FUSE-mounts S3 on the **host**; Microsandbox bind-mounts that path into the microVM over virtio-fs. The guest reads `/s3` natively, with no S3 credentials and no network of its own. ## How it works ``` microVM guest --virtio-fs /s3--> host FUSE mountpoint --> Mirage --> S3 (msb / libkrun) (fuse3) ``` 1. `microsandbox_fuse.py` (host) FUSE-mounts an `S3Resource` at a temp mountpoint. 1. It boots a microVM with `Volume.bind(, readonly=True)` mapped to `/s3`, so the guest's `/s3` is backed by the host FUSE mount over virtio-fs. 1. `remote/guest.py` runs inside the microVM: it `os.listdir('/s3')` and reads `/s3/data/example.jsonl` as if they were local files. The microVM guest has no `/dev/fuse`, so Mirage can't run in the guest; the host mount is shared in instead. ## Prerequisites - **Microsandbox Python SDK**: `uv pip install microsandbox` (tested with 0.5.10). - **`msb` runtime** (provides libkrunfw): `curl -sSfL https://get.microsandbox.dev | sh`. On Apple Silicon this also pulls the libkrun HVF backend; x86_64 macOS is not supported by Microsandbox. - **Host FUSE**: Linux `fuse3` (see platform note below for macOS). - **AWS credentials** in `.env.development` at the repo root: `AWS_S3_BUCKET`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, and optionally `AWS_DEFAULT_REGION`. - The bucket must contain `data/example.jsonl` (any text/JSONL file works; the guest just counts lines containing `mirage`). The SDK 0.5.10 embeds the runtime in-process, so there is **no separate `msb server` to start** (just run the example). ## Run From the repo root (so `.env.development` loads): ```bash ./python/.venv/bin/python examples/python/runtimes/microsandbox/microsandbox_fuse.py ``` Expected tail: ``` === guest output === --- os.listdir('/s3') --- data ... --- read /s3/data/example.jsonl through virtio-fs -> FUSE -> Mirage -> S3 --- 5766 lines, 5678 containing 'mirage' Mirage served N ops, ... bytes to the sandbox ``` ## Platform note: Linux only This example runs on **Linux**. On **macOS it does not work**: libkrun's virtio-fs cannot re-export a macFUSE-backed directory into the microVM. Booting the VM fails at the bind-mount with: ``` failed to start "mirage-fuse": mount s3_: Operation not permitted (os error 1) ``` This is a libkrun + macFUSE interaction, not a Mirage or Microsandbox bug: - It reproduces with both S3-backed and RAM-backed FUSE mounts (the trigger is the macFUSE filesystem type, not the backend). - A plain (non-FUSE) host directory bind-mounts and reads fine inside the same microVM, so virtio-fs itself works on macOS. - Mounting the FUSE filesystem with `allow_other` does not help; the failure is `EPERM` (not `EACCES`), from a macOS-specific VFS operation libkrun's host-side virtio-fs server issues during share setup that macFUSE rejects. On macOS, use the sibling [`wasmer`](../wasmer/README.md) example instead: it maps the same host FUSE mount into a WASIX guest with `--mapdir` and works on macOS. Not run in CI. It needs the Microsandbox runtime, host FUSE, and live AWS credentials.