PageSourceSearch

https://docs.pantavisor.io/assets/js/edfb3fa6.ba47638b.js

js pantavisor.io collected 2026-10-04 00:20:07 UTC 4,862 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkpantavisor_docs=self.webpackChunkpantavisor_docs||[]).push([["16851"],{56652(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>v,frontMatter:()=>i,contentTitle:()=>o,toc:()=>l,assets:()=>d});var r=JSON.parse('{"id":"pantavisor/overview/revisions","title":"Revisions","description":"The revision as Pantavisor\'s unit of state, and the state JSON that makes it reproducible.","source":"@site/reference_versioned_docs/version-development/pantavisor/overview/revisions.md","sourceDirName":"pantavisor/overview","slug":"/pantavisor/overview/revisions","permalink":"/development/pantavisor/overview/revisions","draft":false,"unlisted":false,"tags":[],"version":"development","sidebarPosition":2,"frontMatter":{"title":"Revisions","sidebar_position":2,"description":"The revision as Pantavisor\'s unit of state, and the state JSON that makes it reproducible."},"sidebar":"pantavisorSidebar","previous":{"title":"Architecture","permalink":"/development/pantavisor/overview/pantavisor-architecture"},"next":{"title":"BSP","permalink":"/development/pantavisor/overview/bsp"}}'),t=s(74848),a=s(28453);let i={title:"Revisions",sidebar_position:2,description:"The revision as Pantavisor's unit of state, and the state JSON that makes it reproducible."},o="Revisions",d={},l=[{value:"Reference",id:"reference",level:2}];function c(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"revisions",children:"Revisions"})}),"\n",(0,t.jsxs)(n.p,{children:["A revision is composed by a ",(0,t.jsx)(n.a,{href:"/development/pantavisor/overview/bsp",children:"BSP"})," (Pantavisor binary, Linux kernel, modules and firmware)\nplus a number of ",(0,t.jsx)(n.a,{href:"/development/pantavisor/overview/containers",children:"containers"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"In order to make revisions reproducible, they are defined in a state JSON. This JSON is a flat\nrepresentation of a set of either binary objects or other inline JSON documents: every key is a\npath, and every value is either the SHA256 of a binary artifact or an inline JSON manifest."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n  "#spec": "pantavisor-service-system@1",\n  "bsp/run.json": { "linux": "kernel.img", "initrd": "pantavisor", "modules": "modules.squashfs" },\n  "bsp/kernel.img": "990f8b0fcab8b99f631497753cc55b70f6f522a1d91cd4ae0777a7747b98509e",\n  "awconnect/run.json": { "#spec": "service-manifest-run@1", "name": "awconnect", "type": "lxc" },\n  "awconnect/root.squashfs": "e1ddabe573021b48dd5d66d59593d94fbc57b7a2f85dac59628959ae6955d2e2"\n}\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The binary artifacts referenced by hash are the ",(0,t.jsx)(n.a,{href:"/development/pantavisor/overview/storage#trails-and-objects",children:"objects"}),"; because\nthey are content-addressed they can be shared between revisions, so an ",(0,t.jsx)(n.a,{href:"/development/pantavisor/overview/updates",children:"update"})," only\ndownloads what actually changed."]}),"\n",(0,t.jsxs)(n.p,{children:["Installed revisions form a trail, which is what makes ",(0,t.jsx)(n.a,{href:"/development/pantavisor/overview/updates#error",children:"rollback"})," possible: the\nprevious revision's state JSON and objects are still on disk, so returning to it is a bootloader\ndecision rather than a download."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"pvcontrol steps ls                 # every revision installed on the device\npvcontrol steps get current        # the running revision's state.json\n"})}),"\n",(0,t.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/development/pantavisor/reference/pantavisor-state-format-v2",children:"State Format"})," \u2014 every root key and manifest, with a ",(0,t.jsx)(n.a,{href:"/development/pantavisor/reference/pantavisor-state-format-v2#10-complete-example",children:"complete example"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"/development/pantavisor/reference/pantavisor-commands#steps",children:"Control Socket \u2192 /steps"})," \u2014 installing and querying revisions"]}),"\n"]})]})}function v(e={}){let{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},28453(e,n,s){s.d(n,{R:()=>i,x:()=>o});var r=s(96540);let t={},a=r.createContext(t);function i(e){let n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),r.createElement(a.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.