Skip to content
qwert702Public

About

An operating system built from the Linux kernel up in Rust: custom init, compositor, terminal, and an AI assistant with per-tool permission gating. Bootable ISO, ~41 MB.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Repository files navigation

AetherOS

English · 中文 | 下载 ISO(41.0 MB) | 落地页 | 文档导航 | 装软件指南

一个自研的操作系统:Linux 内核 + 全自研 Rust 用户态 + AI 中枢。

内核不重写 —— Android、ChromeOS 都用 Linux 内核,重写它没有差异化价值。力气全放在内核之上: 从 PID 1 到窗口合成器、终端、中文输入法、AI 中枢,没有一行现成的桌面组件。

规模 合计 52,544 行 Rust / 77 个源文件 / 7 个 crate(2026-10-11 实测)
验证 793 项单元测试全绿 · Windows 侧 0 编译警告、musl 侧 6/7 crate 0 警告(aetherd 受 ring 交叉编译限制查不了)· 连续 12 小时 43 分不崩 · 权限链路端到端实证
产物 可引导 ISO 约 41.0 MB,QEMU / VirtualBox / VMware 三个平台都实测开机过

桌面(明亮主题)

演示:从宿主拉包 → 安装 htop → 在桌面里运行

上面这段是真机录屏(QEMU 逐帧抓取,未剪辑):在终端敲一行 wget -O- http://10.0.2.2/i|sh,从宿主拉下应用包,aetherd 装好 htop,再敲 htop 就在桌面里跑起来了。

这个项目的几个特别之处

  • 整条用户态都是自己写的。 窗口合成器走 fbdev 软件光栅化(不依赖 GPU),VT/ANSI 解析器、 PTY 胶合层、中文输入法、PID 1、IPC 协议、磁盘安装器全部自研 —— 7 个 crate 里没有一行是 拿现成桌面组件拼出来的。
  • AI 是系统的一等公民,不是聊天窗口。 aetherd 常驻,16 个工具能真的操作这台机器; 简单指令走离线规则通道(不调模型),复杂请求才进 LLM,并按隐私与复杂度在本地/云端混合路由。
  • 权限模型是设计得最细的一块。 L0–L3 分级 + 确认令牌(绑定工具与参数、5 分钟过期、用后即废)
    • 6 种审计裁决值 + 拒绝冷却。其中 「敏感输出强制本地」 尤其关键:read_file / clipboard_read 的结果一旦进入上下文,后续轮次就被钉在本地、不再上云。这条链不是推断 —— 外泄路径是用两个假 LLM 端点 + canary 文件端到端证明的(13 字输入、两次读文件, 云端端点确实收到了 canary),修复后的行为由 router 的两条单测钉住。
  • 连字体都自己带。 桌面用 Noto Sans CJK SC 子集(GB2312 + 拉丁 + 标点,约 5.7 MB,含真粗体)—— 不是「粗体=正文字体」的伪粗。
  • 可验证,而不是"我觉得没问题"。 除 793 项单测外,还有 57 档 --shot 的逐字节回归门禁 (差异 > 0.02% 即失败)、12 小时 43 分的稳定性长跑(3053 轮巡检:服务退出 0 / 自动重启 0 / panic 0,内存无泄漏趋势)、四轮代码审查且未修项归零。
  • 真能装应用。 在没有任何包管理器的系统上做了自己的应用包格式(清单 + 依赖预检), 装完 /usr/local/bin 里能直接敲,Dock 里也会多出一个图标,点一下开终端把它跑起来。

快速开始

不需要虚拟机就能预览桌面:

git clone https://github.com/qwert702/AetherOS.git
cd AetherOS

cargo run -p aether-compositor                     # 交互预览(默认明亮主题)
cargo run -p aether-compositor -- --theme dark     # 深空主题
cargo run -p aether-compositor -- --shot 2         # 单帧截图自检
cargo test --workspace                             # 单元测试(Windows 793 项,见「测试与验证」)

构建可引导 ISO 需要一台 Linux 构建机(Buildroot),见 platform/README.md。 在 Windows 开发机上 cargo 要加 --offline,否则会卡在 registry 访问。

