Frequently Asked Questions
App Management
How do I remove an app from my device?
Clone the device, remove the container with pvr app rm, commit, and deploy:
pvr clone http://<device-ip>:12368/cgi-bin my-device
cd my-device
pvr app rm my-old-app
pvr add .
pvr commit -m "remove my-old-app"
pvr post http://<device-ip>:12368
Pantavisor stops the container and removes it from the trail on the next boot.
How do I edit an application's configuration?
Container rootfs images (root.squashfs) are read-only. To overlay files on top of them, add files to _config/<container-name>/ in your pvr checkout. The directory structure mirrors where those files live inside the container.
pvr clone http://<device-ip>:12368/cgi-bin my-device
cd my-device
mkdir -p _config/my-app/etc/myapp
# edit _config/my-app/etc/myapp/config.json
pvr add .
pvr commit -m "update my-app config"
pvr post http://<device-ip>:12368
To change Pantavisor-level behaviour (restart policy, auto-recovery, environment variables), edit the container's run.json directly in the checkout directory. See Configure Applications.
How do I update a container to a newer image version?
pvr app update my-app --from myorg/myapp:v2.0.0
pvr add .
pvr commit -m "update my-app to v2.0.0"
pvr post http://<device-ip>:12368
What happens if an OTA update fails?
Pantavisor automatically rolls back to the previous revision if the new one fails to boot or any container does not reach its health goal within the configured timeout. No manual intervention is needed. The previous revision is kept in /trails/ and restored on the next boot.
Connectivity Issues
My device is not showing up on the network.
- Check the Ethernet cable or Wi-Fi credentials.
- From the serial console, verify the device has an IP:
ip addr show eth0 - Scan from your workstation:
pvr device scan - Check the Pantavisor log for DHCP or network container errors:
tail /run/pantavisor/pv/logs/0/pantavisor/pantavisor.log
pvr clone fails with "connection refused".
Pantavisor serves the state API on port 12368. Confirm:
- The device has a network address:
ip addr show - The pvr-sdk (or network) container is running:
lxc-ls -f - You are using the full URL:
pvr clone http://<device-ip>:12368/cgi-bin <dir>
Technical Questions
How does Pantavisor run Docker images?
Pantavisor does not use the Docker runtime. pvr app add --from <image> pulls a Docker Hub image and converts it into an LXC container:
- The image layers are merged into a single SquashFS rootfs (
root.squashfs) - An
lxc.container.confis generated with appropriate mount and namespace settings - An optional
run.jsonis created for Pantavisor-level metadata
The container runs under LXC, not Docker. There is no Docker daemon on the device.
What is the _config/ directory?
_config/<container-name>/ in a pvr checkout is a writable file overlay. Files placed there are layered on top of the container's read-only root.squashfs at runtime — analogous to a bind-mount overlay. The path inside _config/<container-name>/ mirrors the path inside the container.
This lets you add SSH keys, config files, or scripts to a container without rebuilding its SquashFS image.
What is pvr?
pvr (Pantavisor Revision) is a Git-like CLI for managing device state. Core operations:
| Command | What it does |
|---|---|
pvr clone <url> <dir> | Clone a device's current revision to a local directory |
pvr app add --from <image> | Convert a Docker image to a Pantavisor container |
pvr app rm <name> | Remove a container from the local state |
pvr add . | Stage all changes |
pvr commit -m "..." | Record a new local revision |
pvr post http://<device-ip>:12368 | Push the revision to the device |
pvr device scan | Discover Pantavisor devices on the local network |
pvr sig add --part <name> | Sign a container with an X.509 key |
Full reference: pvr CLI.
Why are xconnect, pvcontrol, or rngdaemon missing from my image?
This is almost always caused by using += instead of :append when setting PANTAVISOR_FEATURES in a distro include file. The ??= weak default in pvbase.bbclass is silently overwritten by +=:
# WRONG — drops all defaults including xconnect, pvcontrol, rngdaemon
PANTAVISOR_FEATURES += "appengine"
# CORRECT — preserves defaults and appends
PANTAVISOR_FEATURES:append = " appengine"