在VMWare虚拟机中运行Vagrant

47

我意识到这本质上是操作系统的嵌套(OSCepion),但我认为对我来说可能是最合理的选择(如果有更好的选择,请告诉我,因为这似乎非常可怕)。

情况如下:我有一台Windows 8机器。我喜欢它——它在除开发以外的所有方面表现都很出色。至于开发,我一直在使用运行Ubuntu的VMWare虚拟机。我尝试过使用Cygwin,但感觉不适合我。

现在我要加入一个使用Vagrant管理开发环境的项目,所以我需要能够使用Vagrant。但是,从我看到的情况来看,Vagrant主要用于在一致的环境中运行代码,而不一定用于编写代码。如果我想通过SSH连接我的vagrant盒子来编写代码,那么我就必须为每台机器重新配置我的首选项,例如我的.vimrc文件等。

那么,在我的Ubuntu虚拟机中安装Vagrant是否有意义?我觉得在某些时候,VMs在VMs内部会失控并引起问题。是否有更好的方式来做到这一点呢?

编辑:所以我试了一下——正如我所预料的,我遇到了一些错误。当我尝试启动机器时,我收到以下错误消息:

Failed to open a session for the virtual machine vagranttest_1371583212.

VT-x is not available. (VERR_VMX_NO_VMX).

Result Code: NS_ERROR_FAILURE (0x80004005)
Component: Console
Interface: IConsole {db7ab4ca-2a3f-4183-9243-c1208da92392}

看起来我的VMware虚拟机不能运行另一个虚拟机。有没有最佳方法解决这个问题?


4
顺便提一句:只要启用了VT-x/AMD-V加速,就可以在VirtualBox中运行另一个VirtualBox。 - Terry Wang
我可以确认Terry的评论 - 在我之前的工作地点,我们在vSphere VM中运行Vagrant VM,以构建和测试新的核心Vagrant box映像 :) - Matthew Skelton
@MatthewSkelton 感谢您回复我。此时进行双重虚拟化的原因是为了构建 CentOS 主机,然后将其导出并移动到 vShpere 环境中。一旦我确定 CentOS 主机已正确配置,它将被移动到服务器虚拟化程序中,并不再在 VMWare Fusion 中运行。我只是使用 VMWare Fusion 来配置和检查 CentOS 主机,然后再将其导出。 - blong
@b.long - 我们所做的只是将VirtualBox文件格式转换为vSphere文件格式,然后在vSphere中启动并运行验收测试。这意味着一旦验收测试通过,我们就可以立即将候选VM映像提升为模板。 详情请见:http://owainperry.com/2013/09/04/building-a-virtual-machine-compiler-using-vagrant-and-chef/ - Matthew Skelton
刚刚发现这个问题并想更新一下关于virtualbox.org/ticket/4032的评论线程。自VirtualBox 6.1.0以来,它已经得到实现。 - Jasmine Hegman
显示剩余6条评论
4个回答

56

今天我遇到了同样的问题。解决方法非常简单。

  1. 关闭vmware虚拟机。
  2. 进入“编辑虚拟机设置”。
  3. 进入处理器选项卡。那里有三个复选框。
  4. 勾选第二个复选框(启用VT-x / AMD-V)。
  5. 开启虚拟机。

完成上述步骤后,虚拟机软件virtualbox应该可以在vmware中正常工作。


1
@b.long:不,其实并没有听起来很粗鲁。我希望我的解决方案能够帮到你 :) - Andrew Orsich
您在VMWare VM上安装CentOS并在其中使用VirtualBox时是否遇到任何问题?无论我做什么,我的内部VM都运行缓慢。我不希望出现这种情况,因为我已经给了CentOS VM 7140MB的内存和来自我的2.7GHz Core i7的2个核心。当我尝试启动我的内部VM(使用或不使用Vagrant)时,它们运行缓慢,并且似乎没有分配太多内存。随着VM启动,我看到CPU 1和2会稍微升高,然后最终下降,但内存使用量从未超过1GB。尝试启动VM时,它会像这样超时:https://gist.github.com/b-long/3ef3a726f9f4d28f4d59 - blong
我也在Vagrant的邮件列表上发布了我的问题:https://groups.google.com/forum/#!topic/vagrant-up/6YHdRupCKuI - blong
对于使用ESXi免费版本的用户,请注意:除非将虚拟机硬件升级到v9+,否则无法实现此操作。一旦升级完成,您将无法从vSphere客户端编辑虚拟机详细信息。 - Erik
感谢提供简单的解决方案,它非常有效。 - ET Worker
显示剩余2条评论

4
为了回答原问题以及@blong的Vagrant论坛帖子,这是我所做的使其工作的方法。
我自己也在尝试类似的事情(实际上是Vagrant / VMware托管Vagrant / Vbox),并且已经执行了我能想到的所有优化,给我的“主机”VM分配了大量内存(24GB)和6个核心,通过设置“将所有VM内存适合保留的主机内存”来禁用将VM交换到磁盘(当它发生时,在Windows上会导致问题),并允许每个VM页面文件(否则它们将驻留在系统页文件中,这限制了您可以同时运行的VM数量)。
我所做的一切都非常完美,我遇到的网络问题是由于我身后的公司代理引起的。一旦我配置好,我的VM就可以访问互联网,一切都正常了。
我确实不得不手动设置--natbindip1和--natnet1,除了我的示例(Virtualbox)Vagrantfile中已经设置的natdnsproxy1和naddnshostresolver1之外。这些设置可以在Virtualbox文档中找到正确的使用方法。
总之,在VM CPU设置中使用VT-x直通/"虚拟化"选项,为VM提供足够的内存,不允许该内存在"根"主机上被交换,并尝试确保您的网络范围不重叠,否则会出现路由问题。
这是我正在使用的Vagrantfile,它几乎完全基于andreptb的gist进行现代.ie vagrant设置。https://gist.github.com/andreptb/57e388df5e881937e62a
# -*- mode: ruby -*-
# vi: set ft=ruby :

# box name into env var, same script can be used with different boxes. Defaults to win7-ie11.
box_name = box_name = ENV['box_name'] != nil ? ENV['box_name'].strip : 'win7-ie11'
# box repo into env var, so private repos/cache can be used. Defaults to http://aka.ms
box_repo = ENV['box_repo'] != nil ? ENV['box_repo'].strip : 'http://aka.ms'

Vagrant.configure("2") do |config|
  # If the box is win7-ie11, the convention for the box name is modern.ie/win7-ie11
  config.vm.box = "modern.ie/" + box_name
  # If the box is win7-ie11, the convention for the box url is http://aka.ms/vagrant-win7-ie11
  config.vm.box_url = box_repo + "/vagrant-" + box_name
  # big timeout since windows boot is very slow
  config.vm.boot_timeout = 500

  # rdp forward
  config.vm.network "forwarded_port", guest: 3389, host: 3389, id: "rdp", auto_correct: true

  # winrm config, uses modern.ie default user/password. If other credentials are used must be changed here
  config.vm.communicator = "winrm"
  config.winrm.username = "IEUser"
  config.winrm.password = "Passw0rd!"

  config.vm.provider "virtualbox" do |vb|
    # first setup requires gui to be enabled so scripts can be executed in virtualbox guest screen
    #vb.gui = true
    vb.customize ["modifyvm", :id, "--memory", "1024"]
    vb.customize ["modifyvm", :id, "--vram", "128"]
    vb.customize ["modifyvm", :id,  "--cpus", "2"]
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    vb.customize ["guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 10000]
  end
end

我额外的更改:

# Need the WinRM gem for managing from Linux
$ sudo gem install winrm

    config.vm.communicator = "winrm"
+  config.winrm.host = "localhost"
    config.winrm.username = "IEUser"
    config.winrm.password = "Passw0rd!"
# This one may not be necessary, I added it for completeness
+  config.vm.guest = :windows

# In order to USE the two CPUs you need the ioapic
# Virtualbox gives an error in the GUI and only shows 1 CPU in the VM otherwise
      vb.customize ["modifyvm", :id, "--cpus", "2"]
+    vb.customize ["modifyvm", :id, "--ioapic", "on"]
# We had to modify the network range because we are running Virtualbox inside VMware
+    vb.customize ["modifyvm", :id, "--natnet1", "192.168.199.0/24"]

去掉加号并将这些行添加到Vagrantfile中,您应该拥有一个与我使用的等效工作系统。


我不得不添加以下内容: v.customize ["modifyvm", :id, "--cpus", "2"] v.customize ["modifyvm", :id, "--hwvirtex", "on"]。 @dragon788,你如何设置IP地址? - v0d1ch
@vodich 我和其他参数做了很多相同的事情。["modifyvm", :id, "--natbindip1", " true"]。我会再次检查语法,但基本上它需要修改命令、虚拟机ID、要更改的参数和要设置的值。 - dragon788
谢谢,我想我会在一个新的主题中提出一个关于配置的问题,除了我们在这里讨论的内容之外,因为我刚刚花了6个小时试图弄清楚它,但没有成功 :( - v0d1ch
你能把你的Vagrantfile中的其他设置复制粘贴一下吗?这样我就可以尝试一下了。 - v0d1ch

2
如果您在vsphere中的虚拟机中运行virtualbox,您需要通过ssh连接到ESXi来更新配置。
步骤:
  1. ssh登录ESXi服务器。
  2. 找到属于您的VM的vmx文件 find / -name *.vmx
  3. 关闭您的虚拟机电源(非常重要,否则更改将被覆盖)
  4. 编辑该vmx文件,在文件底部添加新的配置:vhv.enable = "TRUE"
  5. 启动您的虚拟机
  6. 享受Vagrant。 :)

在我的 ESXi 客户端 5.5 和 Ubuntu 16.04 客机上运行良好。 - Iman Kermani

1

我已经在两个VMware产品中尝试过这种方法。右键单击虚拟机:

  • 在vCloud Director 5.5的VM属性中,硬件选项卡上有一个“将硬件辅助CPU虚拟化暴露给客户操作系统”的复选框,但对我来说是灰色的。YMMV。
  • 在vSphere版本5.5.0的编辑设置>虚拟硬件>CPU中,该复选框称为“向客户操作系统公开硬件辅助虚拟化”,对我有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接