现在能做什么

  • 桌面:四种布局(自由 / 两列 / 三列 / 独占)、拖边吸附、窗口缩放、明暗双主题。 稳态帧耗时从 91 ms 优化到 15.5 ms
  • 终端:真 PTY,VT/ANSI 解析器自研(29 项单测,纯逻辑、跨平台可测)
  • 中文输入:自研输入法,自建词表约 100 条(体积可忽略、无许可负担),Ctrl+Space 切换, 指令条和终端都已接
  • AI 中枢:aetherd 常驻。意图 → 路由 → 工具(最多 4 轮)→ 权限闸门 → 审计
  • 系统:aether-init 作 PID 1,服务白名单 + 拓扑排序 + 指数退避重启 + 僵尸收割; 持久化分区;整盘安装器
  • AI 运维:aether-ops 每 15 秒巡检,异常服务自动重启,故障诊断报告落盘

中文输入法

边界在哪

写清楚是为了免得误用,不是自我否定 —— 完整清单见 docs/交接报告(HANDOVER)-2026-09-11.md 与 代码索引(INDEX)-2026-09-11.md 的「已知缺口」。

  • 阶段定位:现在是"每个子系统都真跑通了",还不是"能替代你桌面"。当日常系统用还早
  • 验证环境是虚拟机:QEMU / VirtualBox / VMware 都实测过,稳定性也跑过 12 小时 43 分, 但物理机、真显卡、真外设还没碰过
  • 实机交互待补验:文件管理器 Delete、终端拖选复制、终端内中文输入目前到编译与源码确认为止 (Delete 的 L2 确认链路代码完整);--shot 只能出静态帧,测不了按键与拖拽
  • 没有 GPU 加速:全部软件光栅化。这是刻意取舍,代价是大面积重绘余量有限
  • 不支持 Wayland 客户端:桌面走 DRM → fbdev。9 月 28 日起有一个自研 wl_display 子集 spike (线协议、对象表、wl_shm 像素读取、surface 接进渲染管线都做完了),但没接进生产路径
  • AI 未接真实模型:协议层已用双假端点验证(21 项断言),真模型待接
  • 装机(安装到磁盘)目前不可用:整盘安装器要求 ISO 经过 isohybrid 处理, 而 v0.1.0 发布的那个 ISO 未经该处理(实测首 512 字节无 MBR 签名)——安装器现在会 在动目标盘之前拒绝执行并说明原因。引导与 Live 桌面不受影响。 platform/build-iso.sh 已补上 isohybrid 步骤与自检,重新构建后装机可用 (见 docs/报告/安全审计(SECURITY-AUDIT)-2026-10-02.md H-6)
  • 没有账号体系:已发布的 v0.1.1 是 Live 演示镜像,root 无口令,控制台(含串口) 拿到就是 root —— 这是刻意取舍(启动横幅与 /etc/issue 都会写明)。2026-10-24 起 自建镜像改为安全默认:必须设 AETHER_ROOT_PW_HASH="$(openssl passwd -6)"; 只做演示必须显式 AETHER_DEMO=1,否则构建直接失败(见 platform/build-iso.sh)
  • aether-shell 是 11 行占位,Shell 职责暂时压在 compositor 里

装应用

没有包管理器(opkg / apk / apt / rpm 都没有),也没有软件仓库,但有一套自己的安装机制。 一个"应用包"就是一个目录:app.json 清单 + 可执行文件,可选 lib/ 放自带的共享库。

aetherd app install /tmp/hello    # 装(先做依赖预检)
aetherd app list                  # 列出已装
aetherd app remove hello          # 卸载(进回收站,不是直接删)

装完 /usr/local/bin 里会生成一个包装脚本,终端直接敲 hello 就能跑; Dock 里也会多出一个图标(青绿色,排在五个内建图标之后),点一下就开个终端窗口把它跑起来。 也可以让 AI 装:「把这个装上」→ 弹 L2 确认卡片 → 走同一套逻辑。

装之前会做预检,因为装完跑不起来比装不上更糟。实测结论:

