pepita (MicroVM) Adapter
The PepitaAdapter manages daemons in lightweight microVMs via the pepita VMM.
Features
- MicroVM lifecycle management via
pepitaCLI - Vsock communication for host-guest IPC
- KVM-based virtualization
- Memory isolation per daemon
- Fast startup times
Usage
#![allow(unused)] fn main() { use duende_core::adapters::PepitaAdapter; use duende_core::types::Signal; // Default adapter let adapter = PepitaAdapter::new(); // With custom vsock port let adapter = PepitaAdapter::with_vsock_port(9000); // With kernel and rootfs images let adapter = PepitaAdapter::with_images( "/boot/vmlinuz", "/var/lib/pepita/rootfs.img" ); // Spawn daemon in microVM let handle = adapter.spawn(Box::new(my_daemon)).await?; println!("VM ID: {}", handle.pepita_vm_id().unwrap()); println!("Vsock CID: {}", handle.vsock_cid().unwrap()); // Check status let status = adapter.status(&handle).await?; // Send signal adapter.signal(&handle, Signal::Term).await?; // Destroy VM adapter.destroy(handle.pepita_vm_id().unwrap()).await?; }
How It Works
- Spawn:
- Allocates vsock CID
- Runs
pepita run --kernel <path> --rootfs <path> --vsock-cid <cid> --name duende-vm-<name>
- Signal: Runs
pepita signal --name <vm_id> --signal <sig> - Status: Runs
pepita status --name <vm_id> --json - Destroy: Runs
pepita destroy --name <vm_id> --force
Architecture
Host MicroVM
┌─────────────────┐ ┌─────────────────┐
│ PepitaAdapter │ │ pepita guest │
│ ┌───────────┐ │ vsock │ ┌───────────┐ │
│ │ VmManager ├──┼──────────┼──┤ DaemonCtl │ │
│ └───────────┘ │ │ └───────────┘ │
└─────────────────┘ └─────────────────┘
Verification
# List duende VMs
pepita list | grep duende-vm
# Check specific VM
pepita status --name duende-vm-my-daemon
# View VM logs
pepita logs --name duende-vm-my-daemon
Requirements
- Linux with KVM support (
/dev/kvm) - pepita VMM installed
- Kernel and rootfs images configured
pepitaCLI in PATH
Platform Detection
The adapter is selected when:
- Running inside a pepita microVM
PEPITA_VSOCK_CIDenvironment variable set
#![allow(unused)] fn main() { use duende_core::platform::detect_platform; use duende_core::adapters::select_adapter; let platform = detect_platform(); // Returns Platform::PepitaMicroVM let adapter = select_adapter(platform); // Returns PepitaAdapter }
Configuration
[platform.pepita]
vcpus = 2
memory_mb = 256
kernel_path = "/boot/vmlinuz"
rootfs_path = "/var/lib/pepita/rootfs.ext4"
vsock_base_port = 5000