软件包管理器:pkg 命令已实现

v0.1 的 pkg 命令刚实现完:7 个子命令、带 SHA256 校验,从本地源目录安装。下面把「已实现」与「未实现」分得清清楚楚 —— 远程下载、依赖解析仍属未实现。本页如实标注每一条状态。

状态横幅:✅ pkg 已实现(v0.1)

✅ v0.1 已实现 pkg 命令

已在 src/kernel/shell.c 中实现(新增约 347 行),编译通过、QEMU 实测可用。提供 7 个子命令:help / list / info / verify / install / remove / source,安装与校验均复用内核的 SHA256。注意:install 走本地源目录,不是网络下载 —— 远程 HTTP/HTTPS 下载仍未实现(见「边界与未实现」)。

✅ 已实现 / Done 🚧 未实现 / Not yet

本页所有「✅ 已实现」都对应内核里真实跑通的命令(QEMU 实测);所有「🚧 未实现」都如实标注,绝不当成成品。

快速上手:用本地源装一个包(3 步)✅

pkg 的 install 从本地源目录读取,不联网。下面以把内置的 packages/repo/ 模板作为源为例:把源目录放到 /home/pkgrepo,确认 /etc/pkg.conf 里的 sourcedir,然后 pkg install。

  1. 1. 放源目录 /home/pkgrepo 含 *.tncr + *.manifest
  2. 2. 确认配置 /etc/pkg.conf: sourcedir
  3. 3. pkg install 校验通过 → /bin/<name>.TNCR

入口命令

源目录不存在时会明确报错

若 /home/pkgrepo 还没准备好,pkg install 不会静默失败,而是打印 pkg: source dir missing: /home/pkgrepo,提示你先把源目录放到位。

子命令参考表(7 个)✅

全部 7 个子命令均已在内核实现,下面的说明与例子对应 QEMU 实测行为。

