BalenaOS理论篇 | BalenaOS及其系统结构概述

一、什么是balenaOS?

BalenaOS的设计包含了所需的最小组件集,以在嵌入式场景中可靠地支持Docker引擎的操作。它以YOCTO框架为基础,systemd作为初始化系统。

网络栈由Network Manager、DNSmasq和Modem Manager组成。我们发现这些组件对于处理硬件的多样性和设备可能启动的网络配置的不可预测性是一个健壮的堆栈。

此外,还包括Avahi、OpenSSH和OpenVNP,它们分别添加了对mdn、SSH和VNP连接的支持。

这个基础非常适合在balenaOS支持的广泛嵌入式设备上运行任意容器。Balena还为容器提供了广泛的基础映像选择,这些映像针对相同的场景进行了优化,允许开发人员基于Debian、Alpine或Fedora发行版创建应用程序。当然,这并不是说,可以不使用任何其他容器基映像,而是balena的映像已被验证与balenaOS一起工作良好,实现了特别适合于嵌入式设备(如balenaOS本身)的模式。


二、balenaOS系统特点

balenaOS是一个为容器定制的操作系统。它可以在嵌入式设备上运行Docker容器:

  • 为集装箱量身定制

容器将彻底改变连接设备,balenaOS是运行它们的最佳方式。

  • 适合任何环境使用

使其能够在恶劣的网络环境和意外关机的情况下生存。

  • 只是最小系统

一个最小的Linux,它提供了在嵌入式设备上可靠地运行Docker所需的服务——没有别的。

  • 易于移植

基于最容易移植到Yocto的各种类型的Linux架构。

  • 快速、现代化的工作流程

谁说嵌入式软件的开发必须缓慢而痛苦?

  • 开放友好

在开源中积极开发,热烈的社区参与。


三、为什么是balenaOS?

为了构建balenaCloud,一个将现代软件开发工具引入连接硬件世界的平台,于2013年开始将Docker移植到ARM芯片上。此时意识到还需要一个针对用例进行优化的操作系统:一个在嵌入式设备上运行容器的最理想操作系统。

BalenaOS支持几乎20种不同的设备类型,具有强大的网络和资源调配功能,强调长期运行的可靠性,并支持高效的开发人员工作流。多年来,将balenaOS作为balenaCloud平台的一部分运行,现在将其作为一个独立的操作系统发布,这样其他人就可以在连接的设备上运行容器。


四、balenaOS结构概述

(1)介绍

BalenaOS是一个为在嵌入式设备上运行Docker容器而优化的操作系统,它强调在长时间运行期间的可靠性,以及一个富有成效的开发人员工作流程,其灵感来自于在构建balena时吸取的经验教训。

balenaOS背后的核心观点是,Linux容器首次为在嵌入式设备上使用虚拟化提供了一条实用的途径。vm和hypervisor在云部署的生产力和自动化方面已经取得了巨大的飞跃,但是它们对硬件的抽象、资源开销和缺乏硬件支持意味着它们不适合嵌入式场景。对于Linux容器实现的OS级虚拟化,对于Linux设备,这两种反对意见都被解除了,因为在物联网中有许多Linux设备。

BalenaOS是一个操作系统,它可以方便地移植到多种设备类型(通过Yocto框架,并针对Linux容器,尤其是Docker)进行了优化。为了实现这一愿景,我们做出了许多决定,无论大小,这些都贯穿于我们的体系结构中。

balenaOS的第一个版本是作为balena平台的一部分开发的,它已经在balena上的数千个嵌入式设备上运行,这些设备部署在许多不同的环境中已经有好几年了。BalenaOS v2代表了我们这些年来汲取的经验教训的结合,以及我们决心使BalenaOS成为一流的开源项目,能够作为独立的操作系统运行,适用于任何嵌入式设备和容器相交的环境。

我们期待着与社区合作,将balenaOS发展成熟,成为一个拥有更广泛设备支持、更广泛操作范围的操作系统,并一如既往地利用安全性和可靠性方面的最新发展。

(2)用户空间组件

