Alpine Linux Porting (一点一?)

要作Alpine的新平台porting,其实在有了 aports/script/bootstrap.sh 的协助,已经相较许多distro来得轻松很多。例如Ubuntu/Debian在头一遭作ARM porting时,有大量的手工需求需要作。不过aports的maintainer之一,Drew Devault其实也曾说过:〝bootstrap.sh is not battery-included !〞这样非常形象化的宣言,意指不要期望可以无痛地一道指令跑下去,什麽事情都会处理好。

这篇目前的aports修改,与未来使用上会放置在:
https://github.com/Ruinland/aports-riscv32

那麽我们就来踩踩看有哪些雷吧。

首先,基本上apots/abuild与Alpine高度相依,虽然Arch Linux AUR里面会看到有人尝试移植过,就过去笔者两年前使用的经验,我们还是有个完整的Alpine Linux userspace比较恰当。在这个年代,我们用docker会方便非常多,那就直接来吧:
docker pull alpine:3.14.2

紧接着就开shell起来,把 alpine-sdksudo等套件装好,并开好一个用户来设定吧:

docker run -t -i alpine:3.14.2 /bin/bash
apk add alpine-sdk sudo
adduser -G abuild ithome
adduser ithome wheel
vi /etc/sudoers # get wheel group to work without password
su ithome
abuild-keygen -a -i # Very _important_ !!! Keygen for local repo

紧接着,找一个喜欢的地方放aports,开始动工:

git clone https://gitlab.alpinelinux.org/alpine/aports

首先我们观察一下 aports/scripts/bootstrap.sh,会发现它的基础逻辑是从打造基础的binutils、然後1st phase cross toolchain、接着编出musl,再编出2nd phase crosstoolchain。并且建立一个meta package build-base 去包含 toolchain。但这时其实有个误区需要处理,那就是当 CTARGETCHOST 不match时,他要同时包含cross toolchain跟 cross_ed_ toolchain,也就是一包要同时含有跑在 x86-64 能gen给riscv32、以及跑在riscv32上gen给自己用的俩组。

这个行为会严重地与我们的cross host发生版本冲突与循环依赖,因为以包装的逻辑而言,APKBUILD里面所谓的 gccg++HOST 的、可是对於crossed platform来说,这个是要他那个平台所支援的版本。这边有两个解方,一个是直接干掉 aports/main/build-base/APKBUILD 当中指涉的任何 gcc 、g++ 套件,并且硬装 $HOME/package/x86_64/ 底下的corss toolchain (i.e. binutils-riscv32gcc-riscv32),先挺过这一次「创世纪」的循环相依後,有了native环境,我们可以重打一包相依逻辑正确的 build-base;另一个是强行统合cross build machine跟crossed target的toolchain版本号,这会是比较漂亮的解法,如果遇到会比对build-id的case,可以在强行使用 --build-id 去指定。

而关於musl的部份,我们直接修改 aports/main/musl/APKBUILD,换上之前port到一半的musl tarball、并且追加该有的checksum以及修改。
详情可见commit。

目前这套流程可以一路走到在编libbsd时,因为Alpine自己打了一组我看不太懂原因的 auto-link-atomic,导致linking流程中有些我不确定的原因会fail掉。这点可能必须还要花时间排除。(写了信给Drew Devault讨救兵了QQ)

Update:
感谢神秘的朋友帮忙看了一下,发现是Alpine在建libatomic symlink name时有状况,先暂时在 abuild 时多下了 -k -K 来留住 buildir跟sysroot (效果类似Arch Linux的makepkg --noextract)、之後硬是调整了一下symlink name,这样就可以一路拐到 alpine-base build完。後面就看能走多远是多远,因为只少 alpine-base 打出来,我们就可以建最minimal的Alpine rootfs来试了~


<<:  Day 7 ELK Stack + Filebeat 收集 k8s log

>>:  Day 7 - 扫描 ⇒ 找出漏洞 ⇒ 渗透系统

资安事件回应篇

今天突然的好累QQ 所以来个半偷懒篇(?! 之前在写数位监识,或是资安稽核,还有其他文章时, 都会想...

Angular 深入浅出三十天:表单与测试 Day20 - E2E 测试实作 - 登入系统

经过这两天的介绍,相信大家对於 Cypress 应该已经有了一定程度的理解,有没有人已经开始用它来...

[Day 19] 自动化机器学习 - AutoML

AutoML 今日学习目标 了解何谓 AutoML 超参数调参方法 Grid Search Rand...

Day 15-隔离框架 (isolation Framework) - 概念基本介绍 (核心技术-7)

何谓隔离框架 (isolation Framework) 今天走到了铁人赛一半的赛点,终於要提到我们...

TailwindCSS - 初探 Just in Time 模式 v2.2

关於 JIT 模式 JIT(Just in Time Mode) 是在 TailwindCSS v...