pkg 子命令清单(命令与字段名均为英文,固定不变)
命令 说明 例子
pkg help 打印用法说明。 pkg help
pkg list 列出已安装包:扫描 /bin/*.TNCR 与 /etc/packages.d/ 里的登记记录。 pkg list
pkg info <name> 详情:版本、大小、来源、sha256 及其校验状态。 pkg info tinysh
pkg verify [name] 用 SHA256 校验已安装包,输出 OK / MISMATCH(省略 name 则全部)。 pkg verify
pkg install <name> 从本地源目录安装:读 manifest 的 sha256、对源二进制算实际值比对,通过则写入 /bin/<name>.TNCR 并登记到 /etc/packages.d/<name>。 pkg install tinysh
pkg remove <name> 卸载:删文件 + 清记录。 pkg remove tinysh
pkg source 显示 / 切换软件源(配置位于 /etc/pkg.conf)。 pkg source

实测到的真实输出(引用)

为什么 VERSION 显示 ?、[tT]NCR 是什么

pkg list 里 VERSION 显示 ?,是因为这些包是随镜像内置的、未经 pkg 登记(info 里也写作 unregistered: only raw /bin file present)。报错里的 [tT]NCR 是“兼容大小写扩展名”的写法:源文件既可以是 .tncr 也可以是 .TNCR。这两点都如实说明,不影响功能。

SHA256 校验:供应链安全的底座 ✅

pkg 的 install 与 verify 都做 SHA256 比对,确保装进系统的二进制跟源里登记的一致。这是真实的实现,不是占位。

为什么重要

软件包从源到 /bin 之间若被改动(传输截断、源被替换、磁盘损坏),肉眼看不出来。SHA256 在落盘前先算一遍、跟 manifest 登记值比对,从源头拦截“装了个不一样的包”。这是供应链安全的基本盘。

它是真怎么工作的

复用内核 src/kernel/sha256.c 里的 sha256_init / sha256_update / sha256_final / sha256_hex。

  • install 时

    读 manifest 的 sha256 字段,对源二进制算实际值比对;不符则报 pkg: sha256 mismatch: <name>,绝不写入。

  • verify 时

    同样比对 /etc/packages.d/<name> 里登记的值,输出 OK 或 MISMATCH。

实测的 tinysh 校验值

这个值是 QEMU 实测算出的真实哈希,已回填进 packages/tinysh/tinysh.manifest 的 sha256 字段。因此对 tinysh 而言,install 与 verify 都能做真正的完整性校验。

本地源目录:结构、配置与模板 ✅

install 从一个可配置的本地目录读取,默认 /home/pkgrepo,可在 /etc/pkg.conf 的 sourcedir 里改。源目录里要放:<name>.tncr(产物)+ <name>.manifest(描述)。校验通过后写入 /bin/<name>.TNCR 并登记到 /etc/packages.d/<name>。

源目录结构

/etc/pkg.conf 配置

packages/repo/ 模板已就绪 ✅

仓库里新增了 packages/repo/,是一份可直接当作 sourcedir 使用的完整内容模板:

  • tinysh.tncr

    真实的 104144 字节产物(与镜像内 /bin/tinysh.TNCR 一致)。

  • tinysh.manifest

    与 packages/tinysh/tinysh.manifest 一致,sha256 已是真实值。

  • pkg.conf.example

    /etc/pkg.conf 示例(sourcedir /home/pkgrepo)。

  • README.md

    用法说明。

用法

把 packages/repo/ 整个目录放到 TinyOS 的 /home/pkgrepo,然后执行 pkg install tinysh 即可完成一次带 SHA256 校验的本地安装。

v0.1 内置包仍走 romfs 路线 ✅

pkg 只能装“你放进源目录的包”。系统随镜像自带的那一批(lua、tinysh、sshd、CC、EDIT、JVM 等)其实来自只读文件系统 romfs,与 pkg 无关 —— 它们已经作为 .TNCR 躺在 /bin 下,内核挂载后直接可执行。

  1. tools/build_users.py 交叉编译用户程序 → .TNCR
  2. tools/mkromfs.py 打包压缩进 romfs
  3. kernel boot 挂载 romfs 到 VFS
  4. /bin/*.TNCR 直接可执行

一条命令就能用,靠的是 romfs 不是 pkg

lua、tinysh、sshd、CC、EDIT 等之所以“装好即用”,是因为它们已经作为 .TNCR 在 romfs 的 /bin 下,内核挂载后直接可执行。这与 pkg 命令无关 —— pkg 是用来叠加安装你自己的本地包的。

边界与未实现 🚧

诚实区:下面这些在 v0.1 里仍是未实现。不要把它们当成已可用功能。

🚧 GitHub 直连:CONNECT 隧道已实现,TLS 尚未实现

内核已有最小 HTTP/1.1 客户端与 CONNECT 代理支持,但 GitHub 强制 HTTPS。

TLS 明确未实现:内核只有 SHA-256,缺 AES/GCM/X25519 与 X.509 校验。宁可返回 notls,也不做跳过证书验证的伪 TLS。

配置:/etc/pkg.conf 里填 https_proxy_host 与 https_proxy_port。

  • 🚧 依赖解析未实现

    manifest 里 dependencies 字段已经定义,但 pkg 不会自动拉取或检查依赖。装上 A 时不会自动装它依赖的 B;依赖关系现在只是“被记录”,不被“被执行”。

  • 🚧 版本显示 ? 的原因

    随镜像内置的包未经 pkg 登记,pkg list / pkg info 拿不到版本,于是显示 ?,info 注为 unregistered: only raw /bin file present。这是数据缺失,不是 bug。

  • 🚧 三个包仍是空壳

    tncr / web-admin-panel / demos 三个目录没有产物,其 manifest 的 sha256 仍是 __BUILD_FILL__ 占位符。因此它们无法被 pkg 真正校验安装 —— 只有 tinysh 目前拥有真实的 104144 字节产物与真实 sha256。

软件包列表:点开看详情

packages/ 下每个包都可以点开,展开它的 manifest 字段、产物体积、校验和与逐文件清单。下面的数据直接来自仓库里的 manifest 与构建产物,不是手写的介绍文字。

真实示例:packages/tinysh/tinysh.manifest(逐字,sha256 已填真)✅