可重现的自定义Linux发行版构建系统

5

问题

我有一个由多种运行Linux的服务器组成的大型基础设施。例如,数据库服务器、负载均衡器、应用程序特定服务器。每种服务器都有许多实例,所有这些实例都需要可复制。

每种服务器基本上都是一个自定义发行版。定制包括对上游软件包的更改(其他上游版本、构建选项、补丁等),可能还有一些额外的自定义软件包。

例如,我需要运行最新的OpenLDAP slapd编译的服务器具有特定的选项和一些补丁。这就是事情变得复杂的地方。

更新到最新的slapd也将需要更新它依赖的库,这意味着也需要重新构建所有依赖于这些库的软件包。因此,我基本上需要重建发行版的大部分内容。我正在寻求一种能够帮助自动化此过程的解决方案。

解决方案要求

有点模糊。我想准备构建我的自定义发行版所需的所有东西,给它取个名字(如ldap-server),并将该名称在需要重现构建时提供给自动化构建系统。

我认为这是Gengoo或LFS社区应该拥有的东西。我还看到过像ALT Linux Hasher、Fedora Mock、Debian pbuilder/sbuild这样的项目,但从未使用过。

有什么想法吗?

先感谢您!

5个回答

5
您还可以使用Nix软件包管理器和Hydra构建系统来完成您的任务。
  • Nix是一个纯函数式软件包管理器。

  • Hydra是一个基于Nix的持续构建系统。(据我所知,它在必要时重新构建相关软件包。)

Nix不仅可以跟踪软件包依赖关系及其修改情况,还可以跟踪您的主机配置,以便回滚到一致的先前状态。(这就是基于Nix的Linux发行版NixOS的想法。)
此外还有:
  • Disnix,一个基于Nix的分布式服务部署系统。

Ivan,非常感谢你的关注和详细的回答!Nix看起来非常有趣,特别是它的文档很全面。我喜欢这个想法,而且我有印象实现应该也不错(虽然我还没有看过)。我想在我自己的一些小内部项目中尝试一下,但我认为目前不可能在公司范围内使用它,因为CentOS是标准化的。 - Timur
1
我的同事现在使用由Andrey Scopenco编写的BuildTracker。我喜欢这种通用方法,它采用了Sergey Skvortsov的构建工具的思路,但实现很粗糙。文档也几乎缺失。 - Timur
1
又来自一组基于ALT的工具:korinf(好吧,更好的拼写应该是“Corinth”或“Korinth”,源自“Κόρινθος”)。它使用hasher为其他目标操作系统构建软件包,正如您所设想的那样。但我不确定它在当前状态下是否也可以与维护良好的存储库(处理损坏的依赖项)的girar-builder以及创建完整自定义发行版的mkimage集成。 - imz -- Ivan Zakharyaschev
1
似乎Nix是最基本的解决方案。我可以看到一些缺点,即陡峭的学习曲线(开发人员必须在任何地方使用它,而不是pip、npm等),缺乏商业供应商如Oracle、Atlassian等的官方支持,也许专家难以招聘。但是,即使不使用NixOS,我真的很喜欢Nix提供的所有好处。 - Timur

4
我不会问你为什么要在生产服务器上维护定制的发行版...但是,我有过一些这种黑客马拉松的经验...以及随之而来的巨大头痛。
  1. 为了自动化构建分布式系统,我使用一个XML定义构建顺序和依赖关系,并编写GNU Make脚本以并行地构建独立的分支并构建二进制包。XML+ shell-script +Python +Make/Autotools的输出结果是一组特殊的“核心”工具和额外工具的完整构建。

  2. 第二步是将这些二进制文件/原始构建目录安装到系统中。我使用installwatch(我认为是这样)使用inotify来监视安装位置。然后输出这个位置的XML以及任何二进制文件的依赖关系。

  3. 之后,我拥有了一个构建清单(XML),以及每个软件包的已安装软件包详细信息的XML文件。然后我制作了一个工具,将XML和就地二进制文件转换为各种格式(RPM等)

  4. 现在(想象一下),我有一个安装脚本自动化构建,构建的元数据以及它们的依赖项,以及一种将该元数据转换为可部署包的方法

  5. 接下来,我为各种服务器制作了构建脚本,从glib开始 :) ...并运行了这些构建。系统知道哪些软件包/ ./configure是常见的,并共享这些软件包。这让我有了
    o 一个名为/common的存储库
    o 每个构建类型和架构的存储库

  6. 几个脚本/rsync-over-ssh和补丁管理脚本,你就可以开始了。

显然这只是我用于构建公共环境的多个发行版的方法的粗略概述。一些软件包是影响源代码树的元软件包(但在构建时像普通软件包一样处理)。一个例子是一个元软件包,它首先运行并对内核应用补丁。

然后还有工具链自动化的问题。

这一切都始于LFS...但正如您所看到的,情况变得有点奇特。

底线是,这很有趣,但我放弃了这些,改用BSD和Fedora。

Suse Build Service之类的工具可能会引起兴趣。将稳定的源代码组合查找和编译外包将使事情变得更简单!您甚至不需要构建任何与Suse有关的内容。


