前言:
此文不再赘述 Musl libc 具体为何物,我们直接开始。以下内容我们以 x86_64 架构为例。
整个安装过程我们以最简化的方式,目前在不进行非常深入折腾的条件下,Musl libc 的 Gentoo 要进入系统并不困难,我们只需要明白几个大前提,明白之后,构建起来就不困难了。
- 不能使用 systemd 作为中央化系统及设置管理程序;
- 最好使用稳定分支(
amd
)进行构建。当然,如果你一定要使用(~amd
)也可以的,只是你需要更好的随机应变能力; - 文件系统最好使用稳定的
ext4
。当然,如果你一定要使用btrfs
也可以,只是需要对某些包进行屏蔽,后续会详细谈到; - 目前仅供测试,有不少软件可能存在一些问题,不保证每次都能够正常构建。
开始构建系统:
使用任何一个你方便下载的 LiveCD 作为媒介引导进入系统,用你喜欢的方式准备磁盘分区,下载好镜像源中带有 musl 的 stage3 压缩包,这样后续操作能减少很多麻烦。
准备工作算是基本完成了,我们就正常 chroot
进入目标系统,在这个系统里面首先还是那一套常规操作:
emerge-webrsync
emerge --sync
完成之后选择我们的 profile :
eselect profile list
eselect profile set --force <musl的数字>
安装 dev-vcs/git
,安装的目的是需要添加 gentoo-musl
overlay
。类似我这样:
[musl]
location = /var/db/repos/musl
sync-type = git
sync-uri = https://github.com/gentoo/musl.git
当然,也可以直接安装 app-eselect/eselect-repository
,安装完成后,使用 eselect repository
相关命令来添加和管理 gentoo-musl overlay
。我的方法相对比较野蛮。
添加完成 gentoo-musl
这个 overlay 之后,还是需要重新刷新 overlay,随后,我们开始需要做一些小的 tweak,以防止在第一波更新的时候出现编译错误。
大致的逻辑是这样的:
- 在 Gentoo 中的目录:
/etc/portage/package.use/
,/etc/portage/package.mask/
,/etc/portage/package.accept_keywords/
中,分别定义了打开某项功能,屏蔽某个指定包,接受某个处理器架构的包。这是Gentoo 的大前提; - 我们构建 Musl 为 libc 库的系统时,部分软件构建是有可能发生错误的。我们需要留意这个包更新是通过
gentoo
还是通过musl
这两个 overlay。假设,如果某个包更新/安装的时候,是通过 gentoo 这个主源安装的,并且出现了编译错误,然后恰巧你在 musl 的 overlay 中看到有相同的包提供。那么处理方法就是,将这个包添加到 package.mask 这个目录中的一个文件(用户可以自己定义文件名)内,意思是屏蔽这个来自 gentoo 的包,大概样子类似于:xxx/xxx::gentoo
这样的。这样在下次更新/安装的时候,emerge 会自动去解析 musl overlay 提供的包,这样或许就能成功安装了; - 是的,上面提到是“或许”,也有可能软件包通过切换到 musl overlay 之后也是无法安装的,这个时候唯一的方法就是去讲 emerge 编译结束后给出的提示,提交给 gentoo 的 bugzilla,并且给 musl github 提交 issue,方便他们后续修复。
所以通过上面的思路,大家会发现一个问题,就是有极大的可能性这个系统是安装不了的,或者说,这个系统不一定每次都能成功构建。
那么这里提供给大家一种最简单的方法,可以方便构建一个极简的系统,没有桌面环境的系统。这个构建过程中,我们避免引入 rust,避免安装 networkmanager,文件系统不要选择 btrfs 。这样能够一定程度上构建出极简的 Gentoo 系统。
- 既然抛出了结论,我来谈谈原因,rust 避免构建的原因是 rust 的源码中指定的 musl target 和 Gentoo 的 make.conf 指定的,是不同的,从而导致了错误。解决方法要参考韩菊苣的 overlay,地址。
- 为什么不使用 networkmanager 呢?是因为这个软件默认的 USE 中定义了一个叫做 ppp 的功能,用来启用
net-dialup/ppp 软件,用来启用移动拨号和 PPPoE
拨号连接,但是因为软件本身缺少头文件,导致编译出错。bug 地址。可能有朋友会说用 USE 减掉这个功能来构建就好了。是的,我也这么理解,但是 netwokmanager 构建过程需要 spidermonkey ,而 spidermonkey 需要 rust ,这就回到了上面的问题。当然,如果各位有兴趣可以将这些依赖用 USE 减掉再试试。
- 为什么不使用 Btrfs 文件系统?是因为 Gentoo 默认提供的 btrfs-progs 在 musl 下无法编译通过,需要使用 musl 的,然后 musl 提供的 btrfs-progs 使用的是稳定分支的版本,也就是目前5.10内核提供的版本。如果你用稳定分支构建系统,问题不大。但是如果用测试分支构建,内核就需要注意要用5.10,否则内核是>5.10,而btrfs-progs是5.10,后续就有可能出问题。
总结
那么大致的思路有了,相信有基础的朋友就能顺利构建这样的基本系统了。最后强调下,用不了 systemd,需要使用 openrc,大家需要去查阅 Handbook 了解相关的指令书写格式,方便操作。
最后提供下这次视频:
希望能够为大家打开思路。