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

我很好奇人们如何在他们的环境中部署FreeBSD的端口。 我假设大多数使用FreeBSD的人都在使用Ports(通常使用portupgrade来升级二进制文件)。 不过我对你如何设置这个设置感兴趣,因为我对最近版本的工作方式并不满意。 我现在正在运行FreeBSD 9.0并遇到问题。

我已经设置如下:

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

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

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

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

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

我不能想象我可以对系统进行任何其他的优化,因为索引现在驻留在本地,唯一真正导出的是ports-tree,并且从节点没有任何东西被写入到那里。

在一个大的环境中,我从来没有完全满意过港口系统 – 看起来你总是需要对它进行一些外部pipe理,以使其运行良好。

我最好的提示(按照上升的优先顺序,“最差的”解决scheme,以“最好”的解决scheme):


如果你在每个主机上build立, 不要
如果你必须的话,不要通过像读者所描述的读写挂载的NFS来实现:如果你提供备用的工作目录,你通常可以信任端口做正确的事情,而不是在端口树上跺脚,但总是更好比对不起,要安全:运行一个本地的CVS / csup镜像,并从这个盒子中取出你所有的主机,然后在本地构build,就像它们是单独的机器一样。
是的,我知道这意味着在主机上拥有更多的磁盘空间和一个额外的步骤。 这也几乎保证没有问题。
警告:您可能想要从指定的“configuration主机”同步软件包configuration文件(rsync或类似软件)以确保每台计算机的一致性(如果需要,甚至可以同步rsync整个端口树,而不是在每个节点上使用csup) 。


使用生成主机,创build包并安装它们。
比在每台机器上构build更好的解决scheme:使用构build主机创build包,并将工具指向这些包。
这意味着为每个运行的架构(或者交叉编译)保留一个构build主机,但是对于目标机器来说最终会更好(不需要大的编译工作,保证一致性)


使用configuration/系统pipe理工具。
这是我解决的解决scheme – 我build立一个标准的服务器映像,并使用radmind将其部署在我的环境中。 你可以用木偶或厨师做类似的事情。 这具有使用构build主机的所有优点(一致性,在单个服务器上的负载较less),并增加了configurationpipe理的好处。

注意事项:如果你的机器是“完全相同的”,这只能工作得很好 – 也就是说你可以在所有的机器上安装相同的端口。 它可以工作,如果你有不同的端口集,但会大大增加pipe理开销。

免责声明:我是sysutils/radmind的端口维护者。 是的,我喜欢那个我通过它。


所有这一切都是基于我pipe理各种规模的FreeBSD环境(从1-2台到超过100台)的经验。 configuration/系统pipe理工具,推动和维护一个标准化的形象是真正的最好的方式来处理我的经验。

奇怪的是,没有人提到ports-mgmt / tinderbox :

Tinderbox是FreeBSD端口的一个包构build系统,基于Pointyhat构build集群上使用的官方Portbuild脚本。 Tinderbox是由Joe Marcus Clarke写的。

您可以定义多个jail(基本系统版本)和多个portstrees。 jail和portstree的组合被称为build。 Tinderbox监狱并不是FreeBSD中的监狱,它实际上是chroot中的一个给定的世界。 Tinderbox支持自动跟踪依赖关系,只重build自上次运行后更改的包。 Tinderbox支持邮件通知失败的版本。 Tinderbox也很好地与ccache集成。

Tinderbox旨在轻松提供您需要的套件端口,用于您需要的平台和体系结构。 Tinderbox也是testing新端口和端口升级的优秀工具,尤其是testing依赖性和装箱单。 在FreeBSD的各种版本上testing端口也很有用,因为你可以在FreeBSD 7.X / 8.X主机上运行FreeBSD 6.X世界作为监狱。

还切换到pkgng大大简化了包的部署。
在github上检查一下: https : //github.com/pkgng/pkgng

我已经pipe理了100多台FreeBSD服务器,只需通过经过良好调整的NFS共享/ usr只读,将软件包数据库从/ var移动到/ usr和symlinking(不是绝对必要的,但启用了pkg_info等)。 可能有一个或两个其他文件需要在一个方向或另一个方向上移动,但是整个设置花费了我大约一个小时的时间。 它工作得非常好。 如果我遇到扩展问题,我会添加额外的NFS服务器,并拆分工作量,但它从来没有出现。 性能对我来说从来都不是问题(实际上它很棒),但是我想你可以把NFS服务器的/ usr(或其副本)放在md上。

看来,没有人能很好的解决这个问题。 这很可能是由于下层工具的限制。

下面是我想到的:我放弃了将整个端口树导出的想法。 相反,我在每个节点上放置了一个完整的端口树。 然后,我通过NFS安装“包”(以启用包的分发)。

我也打算利用caching代理(可能是Squid)来加快portnap进程。 我写了一篇关于如何在我的博客上设置的短文章 。

参考文献:

  • 代理理念
  • 在portsnap中实现http代理(或者全局)