Fast Firecracker microVM manager
Project description
BandSox
BandSox is a fast, lightweight Python library and CLI for managing Firecracker microVMs. It provides a simple interface to create, manage, and interact with secure sandboxes, making it easy to run untrusted code or isolate workloads.
Features
- Fast Boot Times: Leverages Firecracker's speed to start VMs in milliseconds.
- Docker Image Support: Create VMs directly from Docker images (requires Python 3 installed in the image).
- Snapshotting: Pause, resume, and snapshot VMs for instant restoration.
- Web Dashboard: Visual interface to manage VMs, snapshots, and view terminal sessions.
- CLI Tool: Comprehensive command-line interface for all operations.
- Python API: Easy-to-use Python library for integration into your own applications.
- File Operations: Upload, download, and manage files within the VM.
- Terminal Access: Interactive web-based terminal for running VMs.
Usage
Quick Start - Hello World
Create a VM and run Python code in just a few seconds:
from bandsox.core import BandSox
bs = BandSox()
vm = bs.create_vm("python:3-alpine", enable_networking=False)
result = vm.exec_python_capture("print('Hello from VM!')")
print(result['stdout']) # Output: Hello from VM!
vm.stop()
Python API
from bandsox.core import BandSox
# Initialize
bs = BandSox()
# Create a VM from a Docker image (which has python preinstalled)
vm = bs.create_vm("python:3-alpine", name="test-vm")
print(f"VM started: {vm.vm_id}")
# Execute a command
exit_code = vm.exec_command("echo Hello World > /root/hello.txt")
# Execute Python code directly in the VM (capture output)
result = vm.exec_python_capture("print('Hello World')")
print(result['stdout']) # Output: Hello World
# Read a file
content = vm.get_file_contents("/root/hello.txt")
print(content) # Output: Hello World
# Stop the VM
vm.stop()
Web UI
Start the web dashboard:
sudo python3 -m bandsox.cli serve --host 0.0.0.0 --port 8000
Visit http://localhost:8000 to access the dashboard.
CLI
BandSox includes a CLI tool bandsox (or python -m bandsox.cli).
Create a VM:
sudo python3 -m bandsox.cli create ubuntu:latest --name my-vm
Open a Terminal:
sudo python3 -m bandsox.cli terminal <vm_id>
Start the Web Dashboard:
sudo python3 -m bandsox.cli serve --host 0.0.0.0 --port 8000
Visit http://localhost:8000 to access the dashboard.
Prerequisites
- Linux system with KVM support (bare metal or nested virtualization).
- Firecracker installed and in your PATH (
/usr/bin/firecracker). - Python 3.8+.
sudoaccess (required for setting up TAP devices for networking).
Installation
-
Clone the repository:
git clone https://github.com/HACKE-RC/Bandsox.git cd bandsox
-
Install dependencies:
pip install -e .
-
Initialize required artifacts (kernel, CNI plugins, optional base rootfs):
# Use a locally-built rootfs (see instructions below) bandsox init --rootfs-url ./bandsox-base.ext4
This downloads:
vmlinux(Firecracker kernel)- CNI plugins (from the official upstream releases, e.g.
https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-amd64-v1.5.1.tgz) intocni/bin/(or your chosen--cni-dir) - (Optional) a base rootfs
.ext4intostorage/images/when--rootfs-urlis provided
Default URLs are provided for kernel and CNI. For the rootfs, build one locally (instructions below) and point
--rootfs-urlto a local path (orfile://URL). Use--skip-*flags to omit specific downloads or--forceto re-download.
Web UI Screenshots
Home Page
Details Page
File browser
The details page has a file browser which you can use to explore the files inside the VM.
Markdown viewer
Markdown files have a view button next to them, which opens a markdown viewer
Terminal
The webui has a terminal which can be accessed by clicking on the terminal button
Architecture
BandSox consists of several components:
- Core (
bandsox.core): High-level manager for VMs and snapshots. - VM (
bandsox.vm): Wrapper around the Firecracker process, handling configuration, network, and interaction. - Agent (
bandsox.agent): A lightweight Python agent injected into the VM to handle command execution and file operations. - Server (
bandsox.server): FastAPI-based backend for the web dashboard.
Docs & APIs
- Full library, CLI, and HTTP endpoint reference:
API_DOCUMENTATION.md - REST base path:
http://<host>:<port>/api(see docs for endpoints such as/api/vms,/api/snapshots,/api/vms/{id}/terminalWebSocket)
Building a local base rootfs (no hosting required)
Build a minimal ext4 from a Docker image and keep it local:
IMG=alpine:latest # pick a base image with python if needed
OUT=bandsox-base.ext4
SIZE_MB=512 # increase for more disk
TMP=$(mktemp -d)
docker pull "$IMG"
CID=$(docker create "$IMG")
docker export "$CID" -o "$TMP/rootfs.tar"
docker rm "$CID"
dd if=/dev/zero of="$OUT" bs=1M count=$SIZE_MB
mkfs.ext4 -F "$OUT"
mkdir -p "$TMP/mnt"
sudo mount -o loop "$OUT" "$TMP/mnt"
sudo tar -xf "$TMP/rootfs.tar" -C "$TMP/mnt"
cat <<'EOF' | sudo tee "$TMP/mnt/init" >/dev/null
#!/bin/sh
export PATH=/usr/local/bin:/usr/bin:/bin:/sbin
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
P=$(command -v python3 || command -v python)
[ -z "$P" ] && exec /usr/local/bin/agent.py
exec "$P" /usr/local/bin/agent.py
EOF
sudo chmod +x "$TMP/mnt/init"
sudo mkdir -p "$TMP/mnt/usr/local/bin"
sudo cp bandsox/agent.py "$TMP/mnt/usr/local/bin/agent.py"
sudo chmod 755 "$TMP/mnt/usr/local/bin/agent.py"
sudo umount "$TMP/mnt"
sudo e2fsck -fy "$OUT"
sudo resize2fs -M "$OUT" # optional: shrink to minimum
rm -rf "$TMP"
Use it locally with bandsox init --rootfs-url ./bandsox-base.ext4 (or file://$PWD/bandsox-base.ext4).
Alternative: skip providing a base rootfs entirely—BandSox can build per-image rootfs on demand from Docker images when you call bandsox create <image>.
Storage & Artifacts
- Large artifacts (ext4 rootfs images, snapshots,
vmlinux, CNI binaries) are not tracked in git;bandsox initdownloads them intostorage/andcni/bin/(or a directory you pass via--cni-dirpointing at the official CNI release tarball). - Default storage path is
/var/lib/sandbox; override withBANDSOX_STORAGEor--storagewhen running the server. - To pre-seed a base rootfs, build it locally and reference it via
--rootfs-url file://...; otherwise, create VMs from Docker images on demand (no prebuilt rootfs needed).
Verification & Testing
The verification/ directory contains scripts to verify various functionalities:
verify_bandsox.py: General smoke test.verify_file_ops.py: Tests file upload/download.verify_internet.py: Tests network connectivity inside the VM.
To run a verification script:
sudo python3 verification/verify_bandsox.py
License
Apache License 2.0
Note: This project wasn't supposed to be made public so it may have artifacts which make no sense. Please open issues so I can remove them.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bandsox-0.6.0.tar.gz.
File metadata
- Download URL: bandsox-0.6.0.tar.gz
- Upload date:
- Size: 29.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5beca4fb0b905dd583076fa833cedbb1e0ac8afbd35553eb85f4e1559034d03
|
|
| MD5 |
07f901a57296f59b992e6fd8bb246633
|
|
| BLAKE2b-256 |
9214ecfe4386955f572a7017ea893e563c77eeec3b04ca8c5cb0e429962953f0
|
File details
Details for the file bandsox-0.6.0-py3-none-any.whl.
File metadata
- Download URL: bandsox-0.6.0-py3-none-any.whl
- Upload date:
- Size: 35.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aad5e225b1b2bbdb234e79dd47542153bf07c215ca55a7b659dd5d580295b391
|
|
| MD5 |
e032a99f27809a8be2112ca2e4a68b77
|
|
| BLAKE2b-256 |
483a0db9bda95e989ef42938bd564109ce151e577c4de297b0a2a1986fcc075d
|