为什么需要启动这个项目:

在开始具体谈论这个项目的之前我们先来回顾和了解 openSUSE 打包的一些基本知识。

OBS——openSUSE Build Service( openSUSE 构建服务 )

openSUSE 拥有一套非常成熟(非常恶心)的打包服务体系,叫做 OBS ,从服务本身来看,这个服务可以为几乎所有的发行版构建对应的原生的软件并打包成对应的格式,比方说 Debian 系,可以打包成 deb 格式,并放到 OBS 提供的服务器端,并为你的软件包提供你个人的签名,为用户提供下载和安装服务。

目前 OBS 几乎覆盖所有的发行版,甚至针对国内发行版也有 Deepin 和 openEular 的构建容器。那么开发者和系统维护人员不仅可以使用官方提供的 OBS 服务,也可以在家借助自己搭建的服务器安装 OBS 在本地使用,只需要简单的将源代码包,.spec 脚本,相关补丁以及编译环境进行配置的定义文件上传上去,OBS 就能自动完成,效率提高,编译的日志和过程都非常清晰。

现实…

当然,真实世界很骨感,官方的 OBS 服务并没有提供龙架构(有很多原因,但都不重要),在旧世界转向新世界的阶段,上游 qemu 相关虚拟化组件也没有龙架构,所以,想学着 RISCV 利用qemu-user 模式来跑系统构建,编译,亦或是打包都不可能。我们放眼其它发行版社区,新世界的构建几乎完成了最早期的上游化:

  1. 社区的孙老师维护的 Archlinux,YongBao 系统;
  2. 白铭骢主导构建维护的 AOSC 系统;
  3. 白老师主导维护的 Gentoo;
  4. 史老师构建维护的 Slackware Linux

最近深度社区版本也基于新世界完成了 Beta3 的构建。openSUSE 作为老牌 Linux 社区已经落后了,我个人曾在 2 年前尝试构建 openSUSE 上的 rpm,但因现实生活所迫,无法坚持下去,这次我将近段时间的经验分享给大家,社区有能力的朋友借助已有的发行版提供的补丁,也能在 1 年内完成构建。

构建思路

从零开始构建一个 Linux 发行版

是的,没错,标准流程是利用已有 LoongArch LFS 或者 CLFS,构建出完整系统后,在此基础上,开始构建 rpm 打包环境。

不过借助于目前社区版本丰富,上游化逐步完善还有丰富补丁,我们可以尽量减少前期编译的工作上开始 openSUSE rpm 的构建,以下是思路和流程。

  1. 在 x86_64 上安装 openSUSE Tumbleweed 发行版,并安装 qemu-linux-user 包,利用 qemu-user 模式模拟 loongarch64 环境
  2. 利用社区发行版的 bootstrap 底包,chroot 或者是 systemd-nspawn
  3. 在容器用创建 rpm 编译,打包环境,以便制作出 openSUSE 的 bootstrap 和底层编译环境
  4. 制作出的第一批包存放在临时仓库,利用 LoongArch 版本 zypper 将第一批包安装到一个目录,再次使用 chroot 或是 systemd-nspawn 进去,利用原始的 openSUSE LoongArch 环境将第一批包重打,在条件允许的情况下,可以增加功能,并存放到仓库用于后续第三遍构建
  5. 循环第 4 步,完成所有底层包括 bootstrap 和编译器 GCC 在内第 3 次构建,有条件的情况下争取打出内核包,并试图制作出一个启动盘启动 LoongArch 物理机或者虚拟机
  6. 开始在虚拟机或者虚拟机里继续打包,尽量完善包的数量
  7. 利用 kiwi 制作 ISO 发布社区版本
  8. 将 .spec 文件逐渐合并入上有 OBS 官方打包脚本中,实现统一化打包,QA,最终在未来实现统一化的 Tumbleweed 和 Leap 版本发布

下面详细说明下:

1、里面 x86_64 的 openSUSE 来创建一个容器实现打包 loongarch rpm 的功能

2、安装 qemu-linux-user 包以后,可以在 /mnt/ 下创建一个目录作为容器。这里以 gentoo 和 archlinux 作为例子:

利用 systemd-nspawn 直接就能进入容器:

sudo zypper in systemd-container
sudo systemd-nspawn -D /mnt/gentoo-base -M gentoo-base --bind-ro=/etc/resolv.conf

