SerenityOS FAQ 深度解读:路线图哲学、构建运行、ports 包管理与专利边界
【免费下载链接】serenityThe Serenity Operating System 🐞项目地址: https://gitcode.com/GitHub_Trending/se/serenity
本篇指南以仓库官方问答文档 Documentation/FAQ.md 为骨架,系统拆解 SerenityOS 社区最常被问到的七个问题:路线图是否存在、为何没有 ISO 镜像、如何构建与运行、git pull后构建损坏怎么办、为何自研一切、为什么没有传统包管理器,以及 MP3 等多媒体格式与专利的关系。读完本文,你将完整理解这个"从零自举"操作系统在工程治理与软件许可上的取舍,并掌握构建、ports 安装与组件裁剪的实操路径。
一、路线图哲学:Maybe. Maybe not. There is no plan.
FAQ 中第一个被反复问到的问题是"SerenityOS 会支持$THING吗?"($THING代指任意功能、驱动、架构或软件),官方的回答非常直白:
Maybe. Maybe not. There is no plan.
对应地,"你什么时候实现$THING?"的回答是:
Maybe someday. Maybe never. If you want to see something happen, you can do it yourself!
这两句话奠定了 SerenityOS 的路线图哲学:项目没有对外承诺的路线图,功能演进由贡献者自己推动。从仓库结构看,这一理念贯穿始终——整个系统以 monorepo 方式组织(AK/、Kernel/、Userland/、Ladybird/、Ports/、Tests/等均在同一仓库中),任何人想看到某个功能落地,最直接的方式就是自己动手贡献。
这也解释了为什么官方不承诺"支持$THING":作为一个面向技术用户与贡献者的操作系统项目,需求优先级由实际提交的代码决定,而不是由官方路线图决定。
二、没有 ISO 镜像:面向技术用户的发行方式
FAQ 明确回答:没有 ISO 镜像。原因是"这个项目不服务于非技术用户"(This project does not cater to non-technical users)。
那么"这个东西到底怎么跑起来?"官方给出的答案是:参照构建说明自己构建。当前仓库支持 x86_64、aarch64、riscv64 三种架构,最简运行方式是一条命令:
Meta/serenity.sh run这条命令会完成以下工作(依据 Documentation/BuildInstructions.md):
- 编译整个 SerenityOS,并把产物安装到仓库内
Build/<architecture>/Root目录; - 生成磁盘镜像;
- 用 QEMU 启动系统(
anon用户默认密码为foo,默认可通过无密码su切换为root,属于开发便利配置)。
首次执行时还会联网下载若干数据库文件,并编译 SerenityOS 交叉编译工具链;这些步骤只需做一次。若只想验证代码能否编译而不启动虚拟机,可运行Meta/serenity.sh build;脚本不带参数运行时还会打印全部可用子命令。
构建宿主环境有硬性要求(当前仓库版本):
- 主机编译器:需要支持 C++26 特性的编译器,实测过 gcc-14 与 Clang 17~19;
- QEMU:6.2 或更高(Ubuntu 22.04 自带,更早版本可运行
Toolchain/BuildQemu.sh按工具链推荐版本构建); - CMake:3.25.0 或更高(Serenity 相关的 CMake 补丁已合入上游 3.25,因此不再携带补丁;若系统版本过旧,构建脚本会自动从源码构建 CMake);
- Debian/Ubuntu 依赖:
build-essential cmake curl libmpfr-dev libmpc-dev libgmp-dev e2fsprogs ninja-build qemu-system-gui qemu-system-x86 qemu-utils ccache rsync unzip texinfo libssl-dev zlib1g-dev(可选fuse2fs用于免 root 构建镜像); - Arch/Manjaro 依赖:
base-devel cmake curl mpfr libmpc gmp e2fsprogs ninja qemu-desktop qemu-system-aarch64 ccache rsync unzip; - Windows:使用 WSL2 构建,详见 Documentation/BuildInstructionsWindows.md;
- macOS 与其他 *NIX 系统:分别见 Documentation/BuildInstructionsMacOS.md 与 Documentation/BuildInstructionsOther.md。
在 QEMU 之外,系统也可以跑在 VirtualBox、VMware(见 Documentation/VirtualBox.md、Documentation/VMware.md),甚至有物理机安装指南 Documentation/BareMetalInstallation.md。换架构只需设置环境变量,例如:
SERENITY_ARCH=aarch64 Meta/serenity.sh run三、git pull之后构建坏了怎么办?
FAQ 给出的排查路径非常务实:
- 先确认 CI:如果 CI 上能构建通过,那么本地理论上也能构建;问题多半出在本地环境;
- 重建工具链:很多时候是编译器升级导致的,需要重新构建工具链;
- 干净仓库重试:如果还不行,就用一个干净的仓库再试;
- 求助社区:如果仍然无法解决,可在 Discord 的
#build-problems频道提问。
针对"工具链过期"这一最常见原因,Documentation/Troubleshooting.md 提供了对应处理步骤;而升级 CMake 后还需手动删除旧的Build/*/CMakeCache.txt,因为这些缓存文件记录了旧版本 CMake 的路径与版本信息:
rm Build/*/CMakeCache.txt此外,如果构建过程中出现fusermount: failed to open /etc/mtab: No such file or directory之类的报错,说明已安装fuse2fs但系统缺少 mtab 软链接,创建ln -sv /proc/self/mounts /etc/mtab即可。
四、为什么不用现成库,而要自己实现一切?
FAQ 的回答点出了项目的核心价值取向:
The SerenityOS project tries to maximize hackability, accountability, and fun(!) by implementing everything ourselves.
即最大化可修改性(hackability)、可问责性(accountability)与乐趣(fun)。这意味着:
- 可修改性:所有核心组件都是自家代码,改动不受第三方约束,任何开发者都可以深入任意一层;
- 可问责性:出了问题可以追责到具体实现,而不是"上游库的 bug";
- 乐趣:从零实现本身就是项目强调的工程乐趣。
仓库本身就是这一理念的注脚:AK/目录(约 200 个头文件/源文件)提供了自研的基础数据结构与算法库(Vector.h、HashMap.h、String.h、ByteBuffer.h、JsonValue.cpp、FlyString.cpp等);Kernel/从进程、内存、设备、网络到文件系统全部自研;Ladybird/则是配套的浏览器引擎。这构成了 FAQ 中"为什么不用$LIBRARY"这一问题的完整答案:不是不知道现成库,而是刻意选择自研以换取上述三个目标。
五、包管理器:为什么没有"Linux 风格"的二进制包管理器?
这是 FAQ 中篇幅最长、信息量最大的一节,核心结论可以拆成四点。
5.1 没有二进制包管理器,根源在 ABI 无稳定性保证
FAQ 明确说明:SerenityOS没有允许下载预编译二进制软件的包管理器。原因有两条:
- monorepo 构建模式:所有软件用同一种风格、同一套工具构建;
- ABI 无稳定性承诺:库符号、系统调用接口等 ABI 随时可能变化,没有稳定保证(POSIX C 库 API 相对稳定)。既然 ABI 随时在变,预编译二进制包就没有存在意义——每次系统更新都可能让二进制包失效。
5.2 官方支持的三方软件方式是 Ports:永远从源码构建
官方支持的三方软件入口是 Ports 目录。一个 port 是"可选安装、可以不是由 Serenity 团队构建、但支持在 SerenityOS 上运行"的软件,行为类似包(每个 port 带自己的安装脚本),关键区别是 port 永远从源码构建。
以仓库中的Ports/curl/package.sh为例,一个典型的 port 脚本会声明:
port与version:名称与版本;files:下载地址与 SHA256 校验值(URL#HASH格式,也支持git+URL#REVISION拉取 git 仓库);depends:依赖的其他 port(curl 依赖ca-certificates、openssl、zlib、zstd);useconfigure、configure/build/install函数:配置、编译与安装逻辑(curl 通过 CMake 交叉编译,DCMAKE_TOOLCHAIN_FILE指向CMakeToolchain.txt)。
安装某个 port 的操作(依据 Ports/README.md):
cd Ports/curl ./package.sh源码会被下载、校验、打补丁、配置、编译并安装,下次启动 Serenity 时curl即可用。每个 port 脚本支持fetch、patch、configure、build、install、installdepends、clean、clean_dist、clean_all、uninstall、dev等子命令;不带参数等价于依次执行installdepends → fetch → patch → configure → build → install。已安装的 port 会被记录在Build/<architecture>/Root/usr/Ports/installed.db中,清理构建目录时需同步删除或编辑该文件,否则依赖关系会错乱。需要一次性构建全部 ports 时可用Ports/build_all.sh,重装已安装的 ports 用Ports/build_installed.sh。
FAQ 同时说明了当前 ports 的实际运行约束:
- 推荐工作流:在虚拟机中运行时,ports 应在宿主机上交叉编译,并在启动前加入文件系统镜像;
- 本机编译:直接在 SerenityOS 上编译 ports 是可能的,但需要大量手工工作,目前不是推荐或官方积极支持的工作流;
- 未来展望:这一过程"未来
_may_通过pkg工具变得更简单"。
关于pkg工具,从当前仓库源码结构看,Userland/Utilities/pkg/ 目录下已经存在工具实现骨架:main.cpp、Port.h、AvailablePort.h、AvailablePortDatabase.cpp、InstalledPort.h、InstalledPortDatabase.cpp等文件,表明 FAQ 中提到的"未来工具"已处于逐步成型的开发状态(仓库为只读,如需了解最新进展请以官方渠道为准)。
5.3 系统组件本身可以按需裁剪
FAQ 特别补充:对于 SerenityOS 自身组件,可以在编译期排除部分组件。详见 Documentation/AdvancedBuildInstructions.md#component-configuration 的"组件配置"章节:
- 构建目录中运行
ninja configure-components(需系统装有whiptail,一般在newt/libnewt包中)可交互式勾选构建类型与具体组件; - 底层对应 CMake 的
BUILD_<component>系列开关(如BUILD_BROWSER),禁用组件后需执行ninja clean并删除Build/x86_64/Root下的旧产物;BUILD_EVERYTHING可一次性启用全部可选组件。
六、MP3 与专利:哪些格式能进 monorepo,哪些不能?
FAQ 用一节专门回答"既然 MP3 受专利保护,为什么 SerenityOS 里还有 MP3 实现"。原文开篇即声明:本节仅为信息性说明,不是法律意见,如有法律问题应咨询专业律师。
6.1 MP3:专利已全部过期,可以自研实现
MP3 最初确实受专利保护,限制了格式的某些使用方式。但所有 MP3 专利自至少 2017 年起已全部过期(具体时间取决于各专利的注册地)。因此项目认为,以 2-clause BSD 许可实现 MP3 并无需获取专利授权,是完全合法的。
6.2 H.264/H.265/JPEG 2000:专利未过期,monorepo 内不实现
但是,这一结论不适用于许多其他多媒体格式,例如:
- 视频编解码器H.264 (AVC)与H.265 (HEVC);
- 图像格式JPEG 2000。
只要有任何理由相信某格式仍受专利保护,monorepo 中就不会出现其实现——因为项目认为这与整体采用的BSD 2-clause 许可(见 LICENSE)不兼容。
6.3 第三方的出路:不同许可的 Ports
但是但是,许可不同的第三方 ports 可以提供这些格式的实现,典型例子就是ffmpeg。FAQ 提醒:是否使用这类第三方软件取决于你的具体情况与使用场景,对某些人来说可能不合法(并提示查阅 ffmpeg 官方关于同一话题的信息)。
FAQ 最后给出法律边界的划分原则:SerenityOS 代码的一切法律问题由其自身许可(BSD 2-clause,见 LICENSE)管辖;第三方代码的一切法律问题由该软件各自的许可管辖。
从仓库实证看,这一原则与源码完全一致:整个仓库(包括AK/、Kernel/、Userland/等)以 BSD 2-Clause License 发布(LICENSE文件),而涉及专利敏感格式的实现确实只存在于 Ports 体系之外的三方软件或由 ports 引入,未以自研代码形式进入 monorepo。
结语
透过这份 FAQ 可以看到 SerenityOS 的三条主线:没有路线图、一切自研的工程哲学;monorepo + 从源码构建的 ports替代传统二进制包管理器的软件分发方式;以及以 BSD 2-clause 许可为准绳、对专利格式保持审慎的合规策略。对开发者而言,这份 FAQ 不只是问答,更是一份"如何与这个项目相处"的说明书——想用就直接按 Documentation/BuildInstructions.md 构建,想加功能就自己动手,想装软件就走 Ports 从源码编译,想理解边界就对照 LICENSE。
【免费下载链接】serenityThe Serenity Operating System 🐞项目地址: https://gitcode.com/GitHub_Trending/se/serenity
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考