Files
infix/dev/boot/index.html
T

3294 lines
70 KiB
HTML

<!DOCTYPE html><html lang="en" class="no-js"><head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Infix Documentation">
<link rel="canonical" href="https://kernelkit.github.io/infix/dev/boot/">
<link rel="prev" href="../ntp/">
<link rel="next" href="../system/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.4">
<title>Boot Procedure - User's Guide</title>
<link rel="stylesheet" href="../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&amp;display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../extra.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<link href="../assets/stylesheets/glightbox.min.css" rel="stylesheet"><script src="../assets/javascripts/glightbox.min.js"></script><style id="glightbox-style">
html.glightbox-open { overflow: initial; height: 100%; }
.gslide-title { margin-top: 0px; user-select: text; }
.gslide-desc { color: #666; user-select: text; }
.gslide-image img { background: black; }
.glightbox-clean .gslide-media { -webkit-box-shadow: none; box-shadow: none; }
.gscrollbar-fixer { padding-right: 15px; }
.gdesc-inner { font-size: 0.75rem; }
body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color); }
body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color); }
body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color); }
</style></head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="orange">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#boot-procedure" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<div data-md-color-scheme="default" data-md-component="outdated" hidden>
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="https://www.kernelkit.org/" title="User's Guide" class="md-header__button md-logo" aria-label="User's Guide" data-md-component="logo">
<img src="../logo-plain.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"></path></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
User's Guide
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Boot Procedure
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="orange" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"></path></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="orange" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"></path></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"></path></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"></path></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"></path></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"></path></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/kernelkit/infix/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"></path></svg>
</div>
<div class="md-source__repository">
kernelkit/infix
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="https://www.kernelkit.org/" title="User's Guide" class="md-nav__button md-logo" aria-label="User's Guide" data-md-component="logo">
<img src="../logo-plain.png" alt="logo">
</a>
User's Guide
</label>
<div class="md-nav__source">
<a href="https://github.com/kernelkit/infix/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"></path></svg>
</div>
<div class="md-source__repository">
kernelkit/infix
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2">
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
CLI
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
CLI
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../cli/introduction/" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/configure/" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/keybindings/" class="md-nav__link">
<span class="md-ellipsis">
Keybindings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/netcalc/" class="md-nav__link">
<span class="md-ellipsis">
Network Calculator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/tcpdump/" class="md-nav__link">
<span class="md-ellipsis">
Network Monitoring
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/quick/" class="md-nav__link">
<span class="md-ellipsis">
Quickstart Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/text-editor/" class="md-nav__link">
<span class="md-ellipsis">
Text Editor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cli/upgrade/" class="md-nav__link">
<span class="md-ellipsis">
Upgrading
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../container/" class="md-nav__link">
<span class="md-ellipsis">
Docker Containers
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4">
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
Networking
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Networking
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../networking/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../iface/" class="md-nav__link">
<span class="md-ellipsis">
Common Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../bridging/" class="md-nav__link">
<span class="md-ellipsis">
Bridging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lag/" class="md-nav__link">
<span class="md-ellipsis">
Link Aggregation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ethernet/" class="md-nav__link">
<span class="md-ellipsis">
Ethernet Interfaces
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ip/" class="md-nav__link">
<span class="md-ellipsis">
IP Addressing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../routing/" class="md-nav__link">
<span class="md-ellipsis">
Routing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../firewall/" class="md-nav__link">
<span class="md-ellipsis">
Firewall Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../qos/" class="md-nav__link">
<span class="md-ellipsis">
Quality of Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../eth-counters/" class="md-nav__link">
<span class="md-ellipsis">
RMON Counters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../tunnels/" class="md-nav__link">
<span class="md-ellipsis">
Tunneling (L2/L3)
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_12">
<label class="md-nav__link" for="__nav_4_12" id="__nav_4_12_label" tabindex="0">
<span class="md-ellipsis">
VPN Tunnels
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_12">
<span class="md-nav__icon md-icon"></span>
VPN Tunnels
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../vpn/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../vpn-wireguard/" class="md-nav__link">
<span class="md-ellipsis">
WireGuard
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../wifi/" class="md-nav__link">
<span class="md-ellipsis">
Wireless LAN (WiFi)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5">
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../discovery/" class="md-nav__link">
<span class="md-ellipsis">
Device Discovery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dhcp/" class="md-nav__link">
<span class="md-ellipsis">
DHCP Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../ntp/" class="md-nav__link">
<span class="md-ellipsis">
NTP Server
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
System
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
System
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Boot Procedure
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Boot Procedure
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#bootloader" class="md-nav__link">
<span class="md-ellipsis">
Bootloader
</span>
</a>
<nav class="md-nav" aria-label="Bootloader">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#configuration" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#u-boot" class="md-nav__link">
<span class="md-ellipsis">
U-Boot
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#grub" class="md-nav__link">
<span class="md-ellipsis">
GRUB
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#system-boot" class="md-nav__link">
<span class="md-ellipsis">
System Boot
</span>
</a>
<nav class="md-nav" aria-label="System Boot">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#failure-modes" class="md-nav__link">
<span class="md-ellipsis">
Failure Modes
</span>
</a>
<nav class="md-nav" aria-label="Failure Modes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#vpd-fail" class="md-nav__link">
<span class="md-ellipsis">
VPD Fail
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#broken-startup-config" class="md-nav__link">
<span class="md-ellipsis">
Broken startup-config
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#system-upgrade" class="md-nav__link">
<span class="md-ellipsis">
System Upgrade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#image-formats" class="md-nav__link">
<span class="md-ellipsis">
Image Formats
</span>
</a>
<nav class="md-nav" aria-label="Image Formats">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#squashfs-image" class="md-nav__link">
<span class="md-ellipsis">
SquashFS Image
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fit-framed-squash-image" class="md-nav__link">
<span class="md-ellipsis">
FIT Framed Squash Image
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#rauc-upgrade-bundle" class="md-nav__link">
<span class="md-ellipsis">
RAUC Upgrade Bundle
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#disk-image" class="md-nav__link">
<span class="md-ellipsis">
Disk Image
</span>
</a>
<nav class="md-nav" aria-label="Disk Image">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#boot-bootloader" class="md-nav__link">
<span class="md-ellipsis">
boot - Bootloader
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#aux-auxiliary-data" class="md-nav__link">
<span class="md-ellipsis">
aux - Auxiliary Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#primarysecondary-root-filesystems" class="md-nav__link">
<span class="md-ellipsis">
primary/secondary - Root Filesystems
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cfg-configuration-data" class="md-nav__link">
<span class="md-ellipsis">
cfg - Configuration Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#var-variable-data" class="md-nav__link">
<span class="md-ellipsis">
var - Variable Data
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../system/" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nacm/" class="md-nav__link">
<span class="md-ellipsis">
Access Control (NACM)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hardware/" class="md-nav__link">
<span class="md-ellipsis">
Hardware Info &amp; Status
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../management/" class="md-nav__link">
<span class="md-ellipsis">
Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../keystore/" class="md-nav__link">
<span class="md-ellipsis">
Keystore
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../syslog/" class="md-nav__link">
<span class="md-ellipsis">
Syslog Support
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../support/" class="md-nav__link">
<span class="md-ellipsis">
Support Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../upgrade/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Scripting
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Scripting
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../scripting/" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-sysrepocfg/" class="md-nav__link">
<span class="md-ellipsis">
Legacy Scripting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-netconf/" class="md-nav__link">
<span class="md-ellipsis">
NETCONF Scripting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-restconf/" class="md-nav__link">
<span class="md-ellipsis">
RESTCONF Scripting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../scripting-prod/" class="md-nav__link">
<span class="md-ellipsis">
Production Testing
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8">
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Developer's Corner
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Developer's Corner
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../branding/" class="md-nav__link">
<span class="md-ellipsis">
Branding &amp; Releases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../developers-guide/" class="md-nav__link">
<span class="md-ellipsis">
Developer's Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../override-package/" class="md-nav__link">
<span class="md-ellipsis">
Developing with Buildroot
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../netboot/" class="md-nav__link">
<span class="md-ellipsis">
Netboot HowTo
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../testing/" class="md-nav__link">
<span class="md-ellipsis">
Regression Testing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../test-arch/" class="md-nav__link">
<span class="md-ellipsis">
Test System Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../virtual/" class="md-nav__link">
<span class="md-ellipsis">
Virtual Environments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../vpd/" class="md-nav__link">
<span class="md-ellipsis">
Vital Product Data (VPD)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../license/" class="md-nav__link">
<span class="md-ellipsis">
Origin &amp; Licensing
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#bootloader" class="md-nav__link">
<span class="md-ellipsis">
Bootloader
</span>
</a>
<nav class="md-nav" aria-label="Bootloader">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#configuration" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#u-boot" class="md-nav__link">
<span class="md-ellipsis">
U-Boot
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#grub" class="md-nav__link">
<span class="md-ellipsis">
GRUB
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#system-boot" class="md-nav__link">
<span class="md-ellipsis">
System Boot
</span>
</a>
<nav class="md-nav" aria-label="System Boot">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#failure-modes" class="md-nav__link">
<span class="md-ellipsis">
Failure Modes
</span>
</a>
<nav class="md-nav" aria-label="Failure Modes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#vpd-fail" class="md-nav__link">
<span class="md-ellipsis">
VPD Fail
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#broken-startup-config" class="md-nav__link">
<span class="md-ellipsis">
Broken startup-config
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#system-upgrade" class="md-nav__link">
<span class="md-ellipsis">
System Upgrade
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#image-formats" class="md-nav__link">
<span class="md-ellipsis">
Image Formats
</span>
</a>
<nav class="md-nav" aria-label="Image Formats">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#squashfs-image" class="md-nav__link">
<span class="md-ellipsis">
SquashFS Image
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fit-framed-squash-image" class="md-nav__link">
<span class="md-ellipsis">
FIT Framed Squash Image
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#rauc-upgrade-bundle" class="md-nav__link">
<span class="md-ellipsis">
RAUC Upgrade Bundle
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#disk-image" class="md-nav__link">
<span class="md-ellipsis">
Disk Image
</span>
</a>
<nav class="md-nav" aria-label="Disk Image">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#boot-bootloader" class="md-nav__link">
<span class="md-ellipsis">
boot - Bootloader
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#aux-auxiliary-data" class="md-nav__link">
<span class="md-ellipsis">
aux - Auxiliary Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#primarysecondary-root-filesystems" class="md-nav__link">
<span class="md-ellipsis">
primary/secondary - Root Filesystems
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cfg-configuration-data" class="md-nav__link">
<span class="md-ellipsis">
cfg - Configuration Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#var-variable-data" class="md-nav__link">
<span class="md-ellipsis">
var - Variable Data
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<nav class="md-path" aria-label="Navigation">
<ol class="md-path__list">
<li class="md-path__item">
<a href=".." class="md-path__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-path__item">
<a href="./" class="md-path__link">
<span class="md-ellipsis">
System
</span>
</a>
</li>
</ol>
</nav>
<article class="md-content__inner md-typeset">
<h1 id="boot-procedure">Boot Procedure<a class="headerlink" href="#boot-procedure" title="Permanent link"></a></h1>
<p>Systems running Infix will typically boot in multiple phases, forming
a boot chain. Each link in the chain has three main responsibilities:</p>
<ol>
<li>Ensuring the integrity of the next link before passing control to
it. This avoids silent failures stemming from data corruption.</li>
<li>Ensuring the authenticity of the next link before passing control
to it, commonly referred to as <em>Secure Boot</em>. This protects against
malicious attempts to modify a system's firmware.</li>
<li>Preparing the system state according to the requirements of the
next link. E.g. the Linux kernel requires the system's RAM to be
operational.</li>
</ol>
<p>A typical chain consists of four stages:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a> .---------.
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> | ROM &gt;---. Determine the location of and load the SPL
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> '---------' |
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>.-----------------'
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>| .---------.
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>'---&gt; SPL &gt;---. Perform DDR training and load the TPL
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> '---------' |
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a>.-----------------'
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>| .---------.
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a>'---&gt; TPL &gt;---. Load Linux kernel, device tree, and root filesystem
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> '---------' |
<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>.-----------------'
<a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a>| .---------.
<a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a>'---&gt; Infix | Get down to business
<a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a> '---------'
</code></pre></div>
<p>After a reset, hardware will pass control to a program (<em>ROM</em>) which
is almost always programmed into the SoC by the vendor. This program
will determine the location of the <em>Secondary Program Loader</em> (<em>SPL</em>),
typically by reading a set of <em>Sample at Reset</em> (SaR) pins.</p>
<p>The <em>SPL</em> is sometimes provided by the SoC vendor in binary form, and
is sometimes built as a part of the <em>Tertiary Program Loader</em> (<em>TPL</em>)
build. Its main responsibility is usually to set up the system's
memory controller and perform DDR training, if required, before
loading the <em>TPL</em>.</p>
<p>Commonly referred to as the system's <em>bootloader</em>, the <em>TPL</em> is
responsible for preparing the execution environment required by the
Linux kernel.</p>
<p>This document's focus is to describe the final two phases of the boot
chain, as the initial phases are very hardware dependent, better
described by existing documentation provided by the SoC vendor.</p>
<h2 id="bootloader">Bootloader<a class="headerlink" href="#bootloader" title="Permanent link"></a></h2>
<h3 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link"></a></h3>
<p>To mitigate the risk of a malicious user being able to circumvent the
bootloader's validation procedure, user configuration is kept to a
minimum. Two settings are available:</p>
<p><strong>Boot order</strong>: Since Infix maintains two copies of its software image,
and as some bootloaders support <a href="../netboot/">netbooting</a>, the order in which boot
sources are considered can be configured. To select the active
source, use <a href="https://rauc.io">RAUC</a>:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>root@example:~# rauc status mark-active &lt;slot&gt;
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>...
</code></pre></div>
<p>Where <code>&lt;slot&gt;</code> is one of:</p>
<table>
<thead>
<tr>
<th><strong><code>&lt;slot&gt;</code></strong></th>
<th><strong>Source</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>rootfs.0</code></td>
<td>Primary partition</td>
</tr>
<tr>
<td><code>rootfs.1</code></td>
<td>Secondary partition</td>
</tr>
<tr>
<td><code>net.0</code></td>
<td>Netboot (where supported)</td>
</tr>
</tbody>
</table>
<p><strong>Debug</strong>: By default, the kernel will only output errors to the
console during boot. Optionally, this can be altered such that all
enabled messages are logged.</p>
<p>On systems using <em>U-Boot</em>, this can be enabled by running <code>fw_setenv
DEBUG 1</code>. To restore the default behavior, run <code>fw_setenv DEBUG</code>.</p>
<p>On systems running <em>GRUB</em>, this can be enabled by running:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>root@example:~# grub-editenv /mnt/aux/grub/grubenv set DEBUG=1
</code></pre></div>
<p>To restore the default behavior, run:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>root@example:~# grub-editenv /mnt/aux/grub/grubenv unset DEBUG
</code></pre></div>
<h3 id="u-boot">U-Boot<a class="headerlink" href="#u-boot" title="Permanent link"></a></h3>
<p>Used on <em>aarch64</em> based systems. It is able to verify both the
<em>integrity</em> and <em>authenticity</em> of an Infix image. As such, it can be
used as a part of a <em>Secure Boot</em> chain, given that the preceding
links are able to do the same.</p>
<p>Supports booting Infix from a block device using the <a href="#disk-image">Disk
Image</a> layout. Currently, Virtio and MMC disks are
supported.</p>
<p>An <a href="#fit-framed-squash-image">FIT Framed Squash Image</a> can be used to
boot Infix over the network. DHCP is used to configure the network
and TFTP to transfer the image to the system's RAM.</p>
<p>Access to U-Boot's shell is disabled to prevent side-loading of
malicious software. To configure the active boot partition, refer to
the <a href="#configuration">Bootloader Configuration</a> section.</p>
<h3 id="grub">GRUB<a class="headerlink" href="#grub" title="Permanent link"></a></h3>
<p>Used on <em>x86_64</em> based systems. Neither the <em>integrity</em> nor the
<em>authenticity</em> of the Infix image is verified. It is only intended to
provide a way of booting a <a href="#disk-image">Disk Image</a>, such that a
standard <a href="#system-upgrade">System Upgrade</a> can be performed on
virtualized instances.</p>
<p>Access to the GRUB shell is not limited in any way, and the boot
partition can be selected interactively at boot using the arrow keys. It
is also possible to permanently configure the default partition from
Infix using the <a href="#configuration">Bootloader Configuration</a>.</p>
<h2 id="system-boot">System Boot<a class="headerlink" href="#system-boot" title="Permanent link"></a></h2>
<p>After the system firmware (BIOS or and <a href="./">boot loader</a> start
Linux the following happens. The various failure modes, e.g., missing
password in VPD, are detailed later in this section.</p>
<p><a class="glightbox" data-type="image" data-width="100%" data-height="auto" href="../img/fail-secure.svg" data-desc-position="bottom"><img alt="System boot flowchart" src="../img/fail-secure.svg"></a></p>
<ol>
<li>Before mounting <code>/cfg</code> and <code>/var</code> partitions, hosting read-writable
data like <code>startup-config</code> and container images, the system first
checks if a factory reset has been requested by the user, if so it
wipes the contents of these partitions</li>
<li>Linux boots with a device tree which is used for detecting generic
make and model of the device, e.g., number of interfaces. It may
also reference an EEPROM with <a href="../vpd/">Vital Product Data</a>. That is
where the base MAC address and per-device password hash is stored.
(Generic builds use the same MAC address and password)</li>
<li>On every boot the system's <code>factory-config</code> and <code>failure-config</code> are
generated from the YANG<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup> models of the current firmware version.
This ensures that a factory reset device can always boot, and that
there is a working fail safe, or rather <em>fail secure</em>, mode</li>
<li>On first power-on, and after a factory reset, the system does not
have a <code>startup-config</code>, in which case <code>factory-config</code> is copied
to <code>startup-config</code> -- if a per-product specific version exists it
is preferred over the generated one</li>
<li>Provided the integrity of the <code>startup-config</code> is OK, a system
service loads and activates the configuration</li>
</ol>
<h3 id="failure-modes">Failure Modes<a class="headerlink" href="#failure-modes" title="Permanent link"></a></h3>
<p>So, what happens if any of the steps above fail?</p>
<h4 id="vpd-fail">VPD Fail<a class="headerlink" href="#vpd-fail" title="Permanent link"></a></h4>
<p>The per-device password cannot be read, or is corrupt, so the system
<code>factory-config</code> and <code>failure-config</code> are not generated:</p>
<ol>
<li>First boot, or after factory reset: <code>startup-config</code> cannot be
created or loaded, and <code>failure-config</code> cannot be loaded. The
system ends up in an unrecoverable state, i.e., <strong>RMA<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup> Mode</strong></li>
<li>The system has booted (at least) once with correct VPD and password
and already has a <code>startup-config</code>. Provided the <code>startup-config</code>
is OK (see below), it is loaded and system boots successfully</li>
</ol>
<p>In both cases, external factory reset modes/button will not help, and
in the second case will cause the device to fail on the next boot.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The second case does not yet have any warning or event that can be
detected from the outside. This is planned for a later release.</p>
</div>
<h4 id="broken-startup-config">Broken startup-config<a class="headerlink" href="#broken-startup-config" title="Permanent link"></a></h4>
<p>If loading <code>startup-config</code> fails for some reason, e.g., invalid JSON
syntax, failed validation against the system's YANG model, or a bug in
the system's <code>confd</code> service, the <em>Fail Secure Mode</em> is triggered and
<code>failure-config</code> is loaded (unless VPD Failure, see above).</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>Please see the <a href="../branding/">Branding &amp; Releases</a> document for how to
provide per-product <code>failure-config</code>, or <code>factory-config</code> to suit your
product's preferences.</p>
</div>
<p><em>Fail Secure Mode</em> is a fail-safe mode provided for debugging the
system. The default<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup> creates a setup of isolated interfaces with
communication only to the management CPU, SSH and console login using
the device's factory reset password, IP connectivity only using IPv6
link-local, and device discovery protocols: LLDP, mDNS-SD. The login
and shell prompt are set to <code>failure-c0-ff-ee</code>, the last three octets of
the device's base MAC address.</p>
<h2 id="system-upgrade">System Upgrade<a class="headerlink" href="#system-upgrade" title="Permanent link"></a></h2>
<p>Much of the minutiae of software upgrades is delegated to <a href="https://rauc.io">RAUC</a>,
which offers lots of benefits out-of-the-box:</p>
<ul>
<li>Upgrade Bundles are always signed, such that their authenticity can
be verified by the running operating system, before the new one is
installed.</li>
<li>The bureaucracy of interfacing with different bootloaders, manage
the boot order, is a simple matter of providing a compatible
configuration.</li>
<li>Updates can be sourced from the local filesystem (including external
media like USB sticks or SD-cards) and from remote servers using FTP
or HTTP(S).</li>
</ul>
<p>To initiate a system upgrade from the shell<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>, run:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>root@example:~# rauc install &lt;file|url&gt;
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>...
</code></pre></div>
<p>Where the file or URL points to a <a href="#rauc-upgrade-bundle">RAUC Upgrade Bundle</a>.</p>
<p>This will upgrade the partition not currently running. After a
successful upgrade is completed, you can reboot your system, which
will then boot from the newly installed image. Since the partition
from which you were originally running is now inactive, running the
same upgrade command again will bring both partitions into sync.</p>
<h2 id="image-formats">Image Formats<a class="headerlink" href="#image-formats" title="Permanent link"></a></h2>
<h3 id="squashfs-image">SquashFS Image<a class="headerlink" href="#squashfs-image" title="Permanent link"></a></h3>
<p><strong>Canonical Name</strong>: <code>rootfs.squashfs</code></p>
<p>The central read-only filesystem image containing Infix's Linux
kernel, device trees, and root filesystem. All other images bundle
this image, or is dependent on it, in one way or another.</p>
<p>On its own, it can be used as an <a href="https://docs.kernel.org/admin-guide/initrd.html">initrd</a> to efficiently boot a
virtual instance of Infix.</p>
<h3 id="fit-framed-squash-image">FIT Framed Squash Image<a class="headerlink" href="#fit-framed-squash-image" title="Permanent link"></a></h3>
<p><strong>Canonical Name</strong>: <code>rootfs.itb</code></p>
<p>As the name suggests, this is essentially the <a href="#squashfs-image">Squash FS
Image</a> with a <em>Flattened Image Tree</em> (<a href="https://u-boot.readthedocs.io/en/latest/usage/fit.html">FIT</a>)
header. Being a native format to U-Boot, using this framing allows us
to verify the integrity and authenticity of the SquashFS image using
standard U-Boot primitives.</p>
<p>In contrast to most FIT images, the kernel and device trees are not
stored as separate binaries in the image tree. Instead, Infix follows
the standard Linux layout where the kernel and related files are
stored in the <code>/boot</code> directory of the filesystem.</p>
<p>On disk, this image is then stored broken up into its two components;
the <em>FIT header</em> (<code>rootfs.itbh</code>) and the SquashFS image. The header
is stored on the <a href="#aux-auxiliary-data">Auxiliary Data</a> partition of
the <a href="#disk-image">Disk Image</a>, while the SquashFS image is stored in
one of the <a href="#primarysecondary-root-filesystems">Root Filesystem</a>
partitions.</p>
<p>When the system boots, U-Boot will concatenate the two parts to
validate the SquashFS's contents. This path was chosen because:</p>
<ul>
<li>
<p>Having a separate raw SquashFS means Linux can directly mount it as
the root filesystem.</p>
</li>
<li>
<p>It decouples Infix from U-Boot. If a better way of validating our
image is introduced, we can switch to it without major changes to
Infix's boot process, as we can still use a regular SquashFS as the
root filesystem.</p>
</li>
<li>
<p>It lets us use standard interfaces to boot Linux, like SYSLINUX. It
also plays well with traditional bootloaders, like GRUB.</p>
</li>
</ul>
<p>In its full form, it can be used to netboot Infix, as it contains all
the information needed by U-Boot in a single file.</p>
<h3 id="rauc-upgrade-bundle">RAUC Upgrade Bundle<a class="headerlink" href="#rauc-upgrade-bundle" title="Permanent link"></a></h3>
<p><strong>Canonical Name</strong>: <code>infix-${ARCH}.pkg</code></p>
<p>Itself a SquashFS image, this bundle (sometimes referred to package)
contains the Infix <a href="#squashfs-image">SquashFS Image</a> along with the
header of the <a href="#fit-framed-squash-image">FIT Framed Squash Image</a>, and
some supporting files to let <a href="https://rauc.io">RAUC</a> know how install it on the target
system.</p>
<p>When performing a <a href="#system-upgrade">System Upgrade</a>, this is the format
to use.</p>
<h3 id="disk-image">Disk Image<a class="headerlink" href="#disk-image" title="Permanent link"></a></h3>
<p><strong>Canonical Name</strong>: <code>disk.img</code></p>
<p>Infix runs from a block device (e.g. eMMC or virtio disk) with the
following layout. The disk is expected to use the GPT partitioning
scheme. Partitions marked with an asterisk are optional.</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>.-----------.
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>| GPT Table |
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>:-----------:
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a>| boot* |
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a>:-----------:
<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>| aux |
<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a>:-----------:
<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a>| |
<a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a>| primary |
<a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a>| |
<a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a>:-----------:
<a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a>| |
<a id="__codelineno-5-13" name="__codelineno-5-13" href="#__codelineno-5-13"></a>| secondary |
<a id="__codelineno-5-14" name="__codelineno-5-14" href="#__codelineno-5-14"></a>| |
<a id="__codelineno-5-15" name="__codelineno-5-15" href="#__codelineno-5-15"></a>:-----------:
<a id="__codelineno-5-16" name="__codelineno-5-16" href="#__codelineno-5-16"></a>| cfg |
<a id="__codelineno-5-17" name="__codelineno-5-17" href="#__codelineno-5-17"></a>:-----------:
<a id="__codelineno-5-18" name="__codelineno-5-18" href="#__codelineno-5-18"></a>| |
<a id="__codelineno-5-19" name="__codelineno-5-19" href="#__codelineno-5-19"></a>| var* |
<a id="__codelineno-5-20" name="__codelineno-5-20" href="#__codelineno-5-20"></a>| |
<a id="__codelineno-5-21" name="__codelineno-5-21" href="#__codelineno-5-21"></a>'-----------'
</code></pre></div>
<h4 id="boot-bootloader"><code>boot</code> - Bootloader<a class="headerlink" href="#boot-bootloader" title="Permanent link"></a></h4>
<table>
<thead>
<tr>
<th><strong>Parameter</strong></th>
<th><strong>Value</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Required</td>
<td>No</td>
</tr>
<tr>
<td>Size</td>
<td>4 MiB</td>
</tr>
<tr>
<td>Format</td>
<td>Raw binary, as dictated by the hardware</td>
</tr>
</tbody>
</table>
<p>Optional partition containing the system's bootloader. May also reside
in a separate storage device, e.g. a serial FLASH.</p>
<p>On x86_64, this partition holds the EFI system partition, containing
the GRUB bootloader.</p>
<h4 id="aux-auxiliary-data"><code>aux</code> - Auxiliary Data<a class="headerlink" href="#aux-auxiliary-data" title="Permanent link"></a></h4>
<table>
<thead>
<tr>
<th><strong>Parameter</strong></th>
<th><strong>Value</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Required</td>
<td>Yes</td>
</tr>
<tr>
<td>Size</td>
<td>4 MiB</td>
</tr>
<tr>
<td>Format</td>
<td>EXT4 filesystem</td>
</tr>
</tbody>
</table>
<p>Holds information that is shared between Infix and its bootloader,
such as image signatures required to validate the chain of trust,
bootloader configuration etc.</p>
<p>Typical layout when using U-Boot bootloader:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>/
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>├ primary.itbh
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>├ secondary.itbh
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a>└ uboot.env
</code></pre></div>
<p>During boot, an ITB header along with the corresponding root
filesystem image are concatenated in memory, by U-Boot, to form a
valid FIT image that is used to verify its integrity and origin before
any files are extracted from it.</p>
<p>Note that the bootloader's primary environment is bundled in the
binary - <code>uboot.env</code> is only used to import a few settings that is
required to configure the boot order.</p>
<h4 id="primarysecondary-root-filesystems"><code>primary</code>/<code>secondary</code> - Root Filesystems<a class="headerlink" href="#primarysecondary-root-filesystems" title="Permanent link"></a></h4>
<table>
<thead>
<tr>
<th><strong>Parameter</strong></th>
<th><strong>Value</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Required</td>
<td>Yes</td>
</tr>
<tr>
<td>Size</td>
<td>&gt;= 256 MiB</td>
</tr>
<tr>
<td>Format</td>
<td>Squash filesystem</td>
</tr>
</tbody>
</table>
<p>Holds the <a href="#squashfs-image">SquashFS Image</a>. Two copies exist so that
an incomplete upgrade does not brick the system, and to allow fast
rollbacks when upgrading to a new version.</p>
<h4 id="cfg-configuration-data"><code>cfg</code> - Configuration Data<a class="headerlink" href="#cfg-configuration-data" title="Permanent link"></a></h4>
<table>
<thead>
<tr>
<th><strong>Parameter</strong></th>
<th><strong>Value</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Required</td>
<td>Yes</td>
</tr>
<tr>
<td>Size</td>
<td>&gt;= 16 MiB</td>
</tr>
<tr>
<td>Format</td>
<td>EXT4 filesystem</td>
</tr>
</tbody>
</table>
<p>Non-volatile storage of the system configuration and user data.
Concretely, user data is everything stored under <code>/root</code> and <code>/home</code>.</p>
<h4 id="var-variable-data"><code>var</code> - Variable Data<a class="headerlink" href="#var-variable-data" title="Permanent link"></a></h4>
<table>
<thead>
<tr>
<th><strong>Parameter</strong></th>
<th><strong>Value</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Required</td>
<td>No</td>
</tr>
<tr>
<td>Size</td>
<td>&gt;= 16 MiB</td>
</tr>
<tr>
<td>Format</td>
<td>EXT4 filesystem</td>
</tr>
</tbody>
</table>
<p>Persistent storage for everything under <code>/var</code>. This is maintained as
a separate filesystem from the data in <code>cfg</code>, because while the system
can funtion reasonably well without a persistent <code>/var</code>, loosing
<code>/cfg</code> or <code>/etc</code> is much more difficult.</p>
<p>If <code>var</code> is not available, Infix will still persist <code>/var/lib</code> using
<code>cfg</code> as the backing storage.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:1">
<p>See <a href="../upgrade/">Upgrade &amp; Boot Order</a> for more information.&nbsp;<a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"></a></p>
</li>
<li id="fn:2">
<p>YANG is a modeling language from IETF, replacing that used for
SNMP (MIB), used to describe the subsystems and properties of
the system.&nbsp;<a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"></a></p>
</li>
<li id="fn:3">
<p>Return Merchandise Authorization (RMA), i.e., broken beyond repair
by end-user and eligible for return to manufacturer.&nbsp;<a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"></a></p>
</li>
<li id="fn:4">
<p>Customer specific builds can define their own <code>failure-config</code>.
It may be the same as <code>factory-config</code>, with the hostname set to
<code>failure</code>, or a dedicated configuration that isolates interfaces, or
even disables ports, to ensure that the device does not cause any
security problems on the network. E.g., start forwarding traffic
between previously isolated VLANs.&nbsp;<a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text"></a></p>
</li>
</ol>
</div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright © 2022-2025 The KernelKit Team
</div>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["toc.follow", "navigation.path", "navigation.instant", "navigation.instant.progress", "navigation.tracking", "navigation.indexes", "search.highlight", "search.share", "content.code.copy", "content.code.annotate", "content.footnote.tooltips"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script>
<script src="../assets/javascripts/bundle.79ae519e.min.js"></script>
<script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
document$.subscribe(()=>{ lightbox.reload(); });
</script></body></html>