Quick Start
This guide assumes you have already installed IOWarp. In a few minutes you will start the CLIO Runtime, mount the IOWarp filesystem on your machine, write files to it with ordinary tools, and watch what happens in the runtime's dashboard.
1. Activate Your Environment
- Pip
- Conda
- Docker
- Spack
No activation needed -- the clio_run CLI and Python modules are
available once the package is installed in your Python environment.
conda activate iowarp
If you are using Docker, the environment is already set up inside the container. Exec into a running container:
docker exec -it iowarp bash
spack load iowarp
Verify the environment is active:
clio_run --help
2. Start the Runtime
clio_run start &
That is the whole deployment. The default ~/.clio/clio.yaml seeded at
install time brings up everything the filesystem needs on this node:
- a DRAM block device (80% of system memory by default) and a 10 GB
persistent disk tier at
~/.clio/cte_disk_tier.dat - the Context Transfer Engine core with its interposition chain (cache → indexer → replication → core), plus the Context Assimilation Engine
- the filesystem pool (
clio_cte_filesystem) that the FUSE mount in the next step drives — paths become CTE tags, file contents become 1 MiB page blobs, and every page rides the chain - the web dashboard on http://127.0.0.1:8080
Confirm it is up:
clio_run monitor --once
or open the dashboard in a browser. Nothing here needs to be composed by hand; every layer is optional and can be trimmed later — see the shipped default in the Configuration Reference.
3. Mount the Filesystem
The FUSE adapter (clio_cte_fuse) presents the runtime's filesystem pool as
an ordinary directory. It attaches as a client to the runtime you just
started, so set CLIO_WITH_RUNTIME=0 — without it the adapter would spin up
a private runtime of its own and nothing you write would be visible to
anyone else.
- Linux
- macOS
- Windows
Needs the distro's FUSE 3 runtime (sudo apt install fuse3 /
sudo dnf install fuse3). In a second terminal:
mkdir -p ~/cte-mnt
CLIO_WITH_RUNTIME=0 clio_cte_fuse ~/cte-mnt -f
Needs macFUSE (brew install --cask macfuse,
then approve the kernel extension in System Settings → Privacy & Security
and reboot). The macOS wheel does not include the adapter, so build it with
the release-mac-fuse preset first — see
FUSE Adapter → Installation. In a
second terminal:
mkdir -p ~/cte-mnt
CLIO_WITH_RUNTIME=0 clio_cte_fuse ~/cte-mnt -f
Needs WinFsp. Pick a free drive letter; in a second PowerShell window:
$env:CLIO_WITH_RUNTIME = "0"
clio_cte_fuse Z: -f
Give it a moment, then confirm with Test-Path Z:\.
-f keeps the adapter in the foreground so you can see what it is doing;
omit it to run it as a daemon. Everything about the mount — other
mountpoints, the FSKit backend on macOS, mounting at a directory on Windows,
libfuse options — is in the FUSE Adapter guide.
4. Use It
Any program can now read and write files on the mount with standard tools; nothing is IOWarp-specific.
- Linux
- macOS
- Windows
echo "Hello, IOWarp!" > ~/cte-mnt/greeting.txt
mkdir -p ~/cte-mnt/data
cp dataset.csv ~/cte-mnt/data/
cat ~/cte-mnt/greeting.txt
ls -l ~/cte-mnt/
echo "Hello, IOWarp!" > ~/cte-mnt/greeting.txt
mkdir -p ~/cte-mnt/data
cp dataset.csv ~/cte-mnt/data/
cat ~/cte-mnt/greeting.txt
ls -l ~/cte-mnt/
Set-Content -Path Z:\greeting.txt -Value "Hello, IOWarp!"
New-Item -ItemType Directory -Path Z:\data -Force | Out-Null
Copy-Item dataset.csv Z:\data\
Get-Content Z:\greeting.txt
Get-ChildItem Z:\
Explorer, cmd.exe, and anything else that takes a path work against Z:
too.
5. Watch It in the Dashboard
Open http://127.0.0.1:8080. While files land on the mount:
- Cluster shows this node's CPU and memory and the workers' processed task count climbing.
- Pools lists every pool the runtime composed. Click
clio_cte_coreto see the storage targets your writes are landing on, or theclio_bdevcard to watch the DRAM device's capacity and statistics. - Config shows the settings the daemon actually came up with.
Take the Dashboard tour for the rest, including creating pools from the browser.
6. Stop
Unmount, then stop the runtime:
- Linux
- macOS
- Windows
fusermount3 -u ~/cte-mnt # or Ctrl-C in the clio_cte_fuse terminal
clio_run stop
umount ~/cte-mnt # or Ctrl-C in the clio_cte_fuse terminal
clio_run stop
Stop-Process -Name clio_cte_fuse -Force # or Ctrl-C in the clio_cte_fuse window
clio_run stop
Files on the DRAM tier are gone when the runtime stops; the persistent disk
tier and its metadata log under ~/.clio/ survive a restart.
7. Optional: Assimilate Data from Python
The filesystem is one door into IOWarp. The Context Exploration Engine (CEE) is another: it lets you assimilate data into IOWarp, query for it by name or regex, retrieve it, and clean up -- all from Python.
Save the following as cee_quickstart.py:
#!/usr/bin/env python3
"""IOWarp CEE Quickstart -- assimilate, query, retrieve, destroy."""
import os
import tempfile
import clio_cee as cee
# -- 1. Create a sample file -------------------------------------------
data = b"Hello from IOWarp! " * 50_000 # ~950 KB
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".bin")
tmp.write(data)
tmp.close()
print(f"Created test file: {tmp.name} ({len(data):,} bytes)")
# -- 2. Initialise the CEE interface -----------------------------------
# ContextInterface connects to the running CLIO Runtime.
iface = cee.ContextInterface()
# -- 3. Bundle (assimilate) the file -----------------------------------
tag = "quickstart_demo"
ctx = cee.AssimilationCtx(
src=f"file::{tmp.name}", # source: local file (note :: not ://)
dst=f"iowarp::{tag}", # destination tag in IOWarp
format="binary", # raw binary ingest
)
rc = iface.context_bundle([ctx])
assert rc == 0, f"context_bundle failed (rc={rc})"
print(f"Assimilated file into tag '{tag}'")
# -- 4. Query for blobs in the tag -------------------------------------
blobs = iface.context_query(tag, ".*", 0) # regex ".*" matches all blobs
print(f"Found {len(blobs)} blob(s): {blobs}")
# -- 5. Retrieve the data back -----------------------------------------
packed = iface.context_retrieve(tag, ".*", 0)
if packed:
print(f"Retrieved {len(packed[0]):,} bytes")
# -- 6. Destroy the tag ------------------------------------------------
iface.context_destroy([tag])
print(f"Destroyed tag '{tag}'")
# -- Cleanup ------------------------------------------------------------
os.unlink(tmp.name)
print("Done!")
Run it against a running runtime (clio_run start & again if you stopped it above):
python3 cee_quickstart.py
Expected output:
Created test file: /tmp/tmpXXXXXXXX.bin (950,000 bytes)
Assimilated file into tag 'quickstart_demo'
Found 2 blob(s): ['chunk_0', 'description']
Retrieved 950,029 bytes
Destroyed tag 'quickstart_demo'
Done!
8. Key Environment Variables
| Variable | Description |
|---|---|
CLIO_SERVER_CONF | Path to YAML configuration file (highest priority) |
CLIO_IPC_MODE | Force a transport: SHM, IPC (Unix socket), or TCP. Unset (the default) auto-probes for the fastest usable one in that order. |
CLIO_PORT | Override the RPC port (default: 9413). Takes priority over YAML config. |
CLIO_SERVER_ADDR | Address clients dial to reach the runtime (default: 127.0.0.1). |
CLIO_BIND_ADDR | Address the runtime's listeners bind to (default: 0.0.0.0). |
CLIO_EPHEMERAL | 1 starts the runtime bare — the compose section is skipped. |
CLIO_WITH_RUNTIME | 0 makes a client (such as clio_cte_fuse) attach to the running daemon instead of embedding its own runtime. |
CLIO_VIZ_PORT / CLIO_VIZ_BIND / CLIO_VIZ_ENABLE | Dashboard port (default 8080), bind address (default 127.0.0.1), and on/off. |
CLIO_CTE_POOL | Bind the CTE client to an interposing pool, e.g. 563.0 for the chain top. |
CTP_LOG_LEVEL | Logging verbosity: debug, info, success, warning, error, fatal |
CTP_LOG_OUT | Also write log output to this file. |
See the Configuration Reference for the full list.
Next Steps
- Dashboard -- tour the runtime's web dashboard and create pools from the browser
- FUSE Adapter -- every mount option, platform notes, and troubleshooting
- Edit
~/.clio/clio.yamlto tune thread counts, storage tiers, or add file-backed block devices - Configuration Reference -- full parameter documentation
- HPC Deployment -- multi-node cluster setup
- CLIO Kit -- MCP servers for AI-powered scientific computing
- SDK Reference -- component APIs and development guides
- Deprecation Notes -- legacy CLI / env / config names that still work as aliases
Support
- Open an issue on the GitHub repository
- Join the Zulip Chat
- Visit the IOWarp website
- Email: grc@illinoistech.edu