Vagrant卡在连接超时重试中。

427

昨晚我的虚拟机完美运行。我刚刚打开电脑,输入vagrant up,然后就出现了这个:

==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...
    default: Error: Connection timeout. Retrying...

有人以前遇到过这个问题吗?Vagrant 还没有被广泛讨论,我找不到发生这种情况的原因。


可能的情况是由于VirtualBox无法重定向端口,尽管显示'==> default: Forwarding ports... default: 22 => 2222 (adapter 1)'。 您可以在我的问题链接中查看完整描述。 我仍然不知道如何解决重定向失败(您可以查看VirtualBox日志。 - WebComer
我遇到了相同的问题。问题在于虚拟机上没有安装和启用ssh服务器。 - melihovv
我在安装Ubuntu 16.04时遇到了相同的错误,通过升级VirtualBox到5.1.x版本来解决了这个问题 - 参见http://askubuntu.com/a/822974/151137。 - house9
@Kiee 请检查防病毒软件和防火墙,暂时停止两者,然后再进行操作 :) - AmmyTech
49个回答

385

我解决了这个问题,并将回答,以防其他人有类似的问题。

我的做法是:启用Virtual Box的GUI,以便看到它在启动时等待输入,选择是否要直接启动Ubuntu或安全模式等。

要打开GUI,您必须在Vagrant配置文件Vagrantfile中添加以下内容:

config.vm.provider :virtualbox do |vb|
  vb.gui = true
end

17
问题在于虚拟机可能没有正确关闭,第二天我尝试SSH连接时,机器要求我选择要引导进入哪种模式,但是通过命令行我不知道该怎么做,直到打开了GUI界面才能选择模式。 - Kiee
7
谢谢。在我的情况下,虚拟机卡在了引导加载程序(grub)等待按下ENTER键。我正在使用默认的 hashicorp/precise32。 我使用图形用户界面启动了该机器,然后运行了 sudo grub-mkconfig 命令重置了 /boot/grub/grub.cfg 文件,接着我就可以将 vb.gui=true 行取消注释了。 - maggix
2
@TangibleDream,您的Vagrant文件应该在您运行vagrant up命令的目录中(或应该在其中)。 - Kiee
4
如果是虚拟机的话,很有可能用户名和密码都是“vagrant”。 - Kiee
7
GUI显示以下错误:VT-x/AMD-V 硬件加速在您的系统上不可用。您的64位虚拟机将无法检测到64位CPU并且无法启动。 - SKuijers
显示剩余14条评论

216

如果您遇到了像上面描述的vagrant机器无法启动的情况,那么无需以GUI模式启动(在没有X服务器的情况下不可能)。

当您的虚拟机正在启动时,在另一个终端窗口中,只需找出运行机器的ID即可。

vboxmanage list runningvms

这将导致类似于这样的结果:

"projects_1234567890" {5cxxxx-cxxx-4xxx-8xxx-5xxxxxxxxxx}

很多时候,虚拟机只是在等待您在引导加载程序中选择选项。您可以使用controlvm将适当的按键代码(在本例中为Enter)发送到虚拟机:

vboxmanage controlvm projects_1234567890 keyboardputscancode 1c

就是这样,您的虚拟机将继续启动过程。


22
大多数情况下,这种挂起是由于引导加载程序等待选择条目所致。这是通过发送回车键完成的,你可以使用GUI或使用VirtualBox的命令行界面vboxmanage来执行此操作。因此,你正在“控制”虚拟机并使用参数keyboardputscancode发送“扫描码”为Enter键(1C)。 - Kautiontape
1
这种方法对我没有起作用。唯一注意到的变化是在运行 vboxmanage controlvm dst_default_1407935479617_2464 keyboardputscancode 1c 后,消息输出从默认的 Warning: Connection timeout. Retrying... 变成了 default: Warning: Remote connection disconnect. Retrying...。将尝试使用 vb.gui = true - Marius Butuc
那就是诀窍。它只花了大约30秒钟,但完成了预期的任务,而不需要UI界面。 - Jeffrey
非常好。在Ubuntu上安装VirtualBox时,默认情况下会安装vboxmanage。 - ArmenB
4
在Windows操作系统中,vboxmanage的路径为C:\Progra~1\Oracle\VirtualBox\VBoxManage.exe。此外,以下BIOS更改有助于解决我的问题。 - yingw
第一次修复成功。如果我停止Vagrant虚拟机并重新启动,仍会遇到相同的问题。 - user1012513

47

首先要确认的是,你的机器BIOS中是否启用了硬件虚拟化。

我的问题是超时字符串相同,但GUI界面上只显示黑屏。

我刚设置的一台笔记本电脑出现了同样的问题。经过数小时的搜索,我终于找到了一个提示,看一下BIOS是否启用了硬件虚拟化。

以下是我发现的帖子内容:

我看到仍有一些用户遇到此问题。因此,我将尝试总结以下可能解决SSH超时问题的列表:

  • 确保防火墙或杀毒软件未阻止程序(这种情况很少发生)
  • 给予你的vagrant机器一些时间进行超时操作。如果你的PC/MAC不是非常快,VM将需要一段时间才能引导进入SSH就绪状态,因此会出现超时。
  • 因此,在得出故障结论之前,请先尝试让vagrant完全超时。
  • 如果vagrant完全超时,则在vagrant文件中增加超时限制到几分钟,并再次尝试。
  • 如果仍然无法解决问题,则尝试通过VirtualBox界面对vagrant机器进行干净启动,并预先启用机器的GUI。如果GUI在引导时没有显示任何活动(即只有黑屏,没有文字),那么你的vagrant机器存在问题。
  • 通过VB界面销毁整个机器并重新安装。
  • 在用户文件夹的Vagrant Images文件夹中删除Ubuntu映像文件,并重新下载和安装。
  • 你是否拥有支持64位硬件虚拟化的英特尔处理器?Google一下。如果是,请确保BIOS中没有禁用此功能的设置。
  • 如果你正在运行Windows 7或8,则禁用Hyper-V功能。Google如何禁用。
  • 确保你正在使用SSH启用的客户端。使用Git bash。下载: http://git-scm.com/downloads
  • 安装32位版本的Ubuntu,例如trusty32或precise32。只需在vagrant文件中更改版本并在新目录中重新安装Vagrant。
  • 确保您使用的是最新版本的Vagrant和VirtualBox。最后的办法:格式化计算机,重新安装Windows并购买英特尔Core i系列处理器。
  • 希望这可以帮助您。


    2
    确认一下是否启用了硬件虚拟化。我曾经遇到过类似的问题,重新启动主机并在BIOS中启用虚拟化后,问题便解决了。 - MrBooks
    2
    刚遭受了这个问题。Hyper-V 是原因,卸载它解决了问题。非常感谢。 - ChrisAnnODell
    1
    反直觉的是,在我的BIOS中,我必须禁用虚拟化并启用VT-X。尝试在您的BIOS中切换这些设置。 - Onshop

    44

    我找到的解决方案是在连接到NAT的适配器1中检查电缆连接选项。我真的不知道,这是我的第4个vagrant框,但这是唯一一个未选中电缆连接选项的框,勾选后,它可以正常工作。 NAT cable connection


    1
    我正在使用Homestead 1.0.1和VirtualBox 5.0.28,感谢这个答案,我解决了这个问题。 - Pablo Ezequiel Leone
    通过GUI界面,我可以看到它正在等待网络接口,然后问题得到了解决。谢谢。 - nsc_feabhas
    这个修复了我的问题 +1 - Zac Grierson
    这解决了我的问题:Vagrant 1.9;Virtualbox 5.1;Laravel/Homestead 5.3 - J. LaRosee

    36

    我曾经遇到过完全相同的问题。我认为这个问题可能与SSH密钥有关(文件本地化错误或其他原因,但我检查了很多次),但你总是可以在配置部分添加用户名和密码(而不使用SSH密钥),并运行GUI,所以Vagrantfile中的代码应该看起来类似于以下内容:

    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    
      config.ssh.username = "vagrant"
      config.ssh.password = "vagrant"
    
       config.vm.provider "virtualbox" do |vb|
         vb.gui = true
       end
    end
    

    在我的情况下,即使GUI显示出来了,我也会得到黑屏(没有错误或登录或其他任何可能性),并且在控制台中我会多次收到“Error: Connection timeout. Retrying...”的错误。我确保BIOS中启用了VT-x(虚拟化),我尝试了许多Virtual Box和Vagrant版本的组合以及许多Vagrant盒子(其中一些我没有黑屏幕但仍有连接问题)。最后我再次更新了VirtualBox和Vagrant到最新版本,但问题仍然存在。

    关键的一点是在运行vagrantup后查看VirtualBox中的图标(使用Vagrantfile中的GUI如上所示),如下面的图片所示:

    enter image description here

    虽然在VirtualPC中没有错误(没有警告VT-x未启用),但我的V图标之前是灰色的,这意味着VT-x被禁用。就像我说的,我始终在BIOS中启用它。

    最后我意识到问题可能是我安装和启用的HYPER-V,以便测试旧版本Internet Explorer上的网站。我转到Windows 控制面板 -> 程序和功能/软件,从左侧菜单中选择打开或关闭Windows功能(希望您能找到这些,我使用的是波兰Windows所以不知道确切的英文名称)。我关闭了Hyper-V,重新启动电脑,在运行Virtual Box和vagrant up之后,我最终没有错误,在GUI中我有登录屏幕,并且我的V图标停止变灰。

    我浪费了很多时间解决这个问题(以及许多PC重启),因此我希望这可能对任何在Windows上遇到问题的人有所帮助-确保在控制面板中关闭Hyper-V。


    1
    那就是问题所在! 在BIOS上激活虚拟化并在程序和功能中禁用HYPER-V。像魔术一样解决了!! - Heroselohim
    @Heroselohim 很高兴能帮到你,解决这个问题花费了我很多时间。 - Marcin Nabiałek
    1
    当一个带有点vagrant子文件夹的文件夹存在于Dropbox中或在可能具有不同ssh密钥的机器之间共享时,显式的ssh密码对我很有帮助。 - mlt

    35

    我的电脑一直正常运行,然后出现了这个 "警告:远程连接断开。正在重试..." 反复出现了大约20次,直到重新连接成功。根据上面的回答,我只需要

    vagrant destroy
    vagrant up
    

    一切都很好。我的方法非常简单,通过缩减Vagrantfile文件至只有config.vm.box = "ubuntu/trusty64",问题仍然存在。因此,销毁并重新开始似乎是最佳选择。鉴于这些Vagrant镜像的无状态性质,我不明白为什么这种方法在每种情况下都有效。我刚刚开始接触这个领域,还有很多需要学习。


    您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - user12121234
    7
    是的,我在我的虚拟机上设置了别名和其他东西,摧毁它并不是一个好答案。 - Batman
    很好,我尝试了很多次使用“vagrant halt”,但这个工作完美! - Med
    对我来说非常有效,我遇到了本地主机连接重置问题和这个问题,销毁并重新创建vagrant解决了这些问题。 - shivgre

    19

    我在一台运行Windows 8.1 的电脑上遇到了同样的问题。连接超时并启用gui毫无用处,屏幕是黑色的。在我的情况下,解决方法是禁用“Hyper V”。

    Vagrant文档中的引用https://docs.vagrantup.com/v2/hyperv/index.html

    警告:启用Hyper-V将导致VirtualBox、VMware和任何其他虚拟化技术停止工作。如果有时需要使用其他hypervisor,请参见此博客文章以轻松创建一个启动项来启动未启用Hyper-V的Windows。


    5
    这对我很有用。我只是在“程序和功能”中禁用了Hyper-V。 - stringo0
    我尝试了所有之前的解决方案,只有这个对我也起作用了! - Gilberto Albino

    17

    如果您正在使用Windows 8或10,这是我使用的方法:

    1. 更改BIOS设置以允许64位虚拟化。
    2. 以下是具体步骤:
      • 使用高级启动重新启动电脑(前往高级启动 -“重新启动”-“故障排除”-“高级选项”-“UEFI固件设置”-“重新启动”)
      • 进入BIOS窗口-转到“高级”菜单/选项卡-启用“Intel虚拟技术”
      • 保存并退出。

    2
    同样的问题出现在T440p笔记本电脑上。 - noBillSide
    同样的问题。在我的机器上,这意味着启用虚拟化 Vt-x。 - Erez Cohen
    谢谢!我的BIOS设置中禁用了虚拟化。我之前在同一台机器上使用过vagrant,但由于某种原因BIOS设置被更改而我不知道。所以首先检查这个设置。 - Bahman.A

    8

    我曾遇到一个问题,我的虚拟机(Vagrant box)无法启动,但我仍然可以通过SSH连接。后来发现,我的SSH密钥已经改变了。

    在Vagrant的根目录下,我运行了vagrant ssh-config命令,找到了密钥文件的位置。我用puttygen打开这个文件,生成了一个新的密钥。

    在我的Linux客户机上,我编辑了~/.ssh/authorized_keys文件,并将新的公钥添加进去。

    现在一切都恢复正常了!


    8
    在删除了我的Vagrantfile中的这行代码之后,我遇到了相同的问题:
    config.vm.network "private_network", type: "dhcp"
    

    在我添加了这一行后,虚拟机成功加载。


    我正在使用Scotch Box,我所做的就是取消注释带有config.vm.network的那一行,问题就解决了。 - Alexar

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