1"use strict";(self.webpackChunkpantavisor_docs=self.webpackChunkpantavisor_docs||[]).push([["1064"],{56334(e,n,t){t.r(n),t.d(n,{metadata:()=>i,default:()=>h,frontMatter:()=>r,contentTitle:()=>o,toc:()=>d,assets:()=>l});var i=JSON.parse('{"id":"meta-pantavisor/getting-started/benchmarks/vs-buildroot","title":"Pantavisor vs Buildroot","description":"Buildroot is great at building minimal monolithic images; Pantavisor adds composable containers, atomic OTA, and fleet management. They solve different problems \u2014 and can be combined.","source":"@site/reference_versioned_docs/version-029-rc4/meta-pantavisor/getting-started/benchmarks/vs-buildroot.md","sourceDirName":"meta-pantavisor/getting-started/benchmarks","slug":"/meta-pantavisor/getting-started/benchmarks/vs-buildroot","permalink":"/029-rc4/meta-pantavisor/getting-started/benchmarks/vs-buildroot","draft":false,"unlisted":false,"tags":[],"version":"029-rc4","sidebarPosition":3,"frontMatter":{"title":"Pantavisor vs Buildroot","sidebar_position":3,"description":"Buildroot is great at building minimal monolithic images; Pantavisor adds composable containers, atomic OTA, and fleet management. They solve different problems \u2014 and can be combined."},"sidebar":"metaPantavisorGettingStartedSidebar","previous":{"title":"Pantavisor vs Balena","permalink":"/029-rc4/meta-pantavisor/getting-started/benchmarks/vs-balena"},"next":{"title":"Pantavisor vs Docker","permalink":"/029-rc4/meta-pantavisor/getting-started/benchmarks/vs-docker"}}'),s=t(74848),a=t(28453);let r={title:"Pantavisor vs Buildroot",sidebar_position:3,description:"Buildroot is great at building minimal monolithic images; Pantavisor adds composable containers, atomic OTA, and fleet management. They solve different problems \u2014 and can be combined."},o="Pantavisor vs Buildroot \u2014 composability vs minimalism",l={},d=[{value:"The short answer",id:"the-short-answer",level:2},{value:"At a glance",id:"at-a-glance",level:2},{value:"What Buildroot does well",id:"what-buildroot-does-well",level:2},{value:"Where Buildroot stops",id:"where-buildroot-stops",level:2},{value:"Where Pantavisor adds value",id:"where-pantavisor-adds-value",level:2},{value:"Combining Buildroot and Pantavisor",id:"combining-buildroot-and-pantavisor",level:2},{value:"When to choose Buildroot alone",id:"when-to-choose-buildroot-alone",level:2},{value:"When to add Pantavisor",id:"when-to-add-pantavisor",level:2},{value:"Key takeaway",id:"key-takeaway",level:2},{value:"Next steps",id:"next-steps",level:2}];function c(e){let n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"pantavisor-vs-buildroot--composability-vs-minimalism",children:"Pantavisor vs Buildroot \u2014 composability vs minimalism"})}),"\n",(0,s.jsx)(n.h2,{id:"the-short-answer",children:"The short answer"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Buildroot is a build system. Pantavisor is a runtime + lifecycle platform."}),"\nThey are not competitors \u2014 they answer different questions:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Buildroot"})," asks: ",(0,s.jsx)(n.em,{children:"How do I produce a minimal Linux image for this board?"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Pantavisor"})," asks: ",(0,s.jsx)(n.em,{children:"Once a device is in the field, how do I compose, update,\nsign, and roll back its firmware over years?"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Buildroot wins on raw minimalism. Pantavisor wins on lifecycle, composability,\nand OTA. You can use both \u2014 Buildroot (or Yocto) to produce the BSP, Pantavisor\nto manage everything above it."}),"\n",(0,s.jsx)(n.h2,{id:"at-a-glance",children:"At a glance"}),"\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\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:"Aspect"}),(0,s.jsx)(n.th,{children:"Buildroot"}),(0,s.jsx)(n.th,{children:"Pantavisor"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Type"}),(0,s.jsx)(n.td,{children:"Build system (Makefile-driven)"}),(0,s.jsx)(n.td,{children:"Runtime + state manager"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Output"}),(0,s.jsx)(n.td,{children:"Single monolithic rootfs / image"}),(0,s.jsx)(n.td,{children:"Composable state of LXC containers"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Update model"}),(0,s.jsx)(n.td,{children:"Reflash (or bolt-on SWUpdate/RAUC/Mender)"}),(0,s.jsx)(n.td,{children:"Built-in atomic OTA via Pantahub"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Container runtime"}),(0,s.jsx)(n.td,{children:"\u274C None (you add LXC/Docker yourself)"}),(0,s.jsx)(n.td,{children:"\u2705 LXC (~1 MB)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Rollback"}),(0,s.jsx)(n.td,{children:"Manual (A/B partitions you wire up)"}),(0,s.jsx)(n.td,{children:"Automatic, every revision"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Fleet management"}),(0,s.jsx)(n.td,{children:"\u274C Not provided"}),(0,s.jsx)(n.td,{children:"\u2705 Pantahub"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Signed updates"}),(0,s.jsx)(n.td,{children:"\u274C DIY"}),(0,s.jsx)(n.td,{children:"\u2705 PVS over state JSON"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Footprint of base image"}),(0,s.jsx)(n.td,{children:"Smallest in class"}),(0,s.jsx)(n.td,{children:"Comparable when using a small BSP"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Integration with Yocto"}),(0,s.jsx)(n.td,{children:"Separate world"}),(0,s.jsxs)(n.td,{children:["First-class via ",(0,s.jsx)(n.a,{href:"/029-rc4/meta-pantavisor/overview/get-started",children:"meta-pantavisor"})]})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"what-buildroot-does-well",children:"What Buildroot does well"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Tiny images"})," \u2014 a 2\u201310 MB rootfs is normal."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Simple mental model"})," \u2014 a single ",(0,s.jsx)(n.code,{children:"defconfig"})," and ",(0,s.jsx)(n.code,{children:"make"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Fast build"})," vs Yocto on small targets."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"No package manager overhead"})," at runtime."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Reproducible"})," if you pin sources."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If you only ship one firmware, never need OTA, and have no fleet, Buildroot alone\nis often the right tool."}),"\n",(0,s.jsx)(n.h2,{id:"where-buildroot-stops",children:"Where Buildroot stops"}),"\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:"Need"}),(0,s.jsx)(n.th,{children:"Buildroot answer"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"OTA updates"}),(0,s.jsx)(n.td,{children:"Bolt on SWUpdate, RAUC, Mender, or roll your own"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"A/B partitions and rollback"}),(0,s.jsx)(n.td,{children:"DIY in U-Boot scripts and partition layout"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Update a single application"}),(0,s.jsx)(n.td,{children:"Rebuild & reflash the whole image"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Manage 10,000 deployed devices"}),(0,s.jsx)(n.td,{children:"Build your own backend"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Independent kernel vs app cadence"}),(0,s.jsx)(n.td,{children:"Not supported \u2014 same image"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Cryptographically signed system state"}),(0,s.jsx)(n.td,{children:"DIY (image signing only)"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:'Each "DIY" line is months of work and a long tail of edge cases. Pantavisor ships\nthose answers in the box.'}),"\n",(0,s.jsx)(n.h2,{id:"where-pantavisor-adds-value",children:"Where Pantavisor adds value"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Buildroot (or Yocto, or anything that boots Linux) \u2502\n\u2502 \u2192 produces kernel + minimal rootfs \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u25BC\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Pantavisor takes over as PID 1 \u2502\n\u2502 \u2022 Mounts /trails/<rev>/ (the current state) \u2502\n\u2502 \u2022 Starts each container declared in the state JSON \u2502\n\u2502 \u2022 Watches status_goal, rolls back on failure \u2502\n\u2502 \u2022 Talks to Pantahub for new revisions \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Pantavisor adds state-based composition (kernel, OS, services, apps as\nindependent LXC containers
1), atomic OTA, automatic rollback on failed boot or\nunmet ",(0,s.jsx)(n.code,{children:"status_goal"}),", signed states via PVS, differential transfer (only changed\nobject hashes traverse the network), and Pantahub (an open-source, self-hostable\nfleet backend)."]}),"\n",(0,s.jsx)(n.h2,{id:"combining-buildroot-and-pantavisor",children:"Combining Buildroot and Pantavisor"}),"\n",(0,s.jsxs)(n.p,{children:["Pantavisor's official Yocto layer is ",(0,s.jsx)(n.code,{children:"meta-pantavisor"}),". Buildroot doesn't have an\nequivalent upstream layer, but Pantavisor is a small static binary plus an LXC\nfork \u2014 it can be cross-compiled with Buildroot's toolchain and packaged as the\ninit for a Buildroot-built rootfs. In practice, most production users go via\nYocto + meta-pantavisor because the integration work is already done."]}),"\n",(0,s.jsx)(n.p,{children:"If you're committed to Buildroot:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Build a minimal Buildroot rootfs containing only the kernel + Pantavisor binary + LXC."}),"\n",(0,s.jsxs)(n.li,{children:["Deliver the initial ",(0,s.jsx)(n.code,{children:"/trails/0/"})," composition (BSP container + your apps) alongside."]}),"\n",(0,s.jsx)(n.li,{children:"From then on, every change ships as a Pantavisor state revision via Pantahub \u2014 no Buildroot rebuild."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"when-to-choose-buildroot-alone",children:"When to choose Buildroot alone"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"One-shot firmware, no OTA, no fleet."}),"\n",(0,s.jsx)(n.li,{children:"Extremely tight resource budget (single-digit MB total)."}),"\n",(0,s.jsx)(n.li,{children:"You're prototyping and don't need lifecycle features yet."}),"\n",(0,s.jsx)(n.li,{children:"You already have a custom OTA pipeline you trust."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"when-to-add-pantavisor",children:"When to add Pantavisor"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"You need OTA without bolting together SWUpdate/RAUC/Mender + a backend."}),"\n",(0,s.jsx)(n.li,{children:"You ship multiple product variants from a shared base image."}),"\n",(0,s.jsx)(n.li,{children:"Different teams own kernel vs apps and want independent release cadence."}),"\n",(0,s.jsx)(n.li,{children:"You need signed, auditable system states."}),"\n",(0,s.jsx)(n.li,{children:"You want fleet visibility and remote ops without building it yourself."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"key-takeaway",children:"Key takeaway"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Buildroot builds the smallest possible Linux. Pantavisor makes that Linux\ncomposable, updateable, and fleet-managed."})}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Pick Buildroot when minimalism is the only requirement. Add Pantavisor the moment\nlifecycle, OTA, or fleet enters the picture."}),"\n",(0,s.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/029-rc4/meta-pantavisor/getting-started/benchmarks/vs-yocto",children:"Pantavisor vs Yocto"})," \u2014 the recommended build integration"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/029-rc4/meta-pantavisor/overview/get-started",children:"Build with Yocto"})," \u2014 the meta-pantavisor build guide"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/029-rc4/meta-pantavisor/getting-started/migrate/",children:"Migrate to Pantavisor"})," \u2014 practical migration paths"]}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453(e,n,t){t.d(n,{R:()=>r,x:()=>o});var i=t(96540);let s={},a=i.createContext(s);function r(e){let n=i.useContext(a);return i.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(s):e.components||s:r(e.components),i.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.