在非Gentoo Linux主机上构建Gentoo软件包的CLI工具
项目描述
binary-gentoo
关于
binary-gentoo 是一组简单的CLI工具的集合,主要用于帮助在非Gentoo Linux主机上构建Gentoo软件包。一个典型的场景是操作一个 活跃的 Gentoo二进制软件包主机 — 一个活跃的“binhost”。
次要功能,binary-gentoo 还可以在使用Docker隔离和完整的 emerge
视角(而不会影响您的宿主系统)的Gentoo主机上构建Gentoo软件包。
目前有四个CLI工具遵循 Unix哲学,并且可以用Bash等粘合语言组合使用
gentoo-build
– 使用Docker隔离构建Gentoo软件包gentoo-clean
— 使用app-portage/gentoolkit
的eclean
清理Gentoo pkgdir/distdir文件,并使用Docker隔离gentoo-local-queue
– 管理基于文件的简单推送/弹出构建任务队列gentoo-packages
— 对pkgdir执行操作(除emaint --fix binhost
之外)gentoo-tree-diff
– 列出某个portdir相对于另一个portdir具有的软件包/版本/修订版本gentoo-tree-sync
– 将给定的portdir目录(及其备份)更新到最新状态
binary-gentoo 是软件libre,在 GNU Affero GPL版本3或更高版本
许可证下授权。
安装
安装Docker,Python >=3.8,pip和rsync,然后
# pip install binary-gentoo
活动Binhost操作
要使用 binary-gentoo 设置活动binhost,您可能需要一个具有以下资源的虚拟机...
- 足够的资源,即可能
- 某些Linux发行版
- 启用自动更新以在一段时间内保持相对安全
- 已安装运行时依赖项
- Docker
- Python >=3.8
- rsync
- 一个SSH或HTTP守护进程(用于将生成的二进制文件提供给您的消费端Gentoo机器,除非这是从另一台机器完成的)
- 要使用的最新版本的
/etc/portage
文件夹副本 - 一个包含所有要构建的包名称的最新文本文件,例如通过
EIX_LIMIT=0 eix -I --only-names
生成 - 一组编译标志(
CFLAGS
、CXXFLAGS
、LDFLAGS
、CPU_FLAGS_X86
),这些标志适用于生产机器和消费机器,并且理想情况下已安装resolve-march-native——下面将详细介绍如何找到理想的标志 - 两个portdir副本——一个通过
gentoo-tree-sync
(或某种形式的git pull
)同步,另一个在调用gentoo-tree-diff
后使用rsync
恢复同步 - 一个粘合脚本...
- 尊重您的包含列表(例如,如果一些误报是可以接受的,则使用
grep -q -f installed.txt -F <<<"${atom}" || continue
) - 尊重您的排除列表(例如,类似
*sys-kernel/*|*-bin-*|*-9999*|*acct-*/*
的东西) - 将
gentoo-tree-diff
新闻推送到队列 - 从队列中取出,使用例如
jq -r .atom
提取原子,然后让gentoo-build
进行构建 - 永远循环
- 时不时地睡一会儿
- 时不时地运行
gentoo-clean
- 尊重您的包含列表(例如,如果一些误报是可以接受的,则使用
确定理想的构建标志
让我举一个具体的例子。
消费端机器
在消费端机器上,我们有一个这样的硬件环境
# lscpu | fgrep 'Model name' | sed 's,^.\{33\},,'
Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
# resolve-march-native
-march=sandybridge -maes --param l1-cache-line-size=64 --param l1-cache-size=32 --param l2-cache-size=3072 -O2 -pipe
# cpuid2cpuflags
CPU_FLAGS_X86: aes avx mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3
生产端机器
在生产端机器生产端机器上,我们有一个这样的硬件环境
# lscpu | fgrep 'Model name' | sed 's,^.\{33\},,'
QEMU Virtual CPU version 2.5+
# resolve-march-native
-march=k8-sse3 -maes -mcx16 -mno-3dnow -mno-3dnowa -mpclmul -mpopcnt -mrdrnd -msahf -msse4 -msse4.1 -msse4.2 -mssse3 -mtune=k8 --param=l1-cache-line-size=64 --param=l1-cache-size=64 --param=l2-cache-size=512 -O2 -pipe
# cpuid2cpuflags
CPU_FLAGS_X86: aes mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3
结果生产端构建标志
简而言之,我们正在寻找的标志是尽可能接近消费端机器,同时仍然能够生成二进制文件,这些二进制文件既可以在消费端机器上执行,也可以在生产端机器上执行(这样生产端机器就能够安装和运行包的依赖项的二进制文件)。
对于上面的例子,我在生产端机器上得到了以下这些值
CFLAGS
:-march=x86-64 -mtune=sandybridge -maes --param l1-cache-line-size=64 --param l1-cache-size=32 --param l2-cache-size=3072 -mpclmul -mpopcnt -msse4.1 -msse4.2 -mssse3 -O2 -pipe
(特别是-march
和-mtune
)CXXFLAGS
: 与CFLAGS
相同LDFLAGS
: 消费端机器上返回的portageq envvar LDFLAGS
CPU_FLAGS_X86
:aes mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3
(即没有avx
和没有rdrand
)
设计决策
-
binary-gentoo中的所有代码必须在非Gentoo Linux机器上运行,前提是已安装并启用了Docker以及具有正常互联网访问权限。
-
像Chromium这样的大型包需要大量的RAM和CPU时间。因此,构建默认使用
MAKETOPTS=-j1
,将感兴趣包与其依赖项分开构建。这允许在只有8GB RAM的虚拟机中构建例如Chromium包。 -
关于依赖项约束,一些包可以构建而不发生冲突,但不能安装而不发生冲突。因此,默认情况下只安装依赖项,而不安装感兴趣包。
项目详情
下载文件
下载适用于您的平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。