情况 结果
静态链接(gcc -static / Rust musl 静态 / Go 默认) 一定能跑
动态链接,依赖的库都在镜像里 能跑
动态链接,缺依赖库 报 error while loading shared libraries,预检会列出缺哪几个

镜像里的 glibc 是 2.38 且向后兼容,所以"glibc 版本对不上"通常不是问题;真正会挂的是缺 .so —— 镜像里只有 glibc、libgcc 等少数几个库。最省事就是静态链接。

写一个包、清单字段、边界,见 docs/应用包格式(APP-PACKAGES)-2026-09-28.md。

系统区是只读的(ISO9660 + initramfs 全在内存),只有 /var 那个 ext4 分区可写、重启保留。

是 Linux 软件吗:是。内核是 Linux,用户态是 glibc 的 x86-64,能跑的就是 Linux 的 ELF 二进制。

能装市面上的软件吗

能装,但不是 apt install 那种装法。 实测结论(2026-09-29):

类型 结果
静态链接(Go / Rust musl / gcc -static) ✅ 直接能跑
动态链接、依赖的库镜像里已有 ✅ 能跑(镜像已补 ncurses+terminfo / zlib / openssl / libffi / expat)
动态链接、依赖别的东西(libnl / libstdc++…) ✅ 带上就行 —— scripts/mkapp.py 自动把缺的库收进包里
GUI 程序(GTK / Qt / X11) ❌ 还没有 X11 / Wayland 客户端库(Phase 3)
解释型(.py / .pl / npm 包) ❌ 镜像里没有解释器,也不打算塞(会让 ISO 涨到 100 MB+)

拿到一个市面上的程序,打包 + 装进系统三步:

# ① 宿主:打包(自动收集缺的库与 terminfo,并校验 glibc 符号版本)
python3 scripts/mkapp.py /usr/bin/htop --id htop --image-lib-dir <镜像 rootfs> --out dist/apps --tar
# ② 宿主:把包服务出去(QEMU 用户态网络里,guest 访问宿主就是 10.0.2.2)
python3 scripts/serve-apps.py --dir dist/apps
# ③ guest:拉下来装上就能敲
wget http://10.0.2.2:8765/htop.aep -O /var/tmp/htop.aep
mkdir -p /var/tmp/pkg && tar xf /var/tmp/htop.aep -C /var/tmp/pkg
aetherd app install /var/tmp/pkg/htop
htop

实测战果:htop 3.3.0(Ubuntu 24.04 官方包)装进 AetherOS 后正常运行。 打包器跳过 glibc 家族、发现镜像那份 libncursesw 缺 NCURSESW6_* 版本符号于是改带宿主副本、 另带 libnl×2 与 libtinfo,包约 1 MB;装完终端里直接敲 htop 即可。

htop 在 AetherOS 桌面里运行

上面这张是真机实拍(QEMU 里的 AetherOS 桌面):从宿主 wget 拉包 → aetherd app install → 敲 htop → 完整 TUI 出来(CPU 仪表 / 内存 / 进程表 / F1–F10 功能键栏)。

细节、规则与边界见 docs/应用包格式(APP-PACKAGES)-2026-09-28.md。

架构

┌───────────────────────────────────────────────┐
aether-compositor + (占位) aether-shell     │  桌面 / 顶栏 / Dock / AI 指令条
draw · layout · text · term(vt/pty)         │
ime · textview · input · wayland(spike)     │
├───────────────────────────────────────────────┤
aetherd                                     AI 中枢:意图 → 路由 → 工具  │  权限闸门 L0–L3 · 审计
aether-ops                                  AI 运维:巡检 → 诊断 → 自愈  │
├───────────────────────────────────────────────┤
aether-ipc                                  统一 IPC(JSON / NDJSON)    │
├───────────────────────────────────────────────┤
aether-init                                 PID 1 / 服务管理 / 持久化    │  musl 静态
aether-install                              整盘安装器                   │
├───────────────────────────────────────────────┤
glibc · 驱动栈 · 固件                       │  成熟开源件
├───────────────────────────────────────────────┤
Linux kernel                                │
└───────────────────────────────────────────────┘

