PageSourceSearch

https://docs.pantavisor.io/assets/js/98d3ef62.d2089ccb.js

js pantavisor.io collected 2026-10-04 00:18:45 UTC 13,408 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkpantavisor_docs=self.webpackChunkpantavisor_docs||[]).push([["14559"],{43186(e,n,r){r.r(n),r.d(n,{metadata:()=>t,default:()=>h,frontMatter:()=>o,contentTitle:()=>i,toc:()=>d,assets:()=>a});var t=JSON.parse('{"id":"pantavisor/reference/pantavisor-tools","title":"Pantavisor Tools","description":"On-device CLI tools shipped with Pantavisor for development, debugging, and container control.","source":"@site/reference_versioned_docs/version-028-rc10.1/pantavisor/reference/pantavisor-tools.md","sourceDirName":"pantavisor/reference","slug":"/pantavisor/reference/pantavisor-tools","permalink":"/028-rc10.1/pantavisor/reference/pantavisor-tools","draft":false,"unlisted":false,"tags":[],"version":"028-rc10.1","frontMatter":{},"sidebar":"pantavisorSidebar","previous":{"title":"Pantavisor State Format (state.json)","permalink":"/028-rc10.1/pantavisor/reference/pantavisor-state-format-v2"},"next":{"title":"Pantavisor xconnect","permalink":"/028-rc10.1/pantavisor/reference/pantavisor-xconnect"}}'),s=r(74848),c=r(28453);let o={},i="Pantavisor Tools",a={},d=[{value:"pventer",id:"pventer",level:2},{value:"pvcurl",id:"pvcurl",level:2},{value:"pvcontrol",id:"pvcontrol",level:2},{value:"Key commands",id:"key-commands",level:3},{value:"pvtx",id:"pvtx",level:2},{value:"Transaction commands",id:"transaction-commands",level:3},{value:"Queue commands",id:"queue-commands",level:3},{value:"Environment variables",id:"environment-variables",level:3}];function l(e){let n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,c.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"pantavisor-tools",children:"Pantavisor Tools"})}),"\n",(0,s.jsx)(n.p,{children:"On-device CLI tools shipped with Pantavisor for development, debugging, and container control."}),"\n",(0,s.jsx)(n.h2,{id:"pventer",children:"pventer"}),"\n",(0,s.jsx)(n.p,{children:"Enter a running container's namespaces."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pventer -c <container-name> [CMD ...]\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Without a command, drops into the container's default shell. With a command, executes it inside the container's namespace. Uses ",(0,s.jsx)(n.code,{children:"fallbear-cmd"})," under the hood via LXC paths."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# Drop into a shell inside the container\npventer -c my-app\n\n# Run a command inside the container\npventer -c my-app ps aux\n"})}),"\n",(0,s.jsx)(n.h2,{id:"pvcurl",children:"pvcurl"}),"\n",(0,s.jsxs)(n.p,{children:["Lightweight HTTP client for the Pantavisor control socket. Drop-in replacement for ",(0,s.jsx)(n.code,{children:"curl"})," in environments where curl is not available. Uses ",(0,s.jsx)(n.code,{children:"nc"})," to send HTTP/1.0 requests over a Unix socket."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pvcurl --unix-socket <socket-path> [OPTIONS] <endpoint>\n"})}),"\n",(0,s.jsx)(n.p,{children:"Socket paths (tried in order by pvcontrol):"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"/run/pantavisor/pv/pv-ctrl"})," \u2014 appengine / embedded mode"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"/pv/pv-ctrl"})," \u2014 alternative embedded path"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"/pantavisor/pv-ctrl"})," \u2014 default inside containers"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'# Query buildinfo\npvcurl --unix-socket /run/pantavisor/pv/pv-ctrl /buildinfo\n\n# List running daemons\npvcurl --unix-socket /run/pantavisor/pv/pv-ctrl /daemons\n\n# Send a signal to a container\npvcurl -X PUT --unix-socket /run/pantavisor/pv/pv-ctrl /signal \\\n    --data \'{"name":"my-app","signal":15}\'\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Supports ",(0,s.jsx)(n.code,{children:"-X"}),", ",(0,s.jsx)(n.code,{children:"-H"}),", ",(0,s.jsx)(n.code,{children:"--data"}),", ",(0,s.jsx)(n.code,{children:"--upload-file"}),", ",(0,s.jsx)(n.code,{children:"-s"}),", ",(0,s.jsx)(n.code,{children:"-i"}),", ",(0,s.jsx)(n.code,{children:"-v"}),", ",(0,s.jsx)(n.code,{children:"-o"}),", ",(0,s.jsx)(n.code,{children:"-w"}),", ",(0,s.jsx)(n.code,{children:"--connect-timeout"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"pvcontrol",children:"pvcontrol"}),"\n",(0,s.jsxs)(n.p,{children:["Shell wrapper around ",(0,s.jsx)(n.code,{children:"pvcurl"})," for common control operations. Prefers ",(0,s.jsx)(n.code,{children:"curl"})," if available, falls back to ",(0,s.jsx)(n.code,{children:"pvcurl"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pvcontrol [-s <socket-path>] <command> [arguments]\n"})}),"\n",(0,s.jsx)(n.h3,{id:"key-commands",children:"Key commands"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# Container and group status\npvcontrol ls                         # list containers in current revision\npvcontrol containers ls              # list containers with status\npvcontrol containers start <name>\npvcontrol containers stop <name>\npvcontrol containers restart <name>\npvcontrol groups ls                  # list container groups\n\n# xconnect service mesh\npvcontrol graph ls                   # show current xconnect service graph\n\n# Daemon status (REST API daemons)\npvcontrol daemons ls                 # list managed daemons\npvcontrol daemons get <name>\n\n# Status signals (sent by a container to signal readiness)\npvcontrol signal ready               # signal container is ready\npvcontrol signal alive               # signal container is alive (watchdog)\n\n# System commands\npvcontrol cmd reboot [message]\npvcontrol cmd poweroff [message]\npvcontrol cmd run-gc                 # trigger garbage collection\npvcontrol cmd enable-ssh             # start SSH server until next reboot\n\n# Metadata\npvcontrol devmeta ls\npvcontrol devmeta save <key> <value>\npvcontrol usrmeta ls\n\n# Build info\npvcontrol buildinfo\n"})}),"\n",(0,s.jsx)(n.h2,{id:"pvtx",children:"pvtx"}),"\n",(0,s.jsx)(n.p,{children:"Transaction tool for creating, modifying, and deploying Pantavisor system state revisions. Operates on JSON state documents that describe the desired system configuration (services, BSP, configs), with atomic commit and rollback via the pv-ctrl daemon."}),"\n",(0,s.jsx)(n.h3,{id:"transaction-commands",children:"Transaction commands"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pvtx begin <base> [object]\npvtx add <file> | -\npvtx remove <part>\npvtx abort\npvtx commit\npvtx show\npvtx deploy <directory>\n"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Command"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"begin <base> [object]"})}),(0,s.jsxs)(n.td,{children:["Start a new transaction. ",(0,s.jsx)(n.code,{children:"base"})," is a revision hash, ",(0,s.jsx)(n.code,{children:"current"}),", or ",(0,s.jsx)(n.code,{children:"empty"}),". Omit ",(0,s.jsx)(n.code,{children:"object"})," for a remote transaction (synced via pv-ctrl); provide a path for a local transaction written to disk."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"add <file> | -"})}),(0,s.jsxs)(n.td,{children:["Add a JSON or tarball (",(0,s.jsx)(n.code,{children:".json"}),", ",(0,s.jsx)(n.code,{children:".tar"}),", ",(0,s.jsx)(n.code,{children:".tar.gz"}),", ",(0,s.jsx)(n.code,{children:".tgz"}),", ",(0,s.jsx)(n.code,{children:".bz2"}),") to the current transaction. Use ",(0,s.jsx)(n.code,{children:"-"})," to read from stdin."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"remove <part>"})}),(0,s.jsxs)(n.td,{children:["Remove a part from the revision. ",(0,s.jsx)(n.code,{children:"part"})," can be a name (",(0,s.jsx)(n.code,{children:"nginx"}),"), a signature path (",(0,s.jsx)(n.code,{children:"_sigs/nginx.json"}),"), or a config path (",(0,s.jsx)(n.code,{children:"_config/nginx"}),")."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"abort"})}),(0,s.jsx)(n.td,{children:"Discard the current transaction and clean up state."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"commit"})}),(0,s.jsx)(n.td,{children:"Commit a remote transaction to pv-ctrl; prints the new revision hash."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"show"})}),(0,s.jsx)(n.td,{children:"Print the current transaction state as JSON to stdout."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"deploy <directory>"})}),(0,s.jsxs)(n.td,{children:["Write a local transaction to disk (creates ",(0,s.jsx)(n.code,{children:".pvr/json"}),", ",(0,s.jsx)(n.code,{children:".pvr/config"}),", ",(0,s.jsx)(n.code,{children:"bsp/run.json"}),")."]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"queue-commands",children:"Queue commands"}),"\n",(0,s.jsx)(n.p,{children:"Queue mode builds an ordered sequence of operations, then applies them as a single transaction."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pvtx queue new <queue> <object>\npvtx queue remove <part>\npvtx queue unpack <tarball> | -\npvtx queue process [base] [queue] [object]\n"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Command"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"queue new <queue> <object>"})}),(0,s.jsxs)(n.td,{children:["Initialize a new queue at ",(0,s.jsx)(n.code,{children:"<queue>"}),", saving objects at ",(0,s.jsx)(n.code,{children:"<object>"}),"."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"queue remove <part>"})}),(0,s.jsxs)(n.td,{children:["Enqueue a remove operation for ",(0,s.jsx)(n.code,{children:"<part>"}),"."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"queue unpack <tarball> | -"})}),(0,s.jsx)(n.td,{children:"Enqueue an unpack step for the given tarball (or stdin)."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"queue process [base] [queue] [object]"})}),(0,s.jsxs)(n.td,{children:["Execute the queue against ",(0,s.jsx)(n.code,{children:"base"})," revision (",(0,s.jsx)(n.code,{children:"current"})," by default)."]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"environment-variables",children:"Environment variables"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Variable"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"PVTXDIR"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"/var/pvr-sdk/pvtx"})}),(0,s.jsx)(n.td,{children:"Temp directory for transaction state"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"PVTX_OBJECT_BUF_SIZE"})}),(0,s.jsx)(n.td,{children:"\u2014"}),(0,s.jsx)(n.td,{children:"Buffer size for saving objects (512B\u201310M)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"PVTX_CTRL_BUF_SIZE"})}),(0,s.jsx)(n.td,{children:"\u2014"}),(0,s.jsx)(n.td,{children:"Buffer size for pv-ctrl I/O (16K\u201310M)"})]})]})]}),"\n",(0,s.jsxs)(n.p,{children:["Socket paths (auto-detected): ",(0,s.jsx)(n.code,{children:"/pv/pv-ctrl"})," (container root) or ",(0,s.jsx)(n.code,{children:"/pantavisor/pv-ctrl"}
1)," (inside containers)."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# Remote transaction: modify current revision and commit\npvtx begin current\npvtx add /path/to/package.tar.gz\npvtx remove nginx\npvtx show\npvtx commit\n\n# Local transaction: build a state on disk\npvtx begin empty /tmp/objects\ncat package.tgz | pvtx add -\npvtx deploy /deploy/path\n\n# Queue-based workflow: batch operations, then apply\npvtx queue new /tmp/queue /tmp/objects\npvtx queue remove nginx\npvtx queue unpack /path/to/package.tgz\npvtx begin empty\npvtx queue process\npvtx show\n"})})]})}function h(e={}){let{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},28453(e,n,r){r.d(n,{R:()=>o,x:()=>i});var t=r(96540);let s={},c=t.createContext(s);function o(e){let n=t.useContext(c);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.