DOCS
OneOS · 架构设计
← 返回文档中心 · 来源:Languangxun/oneos · 同步于 2026-09-26
分层
| 层 | 组件 | 状态 |
|---|---|---|
| 应用 | OneOS 应用 | 规划中 |
| 桌面 | labwc / waybar / fuzzel / swaybg / foot | 已有 |
| 会话 | oneos-session.service、oneos session API |
已有 |
| 系统服务 | oneosd(unix socket JSON API) |
已有 |
| 基础系统 | systemd、networkd、resolved、dbus、openssh | 已有 |
| 内核 | Debian linux-image-amd64 | 已有 |
| 构建 | mkosi(声明式,产出 GPT 磁盘 + UKI) | 已有 |
设计原则:内核与驱动全部复用 Linux/Debian,只在用户态做自己的东西。
仓库布局
mkosi.conf 镜像构建配置(发行版/包/引导/运行时)
mkosi.extra/ 原样覆盖到镜像根目录
etc/ 品牌、网络、resolv.conf、systemd 启用软链
usr/lib/systemd/system/ oneosd / oneos-session / oneos-splash 单元
usr/bin/ make build 放入静态编译的 oneosd / oneos / oneos-splash,
以及 shell 脚本 oneos-settings(设置面板)、oneos-power(电源菜单)
usr/share/applications/ fuzzel 启动器条目(OneOS 设置)
usr/share/backgrounds/ 极光壁纸 oneos-aurora.jpg
root/.config/ 桌面配置(labwc / waybar / fuzzel / foot)
waybar/config style.css 顶部状态栏(品牌/工作区/时钟/网络/CPU/内存/磁盘)
waybar/dock.json dock.css 底部 dock(启动器/终端/设置/wlr 任务列表/电源)
crates/oneos-proto/ 协议定义与客户端库
crates/oneosd/ 守护进程(socket 激活)
crates/oneos/ 命令行客户端
crates/oneos-splash/ 开机动画(fbdev,零依赖,完整播放不可跳过)
tools/gen-signature.py 用 fontTools + Caveat 生成字形轮廓数据
tools/fonts/Caveat.ttf 手写字体(OFL,含许可证)
scripts/dev.sh 本机开发脚本(不启动虚拟机)
docs/ 架构、路线图、开机动画原理
为什么是 Debian + mkosi
- Debian 稳定、包最全,
ID_LIKE=debian后续可复用整个生态 - mkosi 用声明式配置直接产出可启动磁盘镜像(UEFI + systemd-boot + UKI),
mkosi vm一条命令进 QEMU,mkosi ssh通过 VSock 连入 - systemd 提供进程管理、cgroup、沙箱、日志等系统原语,不需要自己造
通信协议
oneos 与 oneosd 通过 /run/oneos/oneosd.sock 通信,一行一个 JSON(JSON Lines)。
类型定义在 crates/oneos-proto。
请求:
{"id":1,"method":"status"}
{"id":2,"method":"service_status","params":{"unit":"oneosd.service"}}
成功响应:
{"id":1,"ok":true,"result":{"version":"0.0.7","os":"OneOS 0.0.7","hostname":"oneos","uptime_secs":42,"boot_id":"..."}}
失败响应:
{"id":1,"ok":false,"error":{"code":"dev_mode","message":"power operations are disabled in dev mode"}}
当前 method:ping、status、poweroff、reboot、session_status、session_start、session_stop、
service_list、service_status、service_start、service_stop、service_restart、logs、
settings_show、settings_set_hostname、settings_set_timezone。
写操作(poweroff、reboot、session_start/stop、service_start/stop/restart、settings_set_*)
在开发模式(ONEO_DEV=1)下会被拒绝;只读操作(status、service_list、service_status、logs、
settings_show)在开发模式下直接作用于宿主机,便于调试。
运行方式
- 镜像内:
oneosd.socket由 systemd 监听,首个连接到来时自动拉起oneosd.service - 本机开发:
make dev,ONEO_SOCKET=/tmp/oneos-dev.sock+ONEO_DEV=1
桌面会话
oneos-session.service 由 oneos session start 启动,运行 labwc:
- labwc:wlroots 合成器 + 堆叠式窗口管理(标题栏、快捷键、工作区)
- waybar ×2:autostart 里拉起两个实例——顶栏状态栏(工作区/时钟/网络/CPU/
内存/磁盘)和底部 dock(启动器/终端/设置 +
wlr/taskbar窗口列表 + 电源按钮) - swaybg / fuzzel / foot:壁纸、启动器、终端
- oneos-power:dock 电源按钮/
Super+X/右键菜单共用的重启、关机菜单 - 配置位于
/root/.config/{labwc,waybar,fuzzel,foot},随mkosi.extra/进入镜像
无 logind 会话下运行,因此:
QemuArgs加-machine i8042=off:QEMU 即使-nodefaults也会创建 PS/2 控制器,PS/2 相对鼠标和virtio-tablet绝对指针同时存在会让光标漂移; 关掉 PS/2 只留 tablet,宿主机指针和 guest 一对一LIBSEAT_BACKEND=builtin:libseat 直接访问 DRM master 与输入设备WLR_RENDERER=pixman:QEMU 的 virtio-vga 没有 3D,用纯软件渲染Wants/After=systemd-udev-settle.service:等 udev 枚举完输入设备再启动, 避免libinput: no input devices导致合成器启动失败Conflicts=getty@tty1.service:图形会话占用 tty1
构建产物
mkosi 产出 mkosi.output/oneos_<version>.raw:
- ESP(512M,systemd-boot +
EFI/Linux/oneos-*.efi统一内核镜像) - 根分区(ext4,按内容 Minimize,安装后约 1G)
oneosd / oneos / oneos-splash 在本机用 musl 静态编译(make build),
复制进 mkosi.extra/usr/bin/,因此镜像内不依赖任何运行时库版本。
开机动画
oneos-splash 在 getty 之前把 “OneOS” 写到 /dev/fb0:字形是 Caveat(OFL)的
真实填充轮廓(tools/gen-signature.py 离线生成),播放时用粗墨迹沿轮廓显影,
仿 Apple Hello / InkTrail 的效果。播放器零依赖、支持 16/32bpp framebuffer。
动画强制完整播放(约 3.9s),不可跳过:oneos-splash.service 排在
getty.target 与 systemd-user-sessions.service 之前,登录提示必须等动画结束;
oneos-session.service 也 After=oneos-splash.service,动画播放中启动桌面会被
systemd 排队,合成器不会抢走画面。详见 BOOT-ANIMATION.md。
设置面板
oneos-settings 是 whiptail 写的对话框面板(mkosi.extra/usr/bin/),
负责系统信息、主机名、时区、服务、日志、电源六类操作。它不直接改系统,
而是调用 oneos CLI(进而走 oneosd 的 JSON API),所以参数校验、dev 模式
保护等行为与命令行完全一致。桌面入口:Super+E、labwc 右键菜单、
fuzzel 里的 “OneOS 设置”。