关键链路:

UI ──RegisterUi──▶ aetherd(/run/aetherd.sock,0600)──▶ UiRegistered    (剪贴板 / 读文件 / 配置热载的前置门槛;TCP 7311 仍在,但只有 AETHER_IPC_TCP=1 才用)
UI ──Chat────────▶ intent 快速意图 → router 路由 → llm → tools(最多 4 轮)
                    perm 闸门(L0-L3) → aether-audit.log
   ◀──ChatChunk(channel) / Action / NeedsConfirmation(token)

aether-init:7312 / unix socket 0600 ◀─ ServiceControl ─ 服务启停与监督
aether-ops 巡检 ─▶ init 服务状态 + /var/log/aether ─▶ 自愈重启

组件

目录 行数 说明 里程碑
aether-compositor/ 32,789 合成器 + 桌面 Shell 职责(渲染 / 布局 / 终端 / IME / Wayland spike) M1–M2
aetherd/ 13,068 AI 中枢守护进程(agent / 工具 / 权限 / 路由 / 模型配置 / 回收站 / 应用安装) M4
aether-init/ 3,424 PID 1 与服务管理 M3
aether-ops/ 1,026 AI 运维与自修复 M5
aether-install/ 1,071 磁盘安装器 M6
aether-ipc/ 1,155 全系统 IPC 协议 M0
aether-shell/ 11 占位骨架 M2
platform/ — Buildroot 外部树、rootfs overlay、ISO 打包 M3
scripts/ — 宿主开发、走查图、端到端验证脚本 持续
docs/ — 架构、协议、权限模型、路线图、审查报告 持续

规模数字每次提交都会漂,不要手抄:跑 python scripts/repo-stats.py 出权威口径 (与 代码索引(INDEX)-2026-09-11.md 的逐文件表同源,--check 可当门禁)。

权限模型

AI 能操作真实的机器,所以权限这块是系统里设计得最细的部分。 完整设计见 docs/AI权限模型(AI-PERMISSIONS)-2026-09-05.md。

等级 行为 工具
L0 免确认 sys_info、read_file、sys_probe、trash_list、app_list
L1 免确认 desktop、clipboard_read、clipboard_write
L2 弹确认卡片 file_write、file_delete、file_rename、trash_restore、app_install、app_remove
L3 确认 + 回显目标 install_disk

几条不变量:

  • 写白名单比读白名单窄。AI 可以读 /etc/aether 和 /var/log/aether,但不能写 —— 写前者等于让它改自己的权限规则,写后者等于篡改审计记录。有测试守着这条
  • 危险操作不新增 IPC 变体,一律走 ToolCall 过闸门。历史上剪贴板曾经走 Request 变体 绕过了整套闸门,这个教训现在是一条回归测试(request_variants_are_gated)
  • 确认令牌绑定工具和参数,5 分钟过期,用后即废;只有已注册的 UI 通道能兑现, 未注册连接一律 403 并落 rejected_no_ui 审计
  • 审计区分 6 种裁决(allowed / failed / needs_confirmation / denied / denied_by_user / rejected_no_ui),超 8 MB 轮转,写失败显式告警而不是静默丢弃
  • read_file 和 clipboard_read 标记为敏感输出,其结果强制本地推理、不上云

与安全默认值相关的开关(都要显式设,且都会在启动日志里留下记录):

环境变量 默认 作用 为什么默认关
AETHER_IPC_TCP=1 关 客户端允许走 TCP 7311 注册 UI 通道 TCP 上客户端无法验证对端(谁抢到端口谁就收到 UI 密钥);默认走 0600 的 Unix socket
AETHER_BIND=<addr> 127.0.0.1 改 IPC 监听地址 —(回环以外的地址会被拒绝)
AETHER_ALLOW_REMOTE_IPC=1 关 允许 AETHER_BIND 绑非回环地址 IPC 没有用户级认证,暴露到网络等于把"以 root 读写文件"交出去。这是第二道门,不是交互确认:能改环境的人也能改它 —— 它的价值是把"手滑暴露"变成"必须刻意两次"
AETHER_ALLOW_TCP_ONLY=1 关 Unix socket 建不起来时降级为"仅 TCP"继续跑 合成器只连 socket、不回退 TCP ⇒ 桌面会失去确认/剪贴板/服务控制,而用户只看得到一行日志。默认直接失败退出(码 3),让问题可见

