在 OpenVZ 客户机之间共享磁盘卷以减少包管理开销

在 OpenVZ 客户机之间共享磁盘卷以减少包管理开销

是否可以创建一个仅用于包管理的单个“主”OpenVZ 客户机,并mount --bind在其他几个 OpenVZ 客户机上使用类似的东西来诱骗它们使用主客户机安装的环境?

这样做的目的是让用户可以维护自己的容器,同时与主开发环境保持同步,这样他们就可以始终拥有最新和最好的需求,而不必过多担心系统管理。如果他们需要安装自己的软件包,可以将它们放在 /opt 或 /usr/local 中(或设置到他们的主目录的路径)吗?

换句话说,我希望几个(例如开发人员的)OpenVZ 客户机,它们的 /bin、/usr(等等……)实际上指向与主 OpenVZ 客户机相同的磁盘位置,可以启动该主 OpenVZ 客户机来安装和更新环境的通用软件包,以供该组所有 OpenVZ 客户机共享。

不管怎样,我们正在运行 Debian 6。

编辑:

我尝试以这种方式挂载(绑定和只读)/bin、/lib、/sbin、/usr,但它拒绝启动容器,指出文件已挂载或正在使用中:

Starting container ...
vzquota : (error) Quota on syscall for id 1102: Device or resource busy
vzquota : (error)       Possible reasons:
vzquota : (error)       - Container's root is already mounted
vzquota : (error)       - there are opened files inside Container's private area
vzquota : (error)       - your current working directory is inside Container's
vzquota : (error)         private area
vzquota : (error)       Currently used file(s):
/var/lib/vz/private/1102/sbin
/var/lib/vz/private/1102/usr
/var/lib/vz/private/1102/lib
/var/lib/vz/private/1102/bin
vzquota on failed [3]

如果我卸载这四个卷并启动客户机,然后在客户机启动后安装它们,客户机将永远不会看到它们被安装。

答案1

根据评论,这个问题与我(也许还有其他人)预期的有点不同:“维护”的使用与容器内的包无关,而是与它们各自的配置有关。

这使得这个过程更加困难,但仍然是可能的。例如:

挂载目录

正如您所说,您需要共享二进制文件的挂载(例如/usr/bin),这是确保它们可以共享所有软件包的第一步 - 这将允许已安装的二进制文件可供所有其他容器使用。

您需要确保当您在适当的文件的目录mount --bind中执行此操作时。ROOT/etc/vz/<veid>.conf

例如,mount --bind /some/mount/point/bin /vz/root/1/bin

这些挂载点必须干净(如何确保机器首次启动后它们就在那里?)。为此,OpenVZ 以脚本的形式提供了启动和停止钩子。假设您在 中工作/etc/vz/conf,您可以拥有:

  • /etc/vz/conf/<veid>.mount- 这是启动钩子:容器运行时调用
  • /etc/vz/conf/<veid>.umount- 这是停止钩子:容器关闭后调用

它们的名称源自它们的技术定义:OpenVZ 安装/vz/private/<veid>/vz/root/<veid>它所挂钩的东西(假设是默认目录)。

配置

在评论中,您询问了一个优点,那就是他们可以按照自己的喜好配置服务器(例如mysql.cnfhttpd.conf/ apache2.conf)。我能看到的唯一问题是,您需要确保在安装软件包时,这些配置文件在每个容器内都已设置。您可以尝试共享挂载写时复制分享。

这个问题正是哪个要共享的目录。Apache 位于 ,/etc/httpdMySQL 位于/etc/mysql- 因此您需要确保复制这些库存文件,否则这个想法将行不通。我个人会检查.deb由“全局”包管理员安装的文件,并将任何未共享到单个容器中的目录提取出来。但是,这只是一种方法 - 我相信还有很多其他方法。

陷阱

我想到了一个办法,你可以直接替换软件包附带的二进制文件和库,但你需要观察软件包管理器在安装后是否重新启动服务

您的帖子有错误

您正在挂载private,您需要挂载在/var/lib/vz/root/1102/bin目录上(假设这是根在您的 vz.conf文件中指向的位置)。

答案2

正如您所问的,Jay 对此给出了正确的答案,但我不确定您是否想在系统运行时升级人们的容器。

我认为您仍然希望将系统目录在其容器中以只读方式挂载,但您希望对这些系统目录进行版本控制,并希望它们将自己的软件安装到其主目录中或从其容器外部绑定挂载的某个地方。

当用户想要最新版本时,您应该使用更新后的模板重新创建他们的 CT。每次升级时,您都可以将其保存为 CT 模板。这可以保持他们的系统稳定,但他们可以随时要求升级。

相关内容