pipe理虚拟机更新和分发 – 做错了?

我为一家软件公司工作。 我的部门负责(其中包括)为我们销售团队的成员构build和分发VMWare虚拟机,然后他们使用VMWare Player启动它们,以便为客户运行他们的产品演示。

最近,我想到我们更新和分发这些虚拟机的方式是各种各样的错误。 这里是我们更新“演示VM:”的过程

  1. 从中央服务器下载新的VM(〜35 GB)副本
  2. 将其设置为永久模式,然后启动并进行更改,例如将产品升级到最新版本和更新许可证
  3. 完成更改后,将其closures并将其设置回非持久模式,然后使用增加的版本号将全部内容(〜35 GB)上传到中央服务器,并使用新的文件夹名称
  4. 谁需要最新版本,然后从文件服务器(35 GB * X)下载它

这不仅占用了大量的networking带宽,而且从networking上下载35 GB的内容也是非常耗时的,特别是对于那些没有内联网速度的远程办公室的人来说。

我的问题是:是否有更好的方法来pipe理需要在用户机器上本地运行的虚拟机的更新和分配?

我开始质疑我们现在的方法的原因是,当虚拟机更新时,只有一小部分文件(VMEM和虚拟磁盘映像)发生变化,对吧? 因此,不应该复制整个虚拟机文件夹,所以应该有一种方法来上传/下载只有三angular洲,可以这么说。 类似于Git等版本控制系统的工作方式。 我实际上试图用Git来做这件事, 但事实certificateGit在pipe理大文件方面是非常糟糕的 。 所以我想我会在这里问。

Rsync可以很好地工作。 如果你想把差异分发给没有直接访问服务器的机器,你也可以尝试xdelta 。

触发更新以在虚拟机内部运行也是一种select,但是您必须小心,即使在更新的时候,如果一个不耐烦的用户在中断它时也不会损坏虚拟机。 我会亲自去修补VM磁盘文件的路线。

在我看来,一个合适的答案取决于目标操作系统,因为可用的工具差别很大。

在这个工作stream程中可以有一个有趣的转变,可以通过使其具有可重现性而且可以灵活地改进过程。 让我试着解释一下。 正如你所描述的那样(如果我已经正确理解了这一点),这个任务是build立在离线build立一个黄金形象的基础上,让销售部门的员工克隆它。

(从你提供的信息来看,这个工作人员是否应该能够修改黄金形象,或者只是为了演示目的,因为它是分发的,这可能会产生一些我不想在下面考虑的分支)。

所以,为了给出至less一个部分的答案,这些是我的

假设:

  • 目标平台(Demo VM)是一个GNU / Linux机器
  • 分布式软件及其许可证都使用目标操作系统的格式(RPM,deb,…)打包(或可以打包)。 这可以通过很多方式来处理:
    • 标准的debian-rulesspec文件与autotoolsstream程配对
    • 使用像fpm这样的工具更灵活的stream程

  • 有一个可以处理包和configurationpipe理/分发的分发点(不需要是单个服务/机器,这只是试图反映这些服务集中可用的需要 )。 再次,许多不同的方式来处理这个问题:
    • 一个cobbler服务器。 可以pipe理不同的服务,但有趣的将是TFTP,PXE,kickstarting,preseeding,即供应步骤。 另外, pulp还可以分发储存库(不仅在客户请求时,而且还主动从服务器)。
    • configurationpipe理系统 ,如puppetansiblesalt ,…,即configuration步骤。
    • 所有不能捆绑的特定configuration都在一个包中,由configurationpipe理系统进行pipe理并存储在一个版本控制系统中 。

  • 除了VMWare的VMPlayer以外的软件可以用来pipe理虚拟化系统。

和一些用例:

– 完整的GNU / Linux虚拟机

如果您可以抱怨上面的假设,有很多方法可以确保最终用户可以拥有一台具有您之前决定的确切configuration和安装软件的虚拟机。 其中之一将涉及使用vagrant 。 使用这个软件,你只需要修改一个文件( vagrantfile来描述你想要build立的机器的types,另外, vagrant也可以处理configuration好的机器到你select的configurationpipe理系统,在线文档相当不错, 网上有很多例子 。

销售人员的机器可以运行任何操作系统,唯一的要求是他们在主机上安装vagrant 。 产生一个演示虚拟机只会使一个简单的vagrant up

vagrant也有一些有趣的select。 检查,例如, packer

– 基于容器的提议,而不是成熟的虚拟机

如果销售人员机器可以使用任何GNU / Linux操作系统,那么也可以利用容器 ,这种运行虚拟化操作系统的方式几乎没有开销。 使用这种技术的更有趣的方式(在我看来)包括但不限于: libvirtdockerLXC 。 Docker有dockerfile这个概念,在function上与vagrantfile类似,更有趣的是,有一个registry ,可以托pipe你的可分配的图像 。

容器可以在托pipe操作系统中作为简单的服务运行,所以使用它们非常简单。

– 没有操作系统

为了帮助改进分配stream程,当然应该确保只安装最低限度所需的软件。 但是,没有操作系统,你可以做任何事情。 如果您的使用情况可以从使用supermin这样的软件中受益,那么一台设备可能只有几兆字节到一千兆字节。

其他人提出了一个不同的方法, 没有托pipe操作系统 ,但这种模式似乎不符合你所描述的。