L3 权限确认

测试与验证

手段 现状
单元测试 Windows 793 项全绿(2026-10-11 实测,cargo test --workspace);Linux 侧未实测(本机跑不了 Linux 二进制,需在构建机复核)
编译警告 Windows 侧 0 条;musl 侧 0 条但只覆盖 6/7 crate(aetherd 受 ring 交叉编译限制查不了,见上)
视觉回归 57 档 --shot 逐字节比对(基线 docs/证据/shot-baseline.json),当前 57/57 零差异
代码审查 四轮全量 / 增量审查,问题全部修复(未修项归零);结论总集见 docs/归档/代码审查总集(CODE-REVIEW)-2026-09-29.md
端到端 权限链路、安装器、QEMU QMP 键鼠注入 + 截图
实机自愈 QEMU 内 kill 掉合成器 → init 自动拉起并重新初始化显示/字体/输入
稳定性长跑 连续 12 小时 43 分不崩:3053 轮巡检,服务退出 0 / 自动重启 0 / panic 0,内存稳定无泄漏(原始日志 docs/证据/长跑日志(SOAK)-2026-09-28-12h43m.log.gz)
应用安装 实机验证:装进 /var/apps 的静态程序在 guest 终端里直接敲名字即可运行,并出现在 Dock 里

改 cfg(target_os = "linux") 的代码之后必须跑 --target x86_64-unknown-linux-musl 或到 Linux 机器上测。Windows 构建会整段屏蔽那些路径,编译错误和警告在开发机上一点都看不到。

文件都在哪里

文档入口:docs/代码索引(INDEX)-2026-09-11.md(代码索引与现状)。

Aether/
├── README.md / README.en.md                  入口(中/英)—— 只有这两个 .md 留在根目录
├── docs/                                     全部文档(含 GitHub Pages 的 .nojekyll 与跳转页 index.html)
│   ├── 代码索引(INDEX)-2026-09-11.md       代码索引:规模 / 逐文件职责 / 测试分布 / 常用命令
│   ├── 架构与设计决策(ARCHITECTURE)-2026-09-05.md  分层与 ADR(M0 冻结稿)
│   ├── 版本变更日志(CHANGELOG)-2026-10-01.md  版本级变更
│   ├── 路线图与已知缺口(ROADMAP)-2026-09-05.md  里程碑 M0–M6 与已知缺口
│   ├── 交接报告(HANDOVER)-2026-09-11.md    交接报告:实测记录 + 构建/验证手册
│   ├── 进程间通信协议(IPC-PROTOCOL)-2026-09-05.md  进程间协议
│   ├── AI权限模型(AI-PERMISSIONS)-2026-09-05.md  AI 权限模型(L0–L3)
│   ├── 应用包格式(APP-PACKAGES)-2026-09-28.md  应用包格式
│   ├── 视觉设计交接(UI-DESIGN-HANDOVER)-2026-09-20.md  视觉设计权威依据
│   ├── 报告/                                 带日期的一次性产物(审计 / 计划 / 验收报告)
│   ├── 发布/                                 发布与宣传素材
│   ├── 归档/                                 历史快照(决策历史,**不作现状依据**)
│   └── 证据/                                 长跑与实测的原始日志
├── assets/                                   图片素材(**不在 docs/ 里**,见下)
│   ├── ui-archive/                           归档走查图(视觉回归门禁的基线,20 张)
│   ├── screenshots/                          实机截图(QEMU / VirtualBox / VMware)
│   └── demo/                                 演示 GIF 与封面
├── 更新日志/                                 按日期的工作日志(按**开工日**命名)
├── platform/                                 Buildroot 外部树 + overlay + 引导配置
├── scripts/                                  门禁与工具(`scripts/gates.py` 是总入口)
├── site/                                     官网(由 `scripts/gen-site.py` 生成,勿手改)
└── aether-*/                                 7 个 Rust crate(清单见 docs/代码索引(INDEX)-2026-09-11.md)

