软件包管理器: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 下载仍未实现(见「边界与未实现」)。
本页所有「✅ 已实现」都对应内核里真实跑通的命令(QEMU 实测);所有「🚧 未实现」都如实标注,绝不当成成品。
快速上手:用本地源装一个包(3 步)✅
pkg 的 install 从本地源目录读取,不联网。下面以把内置的 packages/repo/ 模板作为源为例:把源目录放到 /home/pkgrepo,确认 /etc/pkg.conf 里的 sourcedir,然后 pkg install。
- 1. 放源目录 /home/pkgrepo 含 *.tncr + *.manifest
- 2. 确认配置 /etc/pkg.conf: sourcedir
- 3. pkg install 校验通过 → /bin/<name>.TNCR
入口命令
# 1) 把 packages/repo/ 放到 TinyOS 的本地源目录(默认 /home/pkgrepo)
# 该目录需含 <name>.tncr(产物)+ <name>.manifest(描述)
# 2) 确认 /etc/pkg.conf 里的 sourcedir 指向它
# pkg.conf.example 内容: sourcedir /home/pkgrepo
# 3) 安装
pkg install tinysh
源目录不存在时会明确报错
若 /home/pkgrepo 还没准备好,pkg install 不会静默失败,而是打印 pkg: source dir missing: /home/pkgrepo,提示你先把源目录放到位。
子命令参考表(7 个)✅
全部 7 个子命令均已在内核实现,下面的说明与例子对应 QEMU 实测行为。
| 命令 | 说明 | 例子 |
|---|---|---|
| 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 |
实测到的真实输出(引用)
root@tinyos:/root# pkg list NAME VERSION SIZE JVM ? 5851 tinysh ? 104144 LUA ? 210584 CC ? 162680 EDIT ? 45980 SSHD ? 114500 cpp_demo ? 339 ... root@tinyos:/root# pkg info tinysh package: tinysh version : ? source : (unregistered: only raw /bin file present) size : 104144 bytes sha256 : a35a67bc938e91434a3c0e2ac86688e14d95ce948f3e2a7eb6442be7fdb02bda verify : no recorded sha256 root@tinyos:/root# pkg verify NAME RESULT tinysh no sha256 recorded (actual a35a67bc...) root@tinyos:/root# pkg install nosuchpkg pkg: package file not found: /home/pkgrepo/nosuchpkg.[tT]NCR root@tinyos:/root# pkg remove tinysh pkg: removed tinysh
为什么 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 校验值
sha256: a35a67bc938e91434a3c0e2ac86688e14d95ce948f3e2a7eb6442be7fdb02bda
size : 104144 bytes (file: tinysh.TNCR)
这个值是 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>。
源目录结构
<sourcedir>/
├─ <name>.tncr # 产物(二进制,扩展名大小写均可)
└─ <name>.manifest # 包描述:含 sha256 等字段
# 例:/home/pkgrepo/tinysh.tncr + /home/pkgrepo/tinysh.manifest
/etc/pkg.conf 配置
# /etc/pkg.conf
sourcedir /home/pkgrepo
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 下,内核挂载后直接可执行。
- tools/build_users.py 交叉编译用户程序 → .TNCR
- tools/mkromfs.py 打包压缩进 romfs
- kernel boot 挂载 romfs 到 VFS
- /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 已填真)✅
name: tinysh
version: v0.1
description: TinyOS Genesis 默认 Shell(/bin/tinysh.tncr)
dependencies: []
min_compiler: tncr>=0.1
sha256: a35a67bc938e91434a3c0e2ac86688e14d95ce948f3e2a7eb6442be7fdb02bda
build:
entry: src/tinysh.c
output: /bin/tinysh.tncr
cmd: zig cc -std=c11 -DTINYOS_USER -o tinysh.tncr src/tinysh.c src/kernel_api_tinyos.c