创建要分发的 Ubuntu VM

Jon*_*ann 20 linux virtualbox virtual-machine ubuntu

我是编程课程的助教,任务是创建基于 Ubuntu 14.04 LTS 的虚拟机映像,并预装所有必要的软件(用于 C++ 和 Python 开发),以便学生都运行相同的虚拟系统,我们避免了这些困难让一切都在各种不同的机器和操作系统上工作。我们打算使用 Virtual Box 作为主机 VM 软件,因为它是免费且跨平台可用的。

天真地,我只会使用 Ubuntu 14.04 LTS 磁盘映像,在我的 Virtual Box 中运行它,将其安装到虚拟硬盘 (VDI),使用预定义的密码设置一个“学生”帐户,安装所有必要的软件,然后关闭关闭虚拟机并分发 VDI 文件。我们会要求每个学生将 VDI 导入到 Virtual Box,运行它并设置他们的个人帐户(或仅使用默认的学生帐户)。

  • 上述程序是否可行?
  • 需要注意哪些陷阱?我们需要这几乎是万无一失的。我们预计有 80 多名学生,但只有 4 名助教,因此我们无法提供个人支持。
  • 使用动态分配的 VDI 类型虚拟 HDD 有什么缺点吗?
  • 我可以立即安装 Virtual Box 的 Guest Additions 还是它做任何特定于主机的事情?
  • 有没有更优雅的方式来处理用户帐户的创建?理想情况下,Ubuntu 会让他们通过帐户创建向导,并让他们在第一次启动映像时设置密码(并将它们添加到 sudoers 文件中)。不过,这不是优先事项。我想有一个默认帐户没问题。

Faz*_*r87 18

虽然这个问题在某种程度上是基于某种程度的意见:

是的,这个过程是可行的 - 我相信它会完成你正在寻找的东西,这是我过去在其他 linux 发行版中所做的事情。

唯一真正的缺陷在于磁盘空间...确保您的学生计算机有足够的磁盘空间来处理虚拟磁盘的大小。此外,请确保您至少在一台机器上离线保存副本,以便在学生杀死他们的机器时可以使用模板/参考磁盘快速重新创建磁盘。

动态磁盘的缺点是,随着 VM 随着数据/更新的增长,主机操作系统必须不断分配越来越多的磁盘空间。这会带来性能开销,有时可能会令人头疼 - 特别是如果您在低功率 VM 上运行(主机功率减去用于扩展磁盘的功率确实会使 VM 滞后一点)。它也可能使然后不可移植(一旦学生弄乱了他们的 VM,并非您实验室中的所有机器都可能有 100GB+)

来宾插件不是特定于机器的......它们几乎是一个驱动程序集。当您将 VM 导入新主机时,VM 驱动程序将检测并调整您的硬件以在新主机上工作。

优雅的用户创建 - 不确定,可能是首次启动时运行的脚本并要求用户在脚本自毁之前创建一个新帐户?我会做一些挖掘,并在我有 5 分钟空闲时回复您。

希望这至少部分有所帮助。

  • 谢谢,它确实有很大帮助。我主要关心的是不要弄乱基础知识。不要在用户创建的事情上花太多时间。这真的没那么重要。我只是想,既然我一直在问,我不妨问问是否有一些内置机制来处理它,因为我认为这是一个非常普遍的问题。 (2认同)

Joe*_*l B 13

准确回答您的问题,如果您需要定制 VM 并将其交付给可交付的 VirtualBox VM,我建议使用Packer将 VM 与所有必需的依赖项预先打包。它就是为此目的而构建的,并允许您从 ISO启动映像,针对该映像执行您想要的任何配置,然后创建可交付的 VirtualBox VM 映像。这对您也有好处,因为它准确记录了对可交付成果所做的工作,以防您想复制它/向其中添加一些内容。此外,您可以将项目签入源代码控制系统并进行更改。 这是一个让您开始的示例

但是,如果您希望它们快速运行,我建议使用Vagrant并向您的学生分发一个 Vagrantfile,该文件可以在标准 Ubuntu 映像上执行所需的配置。这有几个优点:

  • Vagrant 使用 VirtualBox 开箱即用,将为学生处理所有困难的部分,例如设置共享文件夹以便他们可以在 VM 和主机之间轻松复制文件,配置网络以允许他们访问互联网等。这也节省了您必须为它们记录/调试 VirtualBox 设置问题的时间。
  • Vagrantfile 比可交付的 VM 小得多。如果您想在课程中途更改/添加某些内容到 VM,您不必重建新的 VM,只需给他们一个更新的 Vagrantfile。
  • 如果他们搞砸了超出他们修复能力的事情,他们可以毫不费力地再次销毁/重新部署虚拟机
  • Vagrantfile 将向您的学生展示对 VM 所做的确切内容,以便当他们达到足够理解的程度时,他们可以看到幕后发生的事情并可能从中学习。

这是一个示例 Vagrantfile,展示了如何在 Ubuntu 14.04 映像上进行一些配置。

  • Vagrant 和/或 Packer 是解决这个问题的方法。 (3认同)

Ton*_*nny 9

完全可行。另一种选择是 Vagrant、Puppet、Chef 或类似的东西,可以从头开始构建 VM,但这需要大量的设置工作。

我的一个站点上的开发团队也这样做,以让新开发人员快速启动并运行。
图像中的 1 个预设帐户(具有 sudo 权限)和一个简短的说明文档,其中包含创建个人帐户必须采取的步骤。

请注意:您很可能需要在 VM 内访问网络/互联网。这可以桥接或 NAT 到主机上。无论您选择哪个,您都必须指导学生如何配置它的主机端。只需将 VM 内的 NIC 设置为 DHCP 设备。这是大多数配置的安全起点,即使用户以后必须手动配置静态 IP 地址。
在 VM 中放置静态 IP 地址确实是在自找麻烦。它绑定了在同一 LAN 上联机的另一个 VM 已经在使用中...

  • 不过,“要设置的大量工作”取决于您创建图像的频率。下学期你还会重修同一门课吗?下学期你可能会用不同的语言学习类似的课程吗?您想让继任者的生活更轻松吗?C++ 编译器的错误在以后的版本中得到修复。一个新的 C++ 标准在 2017 年问世。请记住,程序员是一个人,他花 2 小时编写程序,在 2 秒内完成一项任务,而手动操作需要 2 分钟。;-) (3认同)
  • @JörgWMittag 当然,您说得有道理。但是如果你不熟悉 Vagrant 之类的东西,学习曲线可能会非常陡峭/耗时。就我个人而言,我可能会在本学期选择 VM 解决方案以获得快速解决方案,并在本学期花一些时间开发另一种长期方法的解决方案。 (2认同)
  • 关于网络访问,分布式 VM 可能具有相同的 MAC 地址。这可能不是 NAT 的问题,但无论如何重置 MAC 地址是个好主意。 (2认同)