如何在大型环境中管理和部署 FreeBSD 的端口?

如何在大型环境中管理和部署 FreeBSD 的端口?

我很好奇人们如何在他们的环境中部署 FreeBSD 的端口。我认为大多数使用 FreeBSD 的人确实在使用端口(并且经常使用 portupgrade 来使用二进制文件进行升级)。然而,我对你如何进行此设置很感兴趣,因为我对最新版本的工作方式不满意。我现在正在运行 FreeBSD 9.0,遇到了问题。

我已进行如下设置:

  • /usr/ports 通过 NFS 从一个节点共享(使用每晚的“portsnap fetch update”)。
  • 每个节点以读写方式挂载 /usr/ports
  • 我已在所有节点上的 /etc/make.conf 中设置“WRKDIRPREFIX=/usr/tmp”
  • 我已通过将以下内容添加到 /usr/local/etc/pkgtools.conf 将 Portsnap 配置为使用本地索引:

ENV['LOCALINDICES'] ||= '/var/db'

ENV['PORTS_INDEX'] ||= ENV['LOCALINDICES'] + '/INDEX.local'

我可以成功运行portupgrade -p package来构建一个包,然后portupgrade -P package在其他节点上安装二进制文件。

然而,有时我会收到以下问题:/var/db/INDEX.local:23265:dbm_store failed

我想不出我可以对系统做的任何其他优化,因为索引现在驻留在本地,并且真正导出的唯一内容是端口树,并且节点不会向那里写入任何内容。

答案1

我从来没有完全满意过大型环境中的端口系统——似乎总是需要对其应用一些外部管理才能使其正常运行。

我的最佳建议(按优先度升序排列,从“最差”解决方案到“最佳”解决方案):


如果你在每个主机上构建,
如果必须这样做,请不要像您描述的那样通过 NFS 使用读写挂载:如果您提供备用工作目录,通常可以信任端口会做正确的事情,而不会破坏端口树,但安全总比后悔好:运行本地 CVS/csup 镜像并从该框 csup 所有主机,然后像它们是单独的机器一样在本地构建。
是的,我知道这意味着在主机上拥有更多磁盘空间和额外的步骤。它也几乎保证没有问题。
警告:您可能希望从指定的“配置主机”同步包配置文件(rsync 或类似文件)以确保每台机器的一致性(如果需要,您甚至可以 rsync 整个端口树,而不是在每个节点上使用 csup)。


使用构建主机 (Build Host),创建包并安装它们。
比在每台单独的机器上构建更好的解决方案:使用构建主机来创建包,并将您的工具指向这些包。
这意味着为您运行的每种架构(或交叉编译)保留一个构建主机,但最终对您的目标机器来说更好(没有大型编译作业,保证一致性)


使用配置/系统管理工具。
这是我最终得到的解决方案——我构建了一个标准服务器映像,并使用radmind. 您可以使用木偶或者厨师。这具有使用构建主机的所有优点(一致性、单个服务器上的负载较少),并且增加了配置管理的好处。

警告:只有当您的机器“完全相同”时,这种方法才能真正发挥作用——也就是说,您可以在所有机器上安装同一组端口。如果您有不同的端口集,它可以工作,但这会大大增加管理开销。

免责声明:我是 的端口维护者sysutils/radmind。是的,我非常喜欢它,所以我采用了它。


所有这些都基于我管理各种规模的 FreeBSD 环境(从 1-2 台机器到 100 多台机器)的经验。根据我的经验,推动和维护标准化映像的配置/系统管理工具确实是处理此问题的最佳方法。

答案2

奇怪的是没有人提到端口管理/tinderbox

Tinderbox 是 FreeBSD 移植的软件包构建系统,基于 pointyhat 构建集群上使用的官方 Portbuild 脚本。Tinderbox 由 Joe Marcus Clarke 编写。

您可以定义多个 jail(基本系统版本)和多个 portstrees。jail 和 portstree 的组合称为构建。Tinderbox jail 不是 FreeBSD 中理解的 jail,它实际上是 chroot 中的给定世界。Tinderbox 支持自动跟踪依赖项,并且仅重建自上次运行以来发生变化的包。Tinderbox 支持构建失败的电子邮件通知。Tinderbox 还可以与 ccache 很好地集成。

Tinderbox 旨在轻松提供您需要的端口包集,适用于您需要的平台和架构。Tinderbox 也是测试新端口和端口升级的绝佳工具,尤其是用于测试依赖项和打包列表。它还可用于测试 FreeBSD 各个版本上的端口,因为您可以在 FreeBSD 7.X/8.X 主机上将 FreeBSD 6.X 世界作为 jail 运行。

也切换到包装大大简化了包部署。
在 github 上查看:https://github.com/pkgng/pkgng

答案3

我管理了 100 多台 FreeBSD 服务器,只需通过经过良好调优的 NFS 以只读方式共享 /usr,将软件包数据库从 /var 移动到 /usr 并符号链接到它们(不是绝对必要的,但可以启用 pkg_info 等)。可能还有一两个其他文件需要朝一个方向移动并进行符号链接,但整个设置花了我大约一个小时才搞清楚。它工作得非常非常好。如果我遇到扩展问题,我会添加额外的 NFS 服务器并分担工作量,但从未出现过这种情况。性能对我来说从来都不是问题(事实上它很棒),但我想你可以将 NFS 服务器的 /usr(或其副本)放在 md 上。

答案4

不幸的是,似乎没有人能找到好的解决办法。这很可能是由于底层工具的限制。

这是我的想法:我放弃了导出整个 ports-tree 的想法。相反,我屈服了,在每个节点上都放置了一个完整的 ports-tree。然后我通过 NFS 安装“软件包”(以启用软件包分发)。

我还打算使用缓存代理(可能是 Squid)来加速 portnap 进程。我写了一篇简短的邮政有关如何在我的博客上进行设置的说明。

参考:

相关内容