谢谢你的回答,艾登!你的方法很有趣。特别是它看起来非常像我在FreeBSD中的同事已经拥有的一款软件——它可以接收一些XML并生成一组准备构建的端口。稍后,这些人使用Tinderbox自动从中构建软件包集。现在我们需要在Linux上做类似的事情。顺便问一下,你的东西是否开源?为什么要放弃它?看起来你在实现上付出了很多努力。另外,你为什么选择Fedora? - Timur
@Timur - 这些脚本还不足以达到完全自治,虽然它们运行得很好,但仍需要一些监视。我不知道为什么放弃了它...它正在走向类似 Gentoo 的系统,而我不太喜欢那种风格。Fedora 对于我的个人电脑是非常好的选择,而 FreeBSD 的 ports 在生产环境下也非常优秀。也许你可以看看一个特定于你需求的衍生 ports 数据库,只需导入内核+基础软件和 FreeBSD 安装系统即可。 - Aiden Bell

1

ALTLinux girar-builder 是一个系统(内部使用hasher),用于重建软件包并维护一致的软件包仓库。Hasher是一个工具,用于隔离构建过程,以便可以准确地“跟踪”所有要求,从而保证构建过程的可重复性。

除了其他事情之外,当将新构建的软件包添加(更新、删除)到存储库时,girar-builder会进行依赖检查,以确保新软件包不会破坏其他软件包的依赖关系。除非其他依赖软件包也被添加到相同的构建任务(= 存储库更改事务)中,并在新软件包之后重新构建。这是一个经常讨论的情况(由于共享库中符号消失导致依赖关系破裂的示例, 软件包删除的示例),可以在ALTLinux开发者邮件列表该列表的英文对应项)中观察到:“检测到新的未满足依赖关系”。为了继续进行,相关的软件包应由其维护人员添加到该任务中。

girar-builder还会对新包进行安装测试,这只是git.alt(girar-bulder)执行的另一个检查。

为了确保在软件包存储库的当前状态下可以重现构建软件包,定期检查(相当频繁)存储库(称为Sisyphus)中的每个软件包是否可以在当前时刻重新构建-- 重建测试状态报告, 最近一次重建测试的日志,按软件包分类


在ALTLinux中,还有工具可以自动化从发行版“配置文件”和软件包存储库创建自定义发行版:http://www.altlinux.org/Mkimage。 - imz -- Ivan Zakharyaschev
1
再次感谢。Mkimage看起来几乎是我所需要的。我认为它可以适应我的工作流程,其中裸机通过PXE引导,基本操作系统是通过kickstart安装的,然后安装项目元包,该包将所有必要的软件包作为其依赖项拉取。最后,调用Puppet来配置一切,完成!但对我来说,目前使用ALT Linux还不实际,但看到其他人如何解决类似的任务非常有趣。 - Timur

1

以防万一,自原问题提出以来,又有一个类似的解决方案可用:mkimage-profiles。它基于ALT Linux发行版相关工具链,但扩展了一个镜像配置管理工具,试图使出现的分支最小化和简洁。目前大部分文档都是俄语正式文档(由于几个原因是我的决定),但代码本身在英语中有很好的注释。

要了解这种方法,请参见conf.d/server.mk

distro/.server-base: distro/.installer use/syslinux/ui/menu use/memtest
    @$(call add,BASE_LISTS,server-base openssh)

distro/server-nano: distro/.server-base \
    use/cleanup/x11-alterator use/bootloader/lilo +power
    @$(call add,BASE_LISTS,$(call tags,server network))
    @$(call add,BASE_PACKAGES,dhcpcd cpio)

distro/server-mini: distro/.server-base use/server/mini use/cleanup/x11-alterator
    @$(call set,KFLAVOURS,el-smp)

在其它方面,OpenVZ 模板缓存、VM 镜像、ARM/PPC 架构、git(提交生成的配置文件阶段并附带有意义的描述)和配置树图形化都得到了一定程度的支持。

PXE 引导支持应该很容易在框架内实现(并上游),但实际上还没有完成——我知道这些细节,但还需要时间。

从大小约为 17MB 的 netinstall 镜像开始,我们提供了初步的支持(example)。

我也很想知道您认为 ALT 不切实际的原因——当然,已知的原因除外,但您的原因可能是新的。PS:特别是当准备尽可能远地走向 LFS 时。

PS2:您可以在具有4GB以上RAM和启用DHCP的Internet路由以太网连接的系统上使用live-builder.iso尝试实时模式中的该项功能,只需登录为altlinuxcd /usr/share/mkimage-profilesmake server-mini.iso


0

我对此了解不多,但我认为Suse Studio值得一看。


谢谢,SuSE Studio 看起来是一个适合终端用户的好服务,但它对于更注重开发者中心的企业基础设施来说不太适用,即需要与版本控制系统、现有部署程序等进行集成。基本上,我需要一种从某些声明性规范生成自定义发行版存储库的方法。而SS似乎没有提供API。 - Timur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接