这样就能进入 LoongArch 架构的 Gentoo 容器了。当然,如果大家想用 Archlinux ,也是可以的,只是个人认为用 Gentoo 会更好,因为目前 Gentoo 的 glibc 和 openSUSE Tumbleweed 的 glibc 是同一版本,完整构建整个全新的 openSUSE Tumbleweed 会更好,因为有些补丁就不用去 Archlinux 那边去抄了。

配置 LoongArch 上的 Gentoo 其实可以模仿 x86 的方式,难度不高,不过考虑 openSUSE 用户习惯,我们可以回到 Archlinux Loongarch bootstrap 去完成打包,难度将降低更多,只是不少补丁需要去 Archlinux LoongArch 那边抄过来。以下可以看到 bootstrap 下载后解压,一样的利用 systemd-nspawn 进入容器。

使用 systemd-nspawn 进入 archlinux 以后,首先运行以下命令,解决包签名问题:

pacman-key --init; pacman-key --populate

以上就是完整的构建思路,下面将以 QA 的形式说明“为什么”和“有多难”。

问:为什么不利用 openEular 的 OBS 打包 rpm?

主要原因是 openEular 属于稳定发行版,定位是商业和服务器,它们的包太老,打的补丁有些不符合上游要求,有些目前已经合并到上游,openSUSE 立足 Tumbleweed 打造,后期等到后面 Leap 走到稳定版本,自然而然就能进入稳定,所以,可以学习 Archlinux 社区和 AOSC 社区,直接开始搞滚动版本,后面等待时机成熟,自然而然合并入 Leap 版本。

问:为什么需要用其他的发行版构建 loongarch64 架构的 openSUSE?

首先我们要了解到目前 loongarch64 新世界除了 Debian 发行版进入 testing ,其余社区发行版都是基于源构建,Gentoo,Archlinux,Slackware 基本上滚动起来,都很方便了。而 rpm 系目前一个发行版都没有开始,所以必须依赖于其它已经有的发行版开始工作,在完成 base 和 devel-base 这些基础包的 rpm 打包之后,还需要进入 openSUSE Tumbleweed LoongArch64 容器环境里重新再打一到两遍 rpm 的底包,再继续后期构建,真正有了完整系统,又需要开始合并 .spec 给官方,实现官方 OBS 支持的编译打包和滚动。

问:为什么不等龙芯捐赠机器给社区再开始项目工作呢?

其实不论后面龙芯是否捐赠机器给社区,这项工作也会以这个流程启动(只是行动和执行的人不一定是我罢了),所以早日行动起来也算是为后续龙芯机器普及用户有更多的发行版可用贡献自己的一分努力。

问:目前该项目的难点是什么?

  1. 社区积极性不高;
  2. 需要持续测试输出,对多个发行版操作熟悉,对 bash 脚本,对 rpm 打包,甚至 Archlinux 和 Gentoo 的打包也熟悉,有足够的耐心和沟通能力;
  3. 对项目流程不清楚,摸不着头脑,搞不清从何开始;

问:对目前的困难有什么建议?

  1. 针对目前社区积极性不高的问题,如果是有业余时间的爱好者,可以向龙芯官方社区发邮件或者沟通,尝试获取一些经济上或是设备上的援助,亦或是折扣,以便逐步参与和实现该项目。
  2. 花时间在学习和测试 LoongArch 上,这个过程比较枯燥和乏味,在你确定真的爱它的前提下,并且时间充裕也有经济来源,否则,生活没有搞好,爱好也不会弄好到哪里去。
  3. 失败是家常便饭,多总结,多看错误日志,总结教训就能越来越好。

问:这个项目的意义是什么?

  • 学习认识 Linux 系统
  • 学习认识不同发行版打包规则以及编译打包的流程
  • 学习认识 LoongArch64
  • 参与社区交流

如果在这个过程中你能享受到快乐,那是再好不过的事。

写到最后

目前这个项目我只能保持每天晚上1-3个小时的输出,并且目前卡在 glibc-2.39 的 rpm 打包上,任何朋友想要参与,可以直接联系我,这是我的邮箱:litterhougelangley@live.com ,也可以到 Telegram 上 openSUSE 中文群联系我。期待你的参与。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注