嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

应用程序实现嵌入式系统

JouleCore_4366bfb3ebb6b814f374567963dc41ebd378183d.jpg

 

应用程序通过 Ubuntu Core 实现嵌入式 Linux 系统后,能够享受事务更新和更高安全性的益处,并且能够访问“卡式”应用程序生态系统。

在本文中,我们将了解卡式软件包和 Ubuntu Core,在将后者加载到尺寸微小但功能强大的 Intel Joule (123-9801) 之前,先探索系统并安装来自应用商店的 Node-RED,最后构建一个在连接 LimeSDR 之后使用的示例应用程序。

请注意,Ubuntu Core 还可以安装在 Raspberry Pi 和 Intel NUC 以及其他硬件平台上。

卡式应用程序和 Snappy Ubuntu Core

snappy_7c9632697e945ae40a7884e674b2d88fb31b98b1.jpg

设备软件变得前所未有的复杂,已从相对比较简单的“裸机”应用程序或最低限度的嵌入式 O/S 加上服务器流程发展到通过多个框架(各自都具有大量的依赖性)集成高级功能的应用程序。

卡式应用程序通过将应用程序软件与其所有依赖项目包装在一起,解决了这种复杂性。听上去可能有点浪费(如果您安装的两个应用程序使用了相同的库,则系统上将存在该库的两个副本),但是如果这些应用程序需要不同版本的依赖项目,就不再是问题了。此外,卡式应用程序还可以在其自己的只读文件系统中安全地实现容器化,并带有隔离式数据存储。

不仅在卡式应用程序之间存在高度隔离,卡式应用程序与底层 Linux 操作系统之间也存在高度隔离,从而为设备安全性和稳定性打下坚实的基础。通过提供清晰定义的 plugslot 接口,必要时可在卡式应用程序之间实现集成。

AE_snap_YAML_b6dee0c4aa44e480d4ce4eb4f022754a32ed2835.jpg

limesdr-server 卡式应用程序的配置文件片段

在以上示例中,您可以看到已为应用程序和依赖项目指定了 GitHub 库,以及关于构建机制、配置选项和构建顺序的详细信息。

Core_efbdede44c3e764d330be68d0e5098ff1746bb12.jpg

卡式应用程序被描述为“通用 Linux 软件包”,尽管在“典型”桌面级 Ubuntu、Debian、Yocto Project、Fedora 和其他 Linux 发行版中支持这些应用程序,我们还是要使用最低限度的 Ubuntu Core,它在设计中充分考虑了嵌入式和 IoT 等设备。

Ubuntu Core 将卡式理念扩展到了 O/S,并且支持交易更新以及内核、设备驱动程序、更广泛操作系统和应用程序之间的严格隔离。

固件更新

JouleFlash_75c4c7231636b5a78f9f11b7d7feb8588b8a9d63.jpg

 

Intel Joule 上的 Ubuntu 入门指南指明,BIOS 必须更新到版本 #174。此版本或更高版本可以从 Intel 网站下载,并且提供了关于刷入版本的说明

O/S 安装

AE_Startup_Disk_Creator_41baff4168b44da7947a8d51f64b7721beb69137.jpg

 

设备需要链接至 Ubuntu 单点登录 (SSO) 帐户,如果您没有该帐户,则需要注册

Snappy Ubuntu Core 目前并未作为 Intel Joule 的自托管安装程序提供,为了完成加载,我们编写了典型的 Ubuntu 桌面活动/安装映像,随后可以从此映像启动,并使用命令行将 Ubuntu Core 文件系统提取到内部 MMC 存储。

请注意,如果您是使用 Ubuntu 来写出活动/安装程序映像,则必须使用 Startup Disk Creator 而不是 unetbootin 来完成,因为使用后者将不会生成可启动设备。此外,还提供了用于 Ubuntu、Windows 和 Mac OS X 的完整说明。

BootMenu_ea59151eea0a16f8fd8fcb252617259bdcf705e2.jpg

最初可能会浪费一点时间,因为 Intel Joule 在启动时无法识别 USB 闪存驱动器,可能是由于使用了 USB 集线器或存在其他不兼容情况。因此值得注意的是,还可以通过扩展板中的 Micro SD 卡来启动活动/安装程序映像。

WriteOut_74bab6bec3fe48f9ab72257e4ddca1f4b9c0c4cf.jpg

 

我们是从 Micro SD 启动的,然后将 Snappy Ubuntu Core 映像加载到 USB 驱动器上。此处要注意,SD 已枚举为 /dev/mmcblk0,因此 Joule 中的内部存储变成了 /dev/mmcblk1,使用命令来提取相应修改后的 Core 文件系统。

CoreBoot_b2c997dad2e09e8c3c0da345195d4e688a686e42.jpg

重新启动之后,可以看到 Ubuntu Core 已从 Joule 的内部存储中启动。

Network_d2af833235b9989b2c9fa4f9de05419e806f41a8.jpg

之后,我们得到提示,需要配置网络并输入应与此设备相关联的 Ubuntu SSO 帐户的电子邮件地址。

SSH 登录

AE_firstSSH_61e16421ab7ede8b791c30c0b022480b85e83035.jpg

 

设备接入网络之后,现在就可以使用 Ubuntu SSO ID 和显示的 IP 地址,通过配置后的已连接显示器来登录。

