Ubuntu 22.04 安装 Apache Mynewt 1.15.0 指南

在 Ubuntu 22.04 上构建 Apache Newt 1.15.0 工具链、创建 Mynewt 工程并完成 sim 目标构建与模拟运行的完整实测指南。

Apache MynewtMynewtApacheRTOS嵌入式安装部署Ubuntu 22.042026/10/15

Ubuntu 22.04 安装 Apache Mynewt 1.15.0 指南

目标:在一台 Ubuntu 22.04 服务器上安装 Apache Newt 1.15.0 构建工具,创建 Mynewt 工程、拉取 apache-mynewt-core 1.15.0 依赖仓库,并完成 blinky 应用 sim 目标的编译与模拟运行,全流程已在 Ubuntu 22.04 实测通过。

一、环境信息

项目内容
操作系统Ubuntu 22.04.5 LTS(内核 6.8.0-138-generic)
系统架构x86_64(amd64)
Go 工具链go1.24.10 linux/amd64(官方 tarball,SHA256 校验)
编译工具gcc 11.4.0、git 2.34.1、GNU Make
调试器gdb 12.1(newt run 依赖)
Newt 版本Apache Newt 1.15.0
核心仓库apache-mynewt-core 1.15.0(commit ea2b7ebf6b28,tag mynewt_1_15_0_tag)
工具安装位置/usr/local/bin/newt、/usr/local/go
工程目录/opt/mynewt/myproj

说明:Apache Mynewt 是面向低功耗物联网设备的 RTOS + 构建体系,由三部分组成——Newt(Go 语言编写的构建/包管理工具)、apache-mynewt-core(内核与驱动、BLE 协议栈 NimBLE 等)、以及应用代码。安装 Mynewt 实际上就是“装 newt + 初始化工程”两步。

💡 技术拓展:嵌入式构建系统怎么选?Newt 是 Mynewt 官方工具,把包管理(repos.yml)、配置系统(syscfg)、目标管理(targets)和交叉构建揉成一体;CMake/Make 通用性强但复现不了 Mynewt 的 syscfg 配置系统;Zephyr 的 west 与 newt 定位最接近但生态不同。本文采用 Newt 1.15.0(Mynewt 唯一官方构建入口)。另外注意:newt 在 GitHub 上没有发布预编译二进制 release(实测该仓库 releases 接口返回空数组),因此安装路径只有“Go 构建”一条,下文按官方发行包与 git tag 两种来源各给一条实测路径。

二、前置条件与软件包准备

2.1 安装基础工具

apt-get update
apt-get install -y git wget curl build-essential unzip gdb

回显(输出节选):

Setting up gdb (12.1-0ubuntu1~22.04.2) ...

验证:

gcc --version | head -1
git --version

回显:

gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0
git version 2.34.1

解说:build-essential 提供编译模拟器目标所需的宿主 gcc;gdb 是 newt run 的硬依赖(native BSP 的运行脚本用 gdb 启动固件),必须安装;git 既是 newt 克隆模板用,也是 newt upgrade 拉取仓库用的。

2.2 版本选型说明

newt 1.15.0 的 go.mod 声明需要 go ≥ 1.24.0(实测源码 go.mod 内容为 go 1.24.0,并带 toolchain go1.24.10 指令),而 Ubuntu 22.04 apt 仓库中的 golang-go 为 1.18,无法编译 newt 1.15.0,因此必须安装上游 Go 工具链。Mynewt 组件版本对应关系:newt 1.15.0 ↔ apache-mynewt-core 1.15.0 ↔ nimble 1.10.0 ↔ mcuboot 2.1.0(newt info 实测输出,见 5.3 节)。

三、安装 Go 1.24 工具链(两方案共用的前置步骤)

cd /opt
wget https://go.dev/dl/go1.24.10.linux-amd64.tar.gz
echo "dd52b974e3d9c5a7bbfb222c685806def6be5d6f7efd10f9caa9ca1fa2f47955  go1.24.10.linux-amd64.tar.gz" | sha256sum -c
tar xzf go1.24.10.linux-amd64.tar.gz -C /usr/local
/usr/local/go/bin/go version