文件名里的日期 = 该文档的首次提交日(诞生日),不随内容更新而变 —— 这样链接永远稳定;"最后更新于何时"请看 git log。 刻意不改名的文件(是机制要求,不是遗漏):.nojekyll 与 index.html(GitHub Pages 要求这两个 名字);docs/证据/shot-baseline.json(像素回归的机器基线哈希,由工具读写,人不去打开它)。

图片为什么不在 docs/ 里:docs/ 同时是 Pages 的根目录,几十张图混在文档里 既难找、也会被一起发布。素材统一放 assets/,文档目录只放文档。

链接不靠人眼维护:scripts/check-links.py 把每条本地链接解析成真实路径,断链即非零退出 (这次整理就是靠它抓出 5 条因搬目录而静默失效的链接)。

文档

文档 内容
代码索引(INDEX)-2026-09-11.md 代码索引:组件与入口、逐文件职责、工具清单、测试分布、键盘、常用命令
docs/路线图与已知缺口(ROADMAP)-2026-09-05.md 里程碑 M0–M6,以及已知的工程质量缺口
docs/报告/生产化计划(PRODUCTION-PLAN)-2026-09-28.md 生产力化清单与六个硬门禁(6/6 全部达成)
docs/视觉设计交接(UI-DESIGN-HANDOVER)-2026-09-20.md 视觉设计的权威依据:设计令牌、双模主题、环境陷阱
docs/应用包格式(APP-PACKAGES)-2026-09-28.md 应用包格式:怎么做、怎么装、预检怎么读、边界在哪
docs/AI权限模型(AI-PERMISSIONS)-2026-09-05.md AI 权限模型
docs/报告/可写文件操作(WRITE-OPS)-2026-09-28.md 可写文件操作的约束
docs/报告/第三阶段决策(PHASE3-DECISION)-2026-09-28.md Wayland 的决策框架与放弃条件
架构与设计决策(ARCHITECTURE)-2026-09-05.md 分层与 ADR(M0 冻结稿,看现状请用 INDEX)
docs/交接报告(HANDOVER)-2026-09-11.md 交接报告:实测记录 + 构建/验证手册
docs/报告/实机验收手册(RUNBOOK)-2026-10-11.md 真机逐项验收:附录 B 约 30 项的可执行步骤、记录模板、依赖 CVE 核对
docs/报告/镜像重建手册(ISO-REBUILD)-2026-10-11.md 重建可装机 ISO:构建机 → 构建 → MBR 自检 → 装机验证 → 发布
docs/报告/ 带日期的一次性产物:功能缺口清单、安全审计、计划与验收报告
docs/发布/ 发布与宣传素材(发布清单、文案模板)
docs/归档/ 历史快照(决策历史,不作现状依据):四轮审查总集、性能报告、旧版计划

许可证

GPL-3.0-only,全文见 LICENSE。

可以自由使用、修改、分发。但分发衍生作品(发二进制或通过网络提供服务)时, 必须同样以 GPL-3.0 开源完整对应源码,且不得附加额外限制。

ISO 是聚合体,里面打包了许可证各异的独立程序:

组件 许可证
Linux 内核 GPL-2.0-only
BusyBox GPL-2.0
自研用户态(aether-* 七个 crate) GPL-3.0-only
Rust 依赖(anyhow / log / serde / libc / fontdue / minifb 等) MIT 或 MIT + Apache-2.0

用户态程序通过系统调用使用内核服务,按内核 COPYING 的豁免条款 ("This copyright does not cover user programs that use kernel services by normal system calls") 不构成衍生作品,所以自研部分可以独立选 GPL-3.0。

GPL-2.0 与 GPL-3.0 互不兼容。当前架构不受影响,但将来若新增内核模块,那部分必须是 GPL-2.0 兼容的。

About

An operating system built from the Linux kernel up in Rust: custom init, compositor, terminal, and an AI assistant with per-tool permission gating. Bootable ISO, ~41 MB.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages