技术用于短期私有虚拟机

我试图构build一个运行短期(CI和testing版本)的软件组件的系统,根据我的要求,每个系统都必须在私有主机上运行。 我将这个定义也纳入了paravirtualsation选项,因为它似乎会为我节省很多头痛。

我正在Mac上工作,所以几乎所有的技术都已经出来了, libvirtquemu等等都不适合我。 不过,我正在计划部署到Debian; 所以在Debian上运行的任何东西都回来了,只要我可以脚本configuration主机以及它的来宾域。

我希望的设置是,我可以用来引导一个Debian安装程序,这意味着在启动时,机器会自动configuration(厨师,木偶,巴布什卡,不介意,真的) – 部分configuration应该build立一个可用于启动容器的模板rootfs。 容器本身也需要configuration,所以当容器出现时,它知道需要做什么工作,可以完成工作,然后退出。

总之,这是我需要的工作stream程:

  1. 启动一台机器(虚拟或其他),并准备好工作。
  2. 这个工作应该由厨师/ puppet / babushka / etc安装的脚本来完成
  3. 当工作进入时,应该开始一个虚拟机来完成这项工作。
  4. 虚拟机应该完成这些工作,退出并将其资源释放给父母/主机。 (重要的是,这可以在合理的硬件上扩展到至less数百个虚拟机)

我已经到了一个地步,我已经尝试了以下内容,并放弃它们,原因如下:

对于主机

  1. 使用Instalinux(LinuxCOE支持)的Pre-seed Debian微型ISO映像( 坏的: 根本没有工作(“找不到内核模块”)(因为Instalinux映像与FTP库不同步,显然这个解决scheme非常脆弱,它也不允许有太多的安装后的范围,并将已知的SSH密钥,主机密钥等放在机器上,似乎像火和忘了,最后我会有一个运行的机器,但没有访问它 。)
  2. Pre-seed Debian netinst ISO( Bad与上面相同的问题,除了至less安装通常会完成,因为ISO和FTP存储库之间没有内核不一致,安装后的范围仍然有限 绝对可靠和可重复的,很容易扔在任何虚拟技术堆栈在Mac上,或裸机上,可以在任何地方工作,但我不能后安装它足够
  3. build立rootfs的各种方法,并将其编译为可引导的硬盘映像( 不好我能做的工作很脆弱,难以安装到真机上,而且是一个复杂的构build过程。 我可以得到它的工作,这似乎提供了预先configuration的机器,以ssh键,主机密钥,主机名,从Git安装的软件给定的规范的最大范围和其他任何,但问题是如何打包它分发,或如何脚本的娱乐。

我真的不确定用什么技术将虚拟机从无到有,运行有用的系统。 似乎有三个步骤给我a)操作系统,b)系统configuration(用户等),然后c)文件系统的变化。

对于客人(虚拟)机器:

  1. 很多东西,大多数我认为这里的答案是使用debootstrap创build的只读rootfs,以及包含要为此特定实例(作业清单)完成的工作的LXC容器上的特殊分区。 插入所有关于构build操作系统,启动,创build用户,从git检出软件以及开展工作的所有常见警告。

我真的不确定要达到什么样的工具,好像这个问题应该很好的解决。 但是我不知道从哪里开始。

大多数人似乎build议主机应该select一种虚拟化技术,启动一台机器到一个工作状态,然后快照(libvirt似乎是这方面的合乎逻辑的最爱)。 使用快照启动任何后续安装以进行testing或生产。

对于来宾机器,lxc似乎提供了最简单的select,除了背景容器,并且稍后通过控制台连接到现有的所有内核之外,可用于稳定Debian的最新版本的lxc已经超过18个月,而且缺less很多被广泛使用的特征。

通常我是一个应用程序开发人员,而且我并不经常使用服务器级别的技术(我确信SF会将这个问题标记为“太主观”),但是我真的不确定要达到的工具。

最后一点是,我知道一个类似堆叠的项目(travis-ci.org)正在使用Vagrant框。 这似乎是一个相当钝的工具,大型,缓慢,面向ruby的工具,专为小规模桌面configurationtesting虚拟机用于关键的服务基础设施,但我也知道其中的一些人,他们比我更聪明,所以也许他们只是放弃了。

任何帮助赞赏。

一些想法:

  1. 您的观点“在合理的硬件上的数百个虚拟机”让我(没有个人经验)想到通过networking启动或通过NFS共享大部分卷空间(/ usr)的虚拟机。 取决于你的虚拟机有多相似。
  2. “我能工作的地方很脆弱”难以置信。 你能更精确地问题是什么?
  3. “将很难安装到真正的机器上”您的意思是“困难”相比,想要创build虚拟机的一键式解决scheme? 我会问:这有多难?这种情况发生的频率如何? 有什么区别,重新创build相应硬件的initrd?
  4. “但是我不能安装它足够的”你是什么魔杖/需要,为什么这不起作用? 您可以将脚本的下载部分引导进程。 VM通过DHCP(根据VM的MAC地址硬configuration)获取IP,根据客户端的IP地址,Samba向VM提供不同的安装后脚本。

在阅读你的文章的时候,我一直在想,stream浪者和stream浪者插件的jenkins会非常适合你的需求。 你所拥有的任何盒子实际上可以处理你正在谈论的虚拟机的数量,甚至不应该注意到维护环境的工具的开销。

使用一些适用于苹果和Debian的东西,我唯一试过的就是虚拟盒子。 在这里使用virtualbox的好处是你可以在你的Mac系统上build立一个虚拟机,并使用相同版本的虚拟盒子将它复制到Debian系统上,并启动。

使用像你这样的虚拟盒子声音的数百个vms将花费相当多的时间使用vboxmange界面为每个vm编写必要的唯一信息。 就像硬盘的uuids,networking接口上的mac地址一样。

如果基本系统要使用以相同方式configuration的相同软件,则可以在虚拟框中创build系统的快照并将其冻结。 因此,不会对您的冻结快照写入更改,而是写入新的临时存储区域。 然后扼​​杀虚拟机,恢复到快照 ,你正在做一个干净的系统没有任何改变,在testing过程中。 这可以全部使用vboxmange编写脚本。

使用您的快照,您还可以制作该虚拟机镜像的数百份副本。 使用vboxmange脚本接口来创build副本,唯一的方式,即uuids和mac地址。 然后有一个启动脚本调用什么改变,configuration你需要申请到您的虚拟机进行testing,或运行各种testing。