PageSourceSearch

https://docs.pantavisor.io/assets/js/b970e56e.39c8613b.js

js pantavisor.io collected 2026-10-04 00:15:58 UTC 10,937 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkpantavisor_docs=self.webpackChunkpantavisor_docs||[]).push([["10261"],{23887(e,n,i){i.r(n),i.d(n,{metadata:()=>t,default:()=>h,frontMatter:()=>o,contentTitle:()=>a,toc:()=>c,assets:()=>l});var t=JSON.parse('{"id":"pantavisor/overview/pantavisor-architecture","title":"Architecture","description":"High-level system design: container orchestration, cloud and local communication, service mesh, and the state machine.","source":"@site/reference_versioned_docs/version-development/pantavisor/overview/pantavisor-architecture.md","sourceDirName":"pantavisor/overview","slug":"/pantavisor/overview/pantavisor-architecture","permalink":"/development/pantavisor/overview/pantavisor-architecture","draft":false,"unlisted":false,"tags":[],"version":"development","sidebarPosition":1,"frontMatter":{"title":"Architecture","sidebar_position":1,"description":"High-level system design: container orchestration, cloud and local communication, service mesh, and the state machine."},"sidebar":"pantavisorSidebar","previous":{"title":"Technical Overview","permalink":"/development/pantavisor/overview/"},"next":{"title":"Revisions","permalink":"/development/pantavisor/overview/revisions"}}'),r=i(74848),s=i(28453);let o={title:"Architecture",sidebar_position:1,description:"High-level system design: container orchestration, cloud and local communication, service mesh, and the state machine."},a="Pantavisor Architecture",l={},c=[{value:"Container Orchestration",id:"container-orchestration",level:2},{value:"Communication with the Outside World",id:"communication-with-the-outside-world",level:2},{value:"Customisation",id:"customisation",level:2},{value:"Service Mesh",id:"service-mesh",level:2},{value:"State Machine",id:"state-machine",level:2},{value:"Reference",id:"reference",level:2}];function d(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"pantavisor-architecture",children:"Pantavisor Architecture"})}),"\n",(0,r.jsx)(n.p,{children:"At a high level, Pantavisor is just in charge of two things: container orchestration and communication with the outside world."}),"\n",(0,r.jsx)(n.h2,{id:"container-orchestration",children:"Container Orchestration"}),"\n",(0,r.jsxs)(n.p,{children:["The software that is running in a Pantavisor-enabled device at a certain moment is called a ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/revisions",children:"revision"}),". A revision is composed by a ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/bsp",children:"BSP"})," and a number of ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/containers",children:"containers"}),". Pantavisor is able to go from the current running revision to a new revision in a ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/updates",children:"transactional manner"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Revisions, as well as other relevant data, are ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/storage",children:"stored"})," on-disk in the device to make them persistent."]}),"\n",(0,r.jsx)(n.h2,{id:"communication-with-the-outside-world",children:"Communication with the Outside World"}),"\n",(0,r.jsxs)(n.p,{children:["Pantavisor-enabled devices need to communicate with the outside world to consume new ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/updates",children:"updates"}),", exchange ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/storage#metadata",children:"metadata"})," or send ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/storage#logs",children:"logs"}),". Users can achieve this ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/remote-control",children:"remotely"})," as well as ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/local-control",children:"locally"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"customisation",children:"Customisation"}),"\n",(0,r.jsxs)(n.p,{children:["Pantavisor can be set up in different ways, offering ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/pantav
1isor-configuration-levels",children:"multi-level configuration"})," as well as several ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/init-mode",children:"operational init modes"}),". System behaviour can also be extended through ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/hooks",children:"system hooks"}),": executable scripts that Pantavisor runs at well-defined ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/hooks#hook-points",children:"lifecycle points"})," \u2014 such as system start, update installation, and platform ready \u2014 allowing operators to integrate custom logic into the system lifecycle."]}),"\n",(0,r.jsx)(n.h2,{id:"service-mesh",children:"Service Mesh"}),"\n",(0,r.jsxs)(n.p,{children:["Containers running in the same revision can communicate with each other through ",(0,r.jsx)(n.code,{children:"pv-xconnect"}),", Pantavisor's built-in service mesh. It handles service discovery and resource injection (Unix sockets, D-Bus, DRM, Wayland) between containers in a secure and declarative way. See ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/xconnect",children:"xconnect"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"state-machine",children:"State Machine"}),"\n",(0,r.jsx)(n.p,{children:"To get a very simplified view on how Pantavisor works, you can take a look at its state machine:"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:i(28728).A+"",width:"1815",height:"785"})}),"\n",(0,r.jsx)(n.p,{children:"Each state can be summarized as:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"INIT"}),":\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Prepare the base rootfs"}),"\n",(0,r.jsxs)(n.li,{children:["Prepare ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/storage",children:"persistent storage"})]}),"\n",(0,r.jsxs)(n.li,{children:["Parse ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/pantavisor-configuration-levels",children:"configuration"})]}),"\n",(0,r.jsxs)(n.li,{children:["Choose ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/init-mode",children:"init mode"})]}),"\n",(0,r.jsxs)(n.li,{children:["Initialize interaction with ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/bsp#bootloader",children:"bootloader"})]}),"\n",(0,r.jsxs)(n.li,{children:["Initialize ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/storage#logs",children:"log system"})]}),"\n",(0,r.jsxs)(n.li,{children:["Initialize ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/local-control",children:"control socket"})]}),"\n",(0,r.jsxs)(n.li,{children:["Initialize ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/watchdog",children:"watchdog"})]}),"\n",(0,r.jsxs)(n.li,{children:["Run ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/hooks#hook-points",children:"system-start hooks"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"RUN"}),":\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Initialize the running ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/revisions",children:"revision"})]}),"\n",(0,r.jsxs)(n.li,{children:["Check ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/storage#artifact-checksum",children:"object checksum"})]}),"\n",(0,r.jsxs)(n.li,{children:["Check ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/storage#state-signature",children:"revision signatures"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"WAIT"}),":\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Start ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/containers",children:"containers"})," and check its ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/containers#status",children:"statuses"})]}),"\n",(0,r.jsxs)(n.li,{children:["Run ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/hooks#hook-points",children:"system-done hooks"})," once all containers have met their ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/containers#status-goal",children:"status goal"})]}),"\n",(0,r.jsxs)(n.li,{children:["Manage any ongoing ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/updates",children:"update"}),", including installation, verification, transition, etc."]}),"\n",(0,r.jsxs)(n.li,{children:["Run ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/hooks#hook-points",children:"update hooks"})," (",(0,r.jsx)(n.code,{children:"system-before-install-update"})," / ",(0,r.jsx)(n.code,{children:"system-after-install-update"})," or ",(0,r.jsx)(n.code,{children:"system-install-update"}),") during update installation"]}),"\n",(0,r.jsxs)(n.li,{children:["Run ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/hooks#hook-points",children:"system-boot-done hooks"})," after committing a successful try-boot"]}),"\n",(0,r.jsxs)(n.li,{children:["Run ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/remote-control#state-machine",children:"Pantacor Hub client full state machine"})]}),"\n",(0,r.jsxs)(n.li,{children:["Process ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/local-control",children:"control socket"})," requests"]}),"\n",(0,r.jsxs)(n.li,{children:["Manage ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/storage#metadata",children:"metadata"})]}),"\n",(0,r.jsxs)(n.li,{children:["Check and run ",(0,r.jsx)(n.a,{href:"/development/pantavisor/overview/storage#garbage-collector",children:"garbage collector"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/development/pantavisor/reference/",children:"Reference index"})," \u2014 every specification, grouped by kind"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/development/pantavisor/reference/pantavisor-configuration",children:"Configuration"})," \u2014 every key that shapes the behaviour described here"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/development/pantavisor/reference/pantavisor-commands",children:"Control Socket"})," \u2014 the API the WAIT state serves"]}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28728(e,n,i){i.d(n,{A:()=>t});let t=i.p+"assets/images/state-pv-0c972de3fb1c4baad5659c32ba593909.png"},28453(e,n,i){i.d(n,{R:()=>o,x:()=>a});var t=i(96540);let r={},s=t.createContext(r);function o(e){let n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(s.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.