跳转到内容

获取发布版:发布了什么,以及如何校验

Mica OS 通过 micaoss/mica-build 的 GitHub Release 发布。全部可匿名获取: 不需要 token,也不需要登录镜像仓库。一个发布就是一个产品:

发布 标签 携带
产品发布 <board>.<variant>.<YYYYMMDD-HHMM> mica-<board>.<variant>-<stamp>.img.gz、它的 .micaupd 归档、mica-build.lock、SHA256SUMS

每个产品各自发布,所以没有可以作为入口的索引:一个产品的最新发布,就是以 <board>.<variant>. 开头的最新标签。

**同样的文件也在资源服务上。**发布流程会把每个发布推送过去(mica-build:README.md): 文件在 https://dl.res.micaos.dev/mica/<board>.<variant>/<stamp>/<asset>,旁边是这个发布 自己的 index.json,列出每个文件的大小与摘要; 更新根 https://res.micaos.dev/update/ 下的清单给出每个产品的当前发布。官网下载页和设备 读的就是这些;被管理员在那里删除的发布,两边都不再有。

status: shipped — evidence: docs/reference/release-lock.md, mica-build:README.md, mica-build:boards/products.md

每块板都是发布目标。它的产品有:uefi-x64、uefi-arm64、cx3576、s905x5m、 mini-x64 与 qemu-armhf 上默认的 <board>.basic;uefi-x64、uefi-arm64 与 cx3576 上带容器引擎的 <board>.full;以 Docker 为引擎的 uefi-x64.docker;以及 s905x5m.emmc-full 与 s905x5m.sd-full,该板分别用于 eMMC 和 SD 卡的带容器产品。其中哪些有发布,见 下载页;没有发布的产品没有可下载的东西,需要从源码构建 (构建指南)。dev 产品只在本地 构建、从不发布;没有 minimal 产品。

2026-10-21 这一轮发布了下列产品,全部带 core 0.0.3(core 集 core.general.20261021-2254):

产品 时间戳 内容
cx3576.full 20261021-2257 systemd、容器、WiFi 与蓝牙:出厂接入点、BLE 配网
s905x5m.sd-full 20261021-2318 同上,用于 SD 卡
s905x5m.emmc-full 20261021-2335 同上,用于 eMMC
uefi-x64.full 20261021-2316 systemd、Podman,无无线电
uefi-x64.docker 20261021-2338 systemd、Docker,无无线电
mini-x64.basic 20261021-2317 OpenRC、管理平面与 SSH,无控制台
qemu-armhf.basic 20261021-2319 OpenRC、管理平面与 SSH,无控制台

status: shipped — evidence: mica-build:boards/products.md, mica-core:docs/mica-core.md

发布了的镜像不等于被启动过的镜像。cx3576 与 s905x5m 的产品没有任何自动流程会 启动它们,因为没有任何套件会启动产品的 FIT 镜像(板卡状态)。 每个 amd64 产品(uefi-x64.*、mini-x64.basic)都会在它的发布流程里被启动,uefi-arm64 的 产品有手工跑的 QEMU 记录(构建门第 4 节)。是发布 目标只意味着镜像被构建并发布,不是对硬件的断言 (支持层级)。

一个发布携带:

  • mica-<board>.<variant>-<stamp>.img.gz——出厂磁盘镜像,gzip 压缩。不上传裸 .img。
  • mica-<board>.<variant>-<stamp>.micaupd——完整更新归档,总是有。
  • .root.micaupd 与 .kernel.micaupd——部分更新归档,当它们省略的组件自该产品上一个 发布以来没有变化时才有(更新包)。
  • mica-build.lock 与列出它的 SHA256SUMS。

status: shipped — evidence: mica-build:boards/products.md, docs/operate/updates.md, docs/hardware/README.md

终端窗口
PRODUCT=uefi-x64.full
TAG=$(curl -fsSL "https://api.github.com/repos/micaoss/mica-build/releases?per_page=100" \
| jq -r --arg p "$PRODUCT." '[.[] | select(.draft == false and (.tag_name | startswith($p)))][0].tag_name')
echo "$TAG" # uefi-x64.full.<YYYYMMDD-HHMM>

GitHub API 按从新到旧列出发布。gh release list -R micaoss/mica-build 给出同一份列表。

status: shipped — evidence: mica-build:README.md

终端窗口
REL=https://github.com/micaoss/mica-build/releases/download/$TAG
STAMP=${TAG##*.}
curl -fsSLO "$REL/SHA256SUMS"
curl -fsSLO "$REL/mica-build.lock"
curl -fsSLO "$REL/mica-$PRODUCT-$STAMP.img.gz"
sha256sum -c SHA256SUMS # 列出的是 lock
awk -F'\t' '$1 == "asset" && $5 == "mica-'"$PRODUCT-$STAMP"'.img.gz" {print $6 " " $5}' mica-build.lock \
| sha256sum -c - # lock 写明了镜像的 sha256

校验链是 SHA256SUMS → lock → asset 行的 sha256 → 文件 (发布锁 1.2.2)。

status: shipped — evidence: mica-build:src/release/scoped.ts, docs/reference/release-lock.md

一份镜像有三处相互独立的陈述,在不同的地方核对:

  1. SHA256SUMS 只列出 lock;sha256sum SHA256SUMS 是这个发布的信任哈希, 消费这个发布的 lock 引用的就是它。
  2. lock 的 asset 行写明压缩文件的摘要:
    终端窗口
    awk -F'\t' '$1 == "asset" && $2 == "'"$PRODUCT"'"' mica-build.lock
  3. OCI 层携带同一个文件,可匿名读取:层摘要等于 asset 行的 sha256,它的 mica.uncompressed-sha256 与 mica.uncompressed-size 注解就是 gzip -dc 的产物:
    终端窗口
    REF=$(awk -F'\t' '$1 == "bundle" && $2 == "'"$PRODUCT"'" && $3 == "image" {print $4}' mica-build.lock)
    T=$(curl -fsS "https://ghcr.io/token?scope=repository:micaoss/mica-build:pull&service=ghcr.io" | jq -r .token)
    curl -fsSL -H "Authorization: Bearer $T" \
    -H 'Accept: application/vnd.oci.image.manifest.v1+json' \
    "https://ghcr.io/v2/micaoss/mica-build/manifests/${REF##*@}" | jq '.layers'
    gzip -dc "mica-$PRODUCT-$STAMP.img.gz" | sha256sum

status: shipped — evidence: mica-build:src/release/scoped.ts, docs/reference/release-lock.md

lock 是一份 mica-lock v1 文件,写明发布的提交,以及进入它的每一项输入:板卡的池、 软件包与组件,mica-build-env、mica-system-base、mica-core、mica-pkgs、mica-podman 与 mica-docker 的 输入发布及其信任哈希,以及产品的签名部署、bundle 与资产 (发布锁 1.2.2)。

文件旁边的校验和只证明文件完整到达。让一份镜像可信的,是它里面的签名链 (发布签名)以及平台信任那个签名者;上面的哈希 是完整性的一半,不是真实性的一半。

status: shipped — evidence: docs/reference/release-lock.md, docs/security/signing.md

  • 把镜像写进板卡:刷写。
  • 改为更新一台正在运行的设备:更新包。
  • 自己构建同样的产物:构建指南。
  • 发布怎么切、什么决定重建:发布。

status: shipped — evidence: docs/start/flashing.md, docs/operate/updates.md, docs/start/build.md, docs/releases/how-releases-work.md