回显:

go1.24.10.linux-amd64.tar.gz: OK
go version go1.24.10 linux/amd64

解说:SHA256 值取自 go.dev 官方下载页 JSON 接口(https://go.dev/dl/?mode=json&include=all 中 go1.24.10.linux-amd64.tar.gz 的 sha256 字段),实测校验通过;解压到 /usr/local/go 后把 /usr/local/go/bin 加入 PATH(可写入 /etc/profile.d/go.sh)。

四、安装 Newt(多方案)

4.1 方案 A:Apache 官方发行包构建(推荐)

Mynewt 1.15.0 官方发行页 https://dlcdn.apache.org/mynewt/apache-mynewt-1.15.0/ 提供 newt 源码包及 .sha512 校验文件:

mkdir -p /opt/mynewt /tmp/newtb && cd /tmp/newtb
wget https://dlcdn.apache.org/mynewt/apache-mynewt-1.15.0/apache-mynewt-newt-1.15.0.tgz
wget https://dlcdn.apache.org/mynewt/apache-mynewt-1.15.0/apache-mynewt-newt-1.15.0.tgz.sha512

校验:官方 .sha512 文件内容是多行、无标准文件名前缀的摘要格式,sha512sum -c 无法直接解析(实测报 no properly formatted SHA512 checksum lines found),需拼接后与实测值比对:

REF=$(tr -d ' \n' < apache-mynewt-newt-1.15.0.tgz.sha512 | sed 's/apache-mynewt-newt-1.15.0.tgz://')
ACT=$(sha512sum apache-mynewt-newt-1.15.0.tgz | cut -d' ' -f1)
echo "$REF"; echo "$ACT"

回显:

apache-mynewt-newt-1.15.0.tgz:C5FC1DF31907DF5D5F19E442A71EAAF3C8546E7950146658B51C25A54B2A9AD59EBFF702F9E2AAB1D6500FF6D4A1A94CF0188605A265EA7686D1CA12BD068728
c5fc1df31907df5d5f19e442a71eaaf3c8546e7950146658b51c25a54b2a9ad59ebff702f9e2aab1d6500ff6d4a1a94cf0188605a265ea7686d1ca12bd068728

解说:两者仅大小写差异(官方文件为大写十六进制,sha512sum 输出小写),比对时统一大小写后一致,校验通过。

解压并构建:

tar xzf apache-mynewt-newt-1.15.0.tgz
cd apache-mynewt-newt-1.15.0/newt
export PATH=$PATH:/usr/local/go/bin GOPROXY=https://goproxy.cn,direct
go build -o /usr/local/bin/newt .
newt version

回显:

Apache Newt 1.15.0 / unknown / unknown

解说:源码包内主模块目录为 newt/(含 main.go);GOPROXY 指向 goproxy.cn 加速 Go 模块下载(网络受限环境也可配合 https_proxy 使用);version 输出中两个 unknown 是版本编译信息(可通过 ldflags 注入,不影响功能)。

4.2 方案 B:GitHub tag 源码构建(备用)

cd /opt/mynewt
export https_proxy=http://192.168.1.62:7897
git clone --branch mynewt_1_15_0_tag --depth 1 https://github.com/apache/mynewt-newt.git newt-src
cd newt-src/newt
export PATH=$PATH:/usr/local/go/bin GOPROXY=https://goproxy.cn,direct
go build -o /usr/local/bin/newt .

回显(输出节选):

Cloning into 'newt-src'...
remote: Enumerating objects: 864, done.
Receiving objects: 100% (864/864), 1.30 MiB | 267.00 KiB/s, done.

验证:newt version 同样输出 Apache Newt 1.15.0。两个方案产物一致,选哪个取决于网络可达性:能直连 dlcdn 用方案 A(有官方校验文件);仅能走代理访问 GitHub 用方案 B。

五、创建工程与拉取依赖仓库

5.1 newt new 初始化工程

cd /opt/mynewt
export https_proxy=http://192.168.1.62:7897
newt new myproj
cd myproj
ls

回显:

Downloading project skeleton from apache/mynewt-blinky...
Installing skeleton in myproj ...
Downloading project skeleton from apache/mynewt-blinky... ok
Saved new Mynewt Project to /opt/mynewt/myproj
apps  bin  pkg.yml  project.state  project.yml  repos.yml  targets  unittest

解说:newt new 从 GitHub 克隆 apache/mynewt-blinky 模板(tag mynewt_1_15_0_tag),生成含 blinky 应用、my_blinky_sim 目标与单元测试骨架的工程。此步需要访问 GitHub,无代理环境下实测报 GnuTLS 错误,必须先 export 代理。

5.2 工程配置文件解读

cat repos.yml
head -30 project.yml

回显:

repository:
    name: apache-mynewt-blinky
    type: github
    vers: mynewt_1_15_0_tag

repository.apache-mynewt-core:
    type: github
    user: apache
    repo: mynewt-core
    vers: 1.15.0
project.name: "myproj"
project.pkgs:
    - apps/blinky
    - targets/my_blinky_sim
    - unittests/all

repository.mynewt-core:
    type: github
    user: apache
    repo: mynewt-core
    vers: 1.15.0

解说:repos.yml 声明依赖仓库与版本锚点,project.yml 声明工程组成;模板已把 apache-mynewt-core 固定在 1.15.0,正合本文目标。这两个文件是 newt 的“包清单”。

5.3 拉取依赖仓库:newt upgrade

注意:老版本教程里的 newt install 在 1.15.0 中已不存在(实测 newt help 命令表只有 upgrade),安装/升级依赖统一用 newt upgrade:

newt upgrade

回显(输出节选):

apache-mynewt-core successfully installed version 1.15.0

解说:首次执行会克隆 49 个仓库(core、nimble、mcumgr、mcuboot 及各芯片 HAL),耗时几分钟且需要 GitHub 访问。完成后 newt info 可核对版本锚点:

newt info

回显(输出节选):

Repository info:
    * apache-mynewt-core: ea2b7ebf6b285a2e293c4f172cbdeae7f2b6e8f3, 1.15.0 (rc)
    * apache-mynewt-mcumgr: 1967cffc2dc9036f4709e368a6954e958efd466e, 0.7.0
    * apache-mynewt-nimble: a7a156f28954819e158b62dd613008f22f9cf73b, 1.10.0 (rc)
    * mcuboot: 9c99326b9756dbcc35b524636d99ed5f3e6cb29b, 2.1.0

解说:core 实际 checkout 在 tag mynewt_1_15_0_tag(commit ea2b7ebf),"1.15.0 (rc)" 是仓库描述字符串,即 1.15.0 发行锚点。

六、验证安装:构建并运行 sim 目标

6.1 构建模拟器目标

newt build my_blinky_sim

回显(输出节选):

Building target targets/my_blinky_sim
Compiling apps/blinky/src/main.c ...
Linking /opt/mynewt/myproj/bin/targets/my_blinky_sim/app/apps/blinky/blinky.elf
Target successfully built: targets/my_blinky_sim

解说:sim 目标使用 apache-mynewt-core 自带的 hw/bsp/native BSP,把 RTOS 编译为宿主 Linux 可执行文件,用于无硬件开发调试。

6.2 运行模拟器

newt run 通过 gdb 启动(进入 gdb 提示符后输入 run 即可);日常验证直接执行产物更直观:

timeout 5 bin/targets/my_blinky_sim/app/apps/blinky/blinky.elf

回显:

uart0 at /dev/pts/0

解说:模拟器把 UART0 映射到一个伪终端,应用的控制台输出(blinky 的 LED 翻转打印)走该伪终端。用字符设备参数可捕获输出,完整方法见本系列《Apache Mynewt 1.15.0 应用开发与模拟器实战详解》:

timeout 15 python3 simcap.py bin/targets/my_blinky_sim/app/apps/blinky/blinky.elf 6

回显(输出节选):

hal_gpio set pin 1 to 1
hal_gpio set pin 1 to 0
hal_gpio set pin 1 to 1

解说:每秒一条 LED 翻转打印,说明 blinky 任务在模拟器中按预期调度运行,安装验证完成。

七、安装方案对比

维度方案 A:官方发行包构建方案 B:GitHub tag 构建apt golang-go 直接编译
来源可信度dlcdn 官方 + sha512 校验GitHub 官方仓库 tag—
网络要求可访问 dlcdn(可代理)需访问 GitHub(可代理)无
Go 版本要求1.24+(toolchain 1.24.10)同左1.18 不满足,实测不可行
校验文件有(.sha512,需手工比对格式)git tag 天然锚定—
产物/usr/local/bin/newt(1.15.0)同左—
实测结论通过通过失败(go 版本过低)

解说:apt 方案在 go build 阶段因 go.mod 要求 1.24.0 而失败,仅列出作对照;两可行方案产物一致,按网络条件选择。

八、常见问题(FAQ)

Q1:为什么没有 newt 的预编译二进制可下载? A:实测 apache/mynewt-newt 的 GitHub releases 接口返回空数组,官方从未发布过二进制;发行页只有源码包 apache-mynewt-newt-1.15.0.tgz。安装 newt 必须经 Go 构建,无捷径。

Q2:go build 报 requires go >= 1.24.0? A:newt 1.15.0 的 go.mod 明确要求 go 1.24.0(master 分支甚至要求 1.25.0)。Ubuntu 22.04 apt 的 go 1.18 不满足,必须按第三章安装官方 Go 1.24 工具链。Go tarball 的 SHA256 以 go.dev/dl 页面 JSON 为准。

Q3:go build 卡在下载依赖或报 timeout? A:设置 GOPROXY=https://goproxy.cn,direct(国内可达)或 export https_proxy=http://192.168.1.62:7897 走代理;两者也可同时使用,Go 会优先走 GOPROXY。

Q4:newt new 报 GnuTLS 错误或克隆失败? A:newt new 需要克隆 apache/mynewt-blinky 模板,走的是 git 的 HTTPS。无代理网络下实测报 GnuTLS recv error;先 export https_proxy=... 再执行即可。

Q5:执行 newt install 提示 unknown command? A:1.15.0 移除了 install 子命令,依赖安装/升级统一为 newt upgrade(实测 newt help 命令表确认)。网上老教程的 newt install 请一律替换为 newt upgrade。

Q6:newt build 正常但 newt run 报 gdb not found? A:不影响 build;只影响 newt run(native BSP 的运行脚本 native_debug.sh 用 gdb 启动)。实测缺 gdb 时 newt run 退出码 127 并报 gdb: not found,apt install gdb 后恢复。

Q7:newt info 显示 1.15.0 (rc),装到的是正式版吗? A:是。repos.yml 锚定 vers 1.15.0,newt upgrade 实际 checkout 到 tag mynewt_1_15_0_tag(commit ea2b7ebf),"(rc)" 是仓库 RELEASE_NOTES 中的历史描述字符串,以 tag 为准。

Q8:工程目录里 bin/ 是什么?可以删吗? A:newt build 的输出目录,按 bin/targets/<目标名>/app/... 组织,blinky.elf 就在其中。可 newt clean 清除重建,或手工 rm -rf bin,不影响工程源文件。

Q9:可以把 newt 和工程装到别的路径吗? A:可以。newt 二进制位置任意(放 /usr/local/bin 即可全局调用);工程目录任意(本文用 /opt/mynewt/myproj),newt 命令在工程目录内执行时按目录向上查找 project.yml。

Q10:如何卸载? A:见下节。

九、卸载

rm -f /usr/local/bin/newt
rm -rf /opt/mynewt /tmp/newtb
rm -rf /usr/local/go

解说:newt 是单文件二进制、工程与 Go 工具链都是独立目录,删除即卸载;如曾写入 PATH 配置文件(/etc/profile.d/go.sh),一并清理。

十、参考链接