balenaOS用户空间包只提供运行容器的基本要素,同时仍然提供灵活性。其原理是软件和服务总是默认在容器中,除非它们对所有容器都有用,或者它们绝对不能存在于容器中。用户空间由许多开源组件组成,但在此处,我们将重点介绍一些最重要的服务。

  • systemd

systemd是balenaOS的初始化系统,负责启动和管理所有其他服务。BalenaOS利用了systemd的许多优秀特性,例如为关键服务调整OOM分数,并在单独的挂载命名空间中运行服务。systemd还允许我们轻松地管理服务依赖关系。

  • Supervisor

Supervisor是一个在设备上运行的轻量级容器。它的主要作用是确保应用程序正在运行,并与balenaCloud API服务器保持通信,在推送应用程序容器时下载新的应用程序容器并对现有容器进行更新,此外还将日志发送到仪表板。它还提供了一个API interface,允许您查询更新状态并在设备上执行某些操作。

  • BalenaEngine

BalenaEngine是balena修改的Docker daemon fork,它允许管理和运行应用程序服务映像、容器、卷和网络。BalenaEngine支持容器增量,使带宽利用率提高10-70倍,二进制文件更小3.5倍,使用RAM和存储更为保守,并注重容器拉取的原子性和耐久性。

  • NetworkManager and ModemManager

BalenaOS使用NetworkManagerModemManager,通过以太网、WiFi或蜂窝调制解调器与互联网建立稳定可靠的连接。此外,为了简化设备网络的无头配置,在引导分区中有一个system-connections文件夹,它被复制到/etc/NetworkManager/system-connections中。因此,任何有效的NetworkManager连接文件都可以在设备调试之前放入引导分区。

  • Avahi

为了改善balenaOS的进度体验,如果映像是开发映像,有一个 Avahi daemon开始将设备以balena.local<hostname>.local去引导。

  • Dnsmasq

Dnsmasq管理NetworkManager为balenaOS提供的名称服务器。NetworkManager发现可以使用的域名服务器,一个名为resolvconf的二进制文件将它们写入tmpfs位置,Dnsmasq将从那里接管和管理这些域名服务器,从而使用户获得响应最快的DNS解析。

  • chrony

balenaOS使用chrony来保持系统时间同步。

注意:低于v2.13.0的BalenaOS版本使用systemd timesyncd进行时间管理。

  • OpenVNP

OpenVNP被balenaOS用作VNP服务,允许设备远程连接并启用远程SSH访问。

  • OpenSSH

OpenSSH在balenaOS中用作SSH服务器和客户端,允许使用SSH协议进行远程登录。

注意:BalenaOS版本<v2.38.0使用dropbear作为SSH服务器和客户端。

(3)镜像分区布局

第一个分区,resin-boot,根据每个板保存重要的引导文件(e.g.m kernel image, bootloader image)。它还保存着config.json文件,这是配置balenaOS并定义其行为的中心点。例如,使用config.json,您可以设置主机名、添加SSH密钥、允许持久日志记录或定义自定义DNS服务器。

resin-rootA是保存只读根文件系统的分区;它几乎包含了balenaOS的所有内容。

resin-rootB是一个空分区,仅在rootfs要更新时使用。对于balenaOS升级,我们遵循A-B更新策略。本质上,我们有一个活动分区是操作系统的当前rootfs,而一个休眠分区是空的。在balenaOS更新期间,我们将新的rootfs下载到休眠分区并尝试切换它们。如果切换成功,休眠分区将成为新的rootfs,否则将回滚到旧的活动分区。

resin-state是保存持久数据的分区,在以下“无状态和只读rootFS”小节中解释。

resin-data是一个存储分区,其中包含Supervisor、应用程序容器和卷。

(4)无状态和只读rootFS

BalenaOS提供了一个只读的根文件系统,因此我们可以确保主机OS是无状态的,但是我们仍然需要一些数据在系统重新引导时保持不变。我们通过一个非常简单的机制来实现这一点,即绑定挂载。

BalenaOS包含一个名为resin-state的分区,用于保存所有这些持久数据。在内部,我们使用需要持久化的rootfs路径填充Linux文件系统层次结构标准。在填充这个分区之后,我们准备将各自的rootfs路径绑定到这个读写位置,从而允许不同的组件(例如,启用持久日志记录时的journald)能够将数据写入磁盘。