通过 SSH 登录之后,如需查看安装了哪些默认卡式应用程序,我们可以输入:

$ snap list

AE_first_snap-list_4c381a8ff785e39ea3136b823b54e79d92a77803.jpg

从此时开始,我们可以通过命令行安装更多卡式应用程序,或者也可以创建一个访问令牌,它允许我们使用更略微友好一些的 web 界面。

Snapweb

AE_Snapweb-access-control_4ab6fda56c68b3e19db4ef2f6601a363bc74541c.jpg

如果我们用 Web 浏览器指向设备 IP,并使用 https 前缀和 4201 的端口后缀,则可以进入 Snapweb 应用程序的访问控制页面。

AE_snapweb-generate-token_991357336960cb3cfb0b083b20424c624bffa54c.jpg

要生成用于登录 web 界面的令牌,我们必须在命令行中输入:

$ sudo snapweb.generate-token

AE_Snapweb-installed-snaps_8ee9f948ad4f4fc9d25e33ca202a4d09f312d00f.jpg

在登录之后,我们可以再次列出已安装的卡式应用程序,还可以搜索并安装卡式应用程序,例如为我们提供出色的 IoT 布线工具的 Node-RED。

AE_Snapweb-search-nodered_b6308be115836f9361020ab608c4401c03875cac.jpg

点击一下之后,我们就可以返回到终端,并使用 ps 来确认 Node-RED 是否正在运行。

AE_ps_nodered_7929c5d9f6c32b016e903d81de35253a154be4c4.jpg

如果我们随后将浏览器指向设备和端口 1880,则可以进入熟悉的编辑器。

AE_NodeRED_Editor_3402e7e3fe3ae81787b4b64ec58d90153ce97408.jpg

此时,即可开始创建新的 Node-RED 流(应用程序)。

将经典 Ubuntu 作为卡式应用程序

AE_InstallStartClassic_0bdf14aa2cd66fc1fde31df0f9ab909bcd8f2812.jpg

可以将经典 Ubuntu 操作系统实际安装成为卡式应用程序,并使用它和其他应用程序来允许在目标设备本身上进行开发。只需输入:

$ snap install classic --edge --devmode

$ sudo classic

AE_ClassicOSRelease_8d430c612252125c891f2f940675b714fc37ca2d.jpg

随后,我们即可进入 chroot 环境,并检查 /etc/os-release 文件的内容是否显示了这是 Ubuntu 16.04.02。

但是,有时候看上去在编写时似乎存在一些与当前经典卡式应用程序相关的问题,因为运行命令安装软件包导致出现了签名检查错误。因此,在运行经典 Ubuntu 的台式机上构建了一个示例卡式应用程序。

构建卡式应用程序

AE_JouleLimeSDR_b48e0e5a215ba03d3c01b32c1e293782c772eff0.jpg

 

构建卡式应用程序再简单不过了,只要利用 snapcraft 软件即可完成。此软件可以与 snapd(在经典 Classic Ubuntu 上运行卡式应用程序时也需要该软件)一起通过以下命令安装:

$ sudo apt-get install snapcraft snapd

安装 snapd 意味着您可以先在台式机系统上测试卡式应用程序,然后再将其复制到运行 Snappy Ubuntu Core 的目标设备上并在该处安装。

GitHub 上提供了一些用于 LimeSDR USB 3.0 软件定义无线电 (SDR) 平台的示例卡式应用程序。克隆了存储库,并且构建了 limesdr-server 卡式应用程序。这样就能在网络上透明地访问 LimeSDR 板了。

AE_Snapcraft_LimeSDRServer_ca524c228fcea4e1b1d5fc3915ee77b0d15d0e77.jpg

$ git clone https://github.com/myriadrf/snapcraft-sandbox.git

$ cd snapcraft-sandbox/limesdr-server

$ snapcraft

结果就是从 GitHub 中克隆主要应用程序软件及其所有依赖项目,并将其构建和包装为完全独立的应用程序。

AE_Snapped_74f7eda07f104423bb6e0c018e225a4f6ef6efab.jpg

随后可以使用以下命令来安装:

$ sudo snap install --force-dangerous --devmode soapysdr-server_0.5.3.0_amd64.snap

需要使用 --force-dangerous 选项,因为卡式应用程序并非通过应用商店交付,而是从不可信的来源(即文件系统)安装。--devmode 选项是一种临时解决方法,使卡式应用程序可以访问硬件外围设备(将会添加对热插拔外围设备和安全管理其访问的支持)。

 有关如何开始创建自己的卡式应用程序的详细信息,请参阅 Snapcraft 文档

定制商店、设备映像等等

AE_Advanced_Production_Model_f351885a6213cbe140730b0fdc2306c39c336591.jpg

Ubuntu Core 高级生产模型

对于卡式应用程序和 Ubuntu Core 的潜力,我们仅仅是浅尝辄止,仍有许多功能有待探索,包括创建可为特定硬件集成供应商支持的自定义 Ubuntu Core 映像,以及与设备映像链接的自定义“品牌”应用商店。

有关如何为新设备构建 Ubuntu Core 支持的详细信息以及集成自定义堆栈、设置品牌商店、生产模型等更多信息,请参阅 Ubuntu Core 文档

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.