On this page:
The POWDER Manual
2025-09-26 (8165ad6)

The POWDER Manual

The Powder Team

Powder is a facility for experimenting on the future of wireless networking in a city-scale "living laboratory" environment. It was one of the first two platforms funded by the Platforms for Advanced Wireless Research program at the National Science Foundation (NSF), receiving support from NSF grants CNS-1827940 and CNS-2346555.

Powder is developed, deployed, and operated by the University of Utah, in partnership with the RENEW team at Rice University.

The Powder facility is built on top of Emulab and is run by the Flux Research Group, part of the Kahlert School of Computing at the University of Utah.

    1 Powder Overview

      1.1 What is Powder

      1.2 Powder status

      1.3 Roadmap to using Powder

    2 Getting Started

      2.1 Next Steps

    3 Powder starter profiles

    4 Powder Users

      4.1 Register for an Account

        4.1.1 Join an existing project

        4.1.2 Create a new project

        4.1.3 Setting up SSH access

        4.1.4 Setting up X11

    5 Powder and Repeatable Research

    6 Basic Concepts

      6.1 Profiles

      6.2 Experiments

        6.2.1 Reserving Resources for Experiments

        6.2.2 Extending Experiments

      6.3 Projects

      6.4 Physical Resources

      6.5 Virtual Machines

    7 Creating Profiles

      7.1 Creating a profile from an existing one

        7.1.1 Copying a Profile

        7.1.2 Creating the Profile

        7.1.3 Updating a profile

      7.2 Capturing Disk Images for Profiles

      7.3 Repository-Based Profiles

        7.3.1 Updating Repository-Based Profiles

        7.3.2 Branches and Tags in Repository-Based Profiles

      7.4 Sharing Profiles

      7.5 Versioned Profiles

    8 Spectrum use

      8.1 Radio monitoring

        8.1.1 Conducted RF

        8.1.2 Radiated RF

        8.1.3 Massive MIMO

    9 Resource Reservations

      9.1 What Reservations Guarantee

      9.2 How Reservations May Affect You

      9.3 Making a Reservation

      9.4 Using a Reservation

      9.5 Who Shares Access to Reservations

    10 Using Powder: From simulation, to emulation, to over-the-air

      10.1 Simulated RF Experimentation

      10.2 Conducted RF Environment

      10.3 Using the Indoor Over-The-Air Lab

      10.4 Outdoor Over-The-Air Environment

        10.4.1 Step-by-step walkthrough

        10.4.2 Some Important Notes

      10.5 Next Steps

    11 Describing a profile with python and geni-lib

      11.1 A single XEN VM node

      11.2 A single physical host

      11.3 Two XenVM nodes with a link between them

      11.4 Two ARM64 servers in a LAN

      11.5 A VM with a custom size

      11.6 Set a specific IP address on each node

      11.7 RF communication

      11.8 Specify an operating system and set install and execute scripts

      11.9 Profiles with user-specified parameters

      11.10 Add storage to a node

      11.11 Debugging geni-lib profile scripts

    12 Storage Mechanisms

      12.1 Overview of Storage Mechanisms

      12.2 Node-Local Storage

        12.2.1 Specifying Storage in a Profile – Local Datasets

        12.2.2 Allocating Storage in a Running Experiment

        12.2.3 Persisting Local Data

      12.3 Image-backed Datasets

      12.4 Remote Datasets

      12.5 NFS Shared Filesystems

      12.6 Write-back Storage for Fixed and Mobile Endpoints

      12.7 High-performance Storage for Streaming Data

        12.7.1 Using CephFS in an Experiment

        12.7.2 Limitations and Guidelines for CephFS Usage.

      12.8 Storage Type Summary (TL;DR)

      12.9 Example Storage Profiles

        12.9.1 Creating a Node-local Dataset

        12.9.2 Creating an Image-backed Dataset from a Node-local Dataset

        12.9.3 Using and Updating an Image-backed Dataset

        12.9.4 Creating a Remote Dataset

        12.9.5 Using a Remote Dataset on a Single Node

        12.9.6 Using a Remote Dataset on Multiple Nodes via a Shared Filesystem

        12.9.7 Using a Remote Dataset on Multiple Nodes via Clones

    13 The Control Network

      13.1 Overview

      13.2 Ensuring your experiment nodes use the correct interfaces

        13.2.1 Common causes of control network misuse

        13.2.2 Empirically verifying interface use

      13.3 What to do if you get a Control Network Violation email

      13.4 Why is it so important to avoid the control network?

      13.5 When can I use the control network?

    14 Advanced Topics

      14.1 Disk Images

      14.2 RSpecs

      14.3 Public IP Access

        14.3.1 Dynamic Public IP Addresses

      14.4 Markdown

      14.5 Introspection

        14.5.1 Client ID

        14.5.2 Control MAC

        14.5.3 Manifest

        14.5.4 Private key

        14.5.5 Profile parameters

      14.6 User-controlled switches and layer-1 topologies

      14.7 Portal API

    15 Virtual Machines

      15.1 Xen VMs

        15.1.1 Controlling CPU and Memory

        15.1.2 Controlling Disk Space

        15.1.3 Setting HVM Mode

        15.1.4 Dedicated and Shared VMs

    16 Automating Experiment Configuration

      16.1 Configuration Management: Ansible

      16.2 Ansible in Profiles: geni-lib extensions

      16.3 Bootstrapping Ansible in Experiments

      16.4 Using Ansible in Experiments

        16.4.1 Per-experiment Ansible Facts

        16.4.2 emulab-common Ansible Roles

        16.4.3 Using emulab-common Roles

      16.5 Example: OpenZMS profile

      16.6 Example: Kubernetes profile

      16.7 Example: workflow-manager profile

    17 Hardware and Wireless Environments

      17.1 Conducted attenuator matrix resources

      17.2 Paired Radio workbench resources

      17.3 Indoor OTA lab resources

      17.4 Rooftop Base-station resources

      17.5 Dense-deployment Base-station resources

      17.6 Fixed-endpoint resources

      17.7 Mobile-endpoint resources

      17.8 Near-edge computing resources

      17.9 Cloud computing resources

    18 Powder basic srsLTE Tutorial

      18.1 Objectives

      18.2 Prerequisites

      18.3 Logging In

      18.4 Creating a simple srsLTE experiment

      18.5 Exploring Your Experiment

        18.5.1 Experiment Status

        18.5.2 Profile Instructions

        18.5.3 Topology View

        18.5.4 List View

        18.5.5 Manifest View

        18.5.6 Graphs View

        18.5.7 Actions

        18.5.8 Web-based Shell

      18.6 Using the srsLTE tools

      18.7 Digging deeper

      18.8 Terminating the Experiment

      18.9 Taking Next Steps

    19 Powder OAI Tutorial

      19.1 Objectives

      19.2 Prerequisites

      19.3 Logging In

      19.4 Building Your Own OAI Network

      19.5 Exploring Your Experiment

        19.5.1 Experiment Status

        19.5.2 Profile Instructions

        19.5.3 Topology View

        19.5.4 List View

        19.5.5 Manifest View

        19.5.6 Graphs View

        19.5.7 Actions

        19.5.8 Web-based Shell

      19.6 Starting OAI Services

      19.7 Connecting the UE

      19.8 In-Depth OAI Profile Documentation

      19.9 Terminating the Experiment

      19.10 Taking Next Steps

    20 Powder OpenStack Tutorial

      20.1 Objectives

      20.2 Prerequisites

      20.3 Logging In

      20.4 Building Your Own OpenStack Cloud

      20.5 Exploring Your Experiment

        20.5.1 Experiment Status

        20.5.2 Profile Instructions

        20.5.3 Topology View

        20.5.4 List View

        20.5.5 Manifest View

        20.5.6 Graphs View

        20.5.7 Actions

        20.5.8 Web-based Shell

        20.5.9 Serial Console

      20.6 Bringing up Instances in OpenStack

      20.7 Administering OpenStack

        20.7.1 Log Into The Control Nodes

        20.7.2 Reboot the Compute Node

      20.8 Terminating the Experiment

      20.9 Taking Next Steps

    21 Citing Powder

    22 Getting Help