我们的只读rootfs图如下所示:

(5)开发镜像 vs. 生产镜像

balenaOS的每一个版本都有开发和生产变体,它们都是从同一个源代码构建的,但功能集略有不同。开发镜像在开发过程中支持许多有用的功能,即:

  • 以root用户身份通过SSH无密码访问22222端口上的balenaOS
  • 暴露端口2375上的Docker套接字,允许balena push / build / deploy,在目标设备上启用远程Docker构建(请参阅Deploy to your Fleet)。
  • 可连接到tty1和serial的Getty控制台。
  • 可进入本地模式以快速开发本地应用程序容器。

注意:Raspberry Pi设备没有将Getty连接到串行设备。

生产镜像禁用无密码root访问,并且必须向添加SSH密钥config.json访问生产映像。

在balenaOS的开发和生产版本中,日志都会写入一个8MB的日志RAM缓冲区,以避免磨损大多数受支持的板所使用的闪存。

要在设备上持久化日志,请通过设置"persistentLogging"true键来启用持久日志记录config.json. ,可以通过位于 /var/log/journal的主机OS访问日志。对于小于2.45.0的balenaOS版本,持久日志限制为8 MB,并存储在设备的状态分区中。balenaOS版本>=2.45.0在设备的数据分区中最多存储32 MB的持久日志。

(5)OS Yocto组件

BalenaOS由多个Yocto层组成。Yocto项目构建系统使用这些层为各种支持的设备编译balenaOS。下面是Raspberry Pi family的一个例子。

注意这里提供了构建您自己版本的balenaOS的说明。

Layer NameRepositoryDescription
poky/metameta - poky - Poky Build Tool and MetadataPoky构建工具与元数组
poky/meta-pokymeta-poky - poky - Poky Build Tool and Metadata
meta-openembedded/meta-oehttps://github.com/openembedded/meta-openembedded/tree/master/meta-oeOpenEmbedded构建系统的基础层
meta-openembedded/meta-filesystemshttps://github.com/openembedded/meta-openembedded/tree/master/meta-filesystemsOpenEmbedded文件系统层
meta-openembedded/meta-networkinghttps://github.com/openembedded/meta-openembedded/tree/master/meta-networkingOpenEmbedded网络相关包与配置
meta-openembedded/meta-pythonhttps://github.com/openembedded/meta-openembedded/tree/master/meta-pythonOpenEmbedded包含Python模块的层
meta-raspberrypihttps://github.com/agherzan/meta-raspberrypi针对树莓派设备系列的通用硬件特定BSP overlay
meta-balena/meta-balena-commonhttps://github.com/balena-os/meta-balena/tree/development/meta-balena-common可在支持的板型上使能构建balenaOS
meta-balena/meta-balena-warriorhttps://github.com/balena-os/meta-balena/tree/development/meta-balena-warrior可在Warrior支持的BSPs上使能构建balenaOS
balena-raspberrypi/meta-balena-raspberrypihttps://github.com/balena-os/balena-raspberrypi/tree/master/layers/meta-balena-raspberrypi选取meta-raspberrypi板型上使能构建balenaOS
meta-rusthttps://github.com/meta-rust/meta-rustRust与Cargo的OpenEmbedded/Yocto层

最基础的是Poky,Yocto项目的参考分布。Poky包含OpenEmbedded构建系统(BitBake and OpenEmbedded-Core)以及一组元数据。在Poky之上,添加meta openembedded中的包集合。

下一层添加板支持包(BSP)。该层提供特定于板的配置和包(e.g., bootloader and kernel),从而支持物理硬件(而不是模拟器)的构建。

balenaOS的核心代码位于meta-balena-common层。根据BSP层的要求,该层还需要一个Poky版本特定层(e.g., meta-balena-warrior)。

接下来是板级特定的meta-balena配置层。此层与BSP层一起工作。例如,meta-raspberrypi BSP层支持树莓派家族,而对应的meta-balena-raspberrypi层则根据树莓派的需要配置balenaOS。

最后的meta-rust层支持rust编译器和cargo包管理器。

注意此处可找到添加自定义板支持的说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值