Skip to content

LankeOS v0.17

Latest

Choose a tag to compare

@Wtada233 Wtada233 released this 10 Aug 08:57

LankeOS v0.17 Release

Codename: Kangchenjunga

“所谓发行版就得发行,你发行了什么?”

“额...我发行了一堆cache被打包,依赖树不正确,多包拥有相同文件冲突,ABI混乱的垃圾包并紧急回滚了。”


核心变更 (Major Changes)

新功能和修复

一个独立发行版维护最大的难点就在于持续跟随上游维护软件包版本。在0.17之后,我认为LankeOS已经具备了这种能力。

  • 新subproject:LankeOS Build Farm:依旧使用AI制作+我审核代码,在消耗30亿token之后LankeOS有了一个包含验证,仓库搭建,docker隔离构建和ABI变化传播rebuiuild,旧SONAME自动backup等功能的build farm
  • farm功能:上游tracker支持:在0.17的开发过程中,我引入了使用yaml编写的tracker格式,支持多种template和自定义脚本格式,实测所有存在上游且有更新的包全都track完毕,接近200个包有更新。
  • farm功能:声明式rebuild和build_ok记录:由于部分包不直接使用其依赖的ABI,但是依赖版本号(比如python库被安装到/usr/lib/python${MINOR})所以farm引入了可自定义的通配rebuild,只要声明python升级时重建python-*就能避免问题。另外,farm会在一个LankeBUILD和对应json构建完成后使用其内容生成sha256 hash存入.build_ok,下次rebuild可以自动跳过没有改变的包。
  • farm功能:旧SONAME自动备份和恢复:每个ABI出现breaking的包,旧的动态库都会被备份并在docker容器中恢复备份。效果为:同时存在两个动态库,旧程序使用旧动态库运行正常,新构建的程序链接指向新动态库的dev symlink正确构建。
  • lpkg功能以及修复:新的lpkg 6.x使用libsolv完成依赖求解,同时修复之前版本失效的目录所有权记录。
  • LankeOS功能:python的PEP 668规范使用:0.17使用PEP 668,禁止global安装python包,pip和所有基础python package都已经被打包,剩下的库可以通过venv使用。
  • 杂项:虽然这个板块叫杂项,但是其实际上是最大的一类更新。所有的hacks.sh已经全部被删除,打包中的pycache被清理,默认PAM配置完善以及sshd默认提供systemd unit等细节部分是这个版本最多的优化。以及所有包的build_deps都已经被干净docker容器验证完全正确。

直观来说,本次更新的内容约等于10(0.10+0.14),因为这个版本不仅再次重新完全自举(这是LankeOS的第三次自举,第一次是LFS,第二次是0.14,第三次是0.17)而且还顺便验证整个依赖树的完整性,更新约等于半个仓库的包,新增一堆python包和引入一个完整新farm架构。


迁移指南

  • 本次更新修改了命名规范,libX和LSB/Linux-PAM这些都已经变为小写,请手动迁移。可以使用sed修改needed_so,deps,pkgs,files.db和provides.db这些lpkg数据。
  • 本次更新把xml-parser重命名为了perl-xml-parser,请卸载并重新安装新的包。
  • 由于迁移量较大,推荐下载新iso,使用当中的rootfs.sfs替换本地BASE的,重启并按照终端里的指导删除污染数据迁移。

镜像体积变化

我没统计,但是我估计变化不大,但是可用性一定会大幅提升——这个版本修复了一堆问题。


稳定性与兼容性

本版本经过在 Dell OptiPlex 5000 Micro(实体机) 上的严格验证:

  • 新的包完美运行
  • 所有包均可在build farm中构建
  • 完整包archive中每一个包都能安装,ssh修复等正常运作

下一步计划 (Roadmap)

  • 新增github cli,cloc等实用工具(KDE暂缓,我突然感觉没那个必要,我机器承受Chromium+Firefox的构建就已经很勉强了)

开发者的话

0.17 的主题是 “发行版工程”

很多个人的从LFS开始的独立发行版都停在包的持续维护和更新这一关,好在LankeOS是顺利跨过了。

LankeOS 0.17,从0.16开始44410行diff,24405行新增,5089行删除

(其实仓库贡献者里的claude是claude code自动挂的Co-Authored-By,就算重写commit历史也一直在,我实际上是用的DeepSeek而不是claude,只是通过claude code调用)

—— Wtada233