Подтвердить что ты не робот

Отладка "Vagrant не может перенаправить указанные порты в этой виртуальной машине"

Я пытаюсь запустить экземпляр Vagrant и получить следующее сообщение:

Vagrant cannot forward the specified ports on this VM, since they
would collide with another VirtualBox virtual machine forwarded
ports! The forwarded port to 4567 is already in use on the host
machine.

To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique host port:

  config.vm.forward_port 80, 1234

Я открыл VirtualBox, но на данный момент у меня нет запущенных боксов, поэтому я в тупике. Как я могу выяснить, какой процесс прослушивается на 4567? Есть ли способ перечислить все ящики Vagrant на моей машине?

Спасибо, Кевин

4b9b3361

Ответ 1

Как говорится в сообщении, порт сталкивается с полем хоста. Я просто изменил бы порт на другое значение на главной машине. Поэтому, если я получаю ошибку для

config.vm.forward_port 80, 1234

то я бы изменил его на

config.vm.forward_port 80, 5656

Так как 1234 может использоваться на моей главной машине.

Для фактического контроля портов на любом компьютере я использую утилиту tcpview для этой ОС и узнаю, какой порт используется там.

Ответ 2

Вы можете видеть, какие экземпляры бродяг работают на вашем компьютере, запустив

$ vagrant global-status
id       name    provider   state   directory
----------------------------------------------------------------------
a20a0aa  default virtualbox saved   /Users/dude/Downloads/inst-MacOSX
64bc939  default virtualbox saved   /Users/dude/svn/dev-vms/ubuntu14
a94fb0a  default virtualbox running /Users/dude/svn/dev-vms/centos5

Если вы не видите каких-либо виртуальных машин, ваш конфликт не является бродячим полем (о котором знает бродяга). Следующее, что нужно сделать, - запустить виртуальный интерфейс VirtualBox и проверить, запущены ли какие-либо экземпляры. Если вы не хотите запускать пользовательский интерфейс, вы можете:

ps -ef |grep VBox

Если у вас есть экземпляры VirtualBox, они должны быть включены в этот вывод. Вы должны иметь возможность просто убивать процессы, в которых есть VirtualBox. Одна из проблем заключается в том, что один из этих процессов, по-видимому, существует, чтобы сохранить права на существование. Просто убейте самый высокий процесс VirtualBox. Если у вас есть образ VirtualBox, но бродяга не знает об этом, некоторые каталоги Vagrant, возможно, были удалены вручную, что означает, что бродяга теряет след экземпляра.

Ответ 3

Следите за тем, чтобы ваш Vagrantfile был не единственным, который использовался при создании окна/экземпляра Vagrant.

Когда вы получите это:

~/dev/vagrant user$ vagrant reload
Vagrant cannot forward the specified ports on this VM, since they
would collide with some other application that is already listening
on these ports. The forwarded port to 8001 is already in use
on the host machine.

To fix this, modify your current projects Vagrantfile to use another
port. Example, where '1234' would be replaced by a unique host port:

  config.vm.network :forwarded_port, guest: 8001, host: 1234

Sometimes, Vagrant will attempt to auto-correct this for you. In this
case, Vagrant was unable to. This is usually because the guest machine
is in a state which doesn't allow modifying port forwarding.
~/dev/vagrant user$ 

На самом деле вы не только используете Vagrantfile от ~/dev/vagrant, но также и тот, который находится в вашем дистрибутиве .box, который обычно находится здесь:

~/.vagrant.d/boxes/trusty/0/virtualbox/Vagrantfile

И если вы посмотрите на него, вы увидите, что в нем есть много сопоставлений портов по умолчанию:

$ cat ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile
$script = <<SCRIPT
bzr branch lp:jujuredirector/quickstart /tmp/jujuredir
bash /tmp/jujuredir/setup-juju.sh
SCRIPT

Vagrant.configure("2") do |config|
  # This Vagrantfile is auto-generated by 'vagrant package' to contain
  # the MAC address of the box. Custom configuration should be placed in
  # the actual 'Vagrantfile' in this box.

  config.vm.base_mac = "080027DFD2C4"
  config.vm.network :forwarded_port, guest: 22, host: 2122, host_ip: "127.0.0.1"
  config.vm.network :forwarded_port, guest: 80, host: 6080, host_ip: "127.0.0.1"
  config.vm.network :forwarded_port, guest: 8001, host: 8001, host_ip: "127.0.0.1"
  config.vm.network "private_network", ip: "172.16.250.15"
  config.vm.provision "shell", inline: $script

end

# Load include vagrant file if it exists after the auto-generated
# so it can override any of the settings
include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
load include_vagrantfile if File.exist?(include_vagrantfile)

Итак, продолжайте и отредактируйте этот файл, чтобы удалить повреждающий столбец переадресации:

  config.vm.network :forwarded_port, guest: 22, host: 2122, host_ip: "127.0.0.1"
  config.vm.network :forwarded_port, guest: 80, host: 6080, host_ip: "127.0.0.1"
  # config.vm.network :forwarded_port, guest: 8001, host: 8001, host_ip: "127.0.0.1"

По:

~/dev/vagrant user$ cp ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile.old
~/dev/vagrant user$ vi ~/.vagrant.d/boxes//trusty/0/virtualbox/Vagrantfile

и следите за другими включениями Vagrantfiles, а именно:

include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)

И теперь он работает:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'trusty'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1401234565101_12345
==> default: Clearing any previously set forwarded ports...
==> 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 => 2122 (adapter 1)
    default: 80 => 6080 (adapter 1)
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> 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: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Home/user/dev/vagrant/vagrant-docker
==> default: Running provisioner: shell...
    default: Running: inline script
...

Надеюсь, что это поможет.

Ответ 4

Я столкнулся с этой проблемой, и оказалось, что RubyMine все еще держался за порт. Я выяснил, какое приложение держалось за порт (31337 в моем случае), выполнив эту команду:

lsof -i | grep LISTEN 

Выход

node       1396 richard.nienaber    7u  IPv4 0xffffff802808b320      0t0  TCP *:20559 (LISTEN)
Dropbox    1404 richard.nienaber   19u  IPv4 0xffffff8029736c20      0t0  TCP *:17500 (LISTEN)
Dropbox    1404 richard.nienaber   25u  IPv4 0xffffff8027870160      0t0  TCP localhost:26165 (LISTEN)
rubymine  11668 richard.nienaber   39u  IPv6 0xffffff8024d8e700      0t0  TCP *:26162 (LISTEN)
rubymine  11668 richard.nienaber   65u  IPv6 0xffffff8020c6e440      0t0  TCP *:31337 (LISTEN)
rubymine  11668 richard.nienaber  109u  IPv6 0xffffff8024d8df80      0t0  TCP localhost:6942 (LISTEN)
rubymine  11668 richard.nienaber  216u  IPv6 0xffffff8020c6ef80      0t0  TCP localhost:63342 (LISTEN)

Ответ 5

Также обратите внимание, что (в Vagrant 1.6.4 по крайней мере) есть папка ~/.vagrant.d/data/fp-leases, с файлами с именами типа 8080, 8081 и т.д. Стирание содержимого этой папки помогло мне только сейчас.

Ответ 6

Если вы используете Proxifier (или подобное приложение), попробуйте сначала его закрыть. Это была проблема, которую я испытал из-за Proxifier на OSX 10.9.

Ответ 7

Я столкнулся с этой проблемой, потому что у меня была виртуальная машина, которая пыталась запустить Postgres, и у меня была Postgres, работающая на моей локальной машине через порт 5432.

После vagrant resume я получил ошибку:

Vagrant не может переадресовать указанные порты на этой виртуальной машине, поскольку они могут столкнуться с каким-либо другим приложением, которое уже прослушивает эти порты. Перенаправленный порт на 5432 уже используется на хост-компьютере.

Посмотрите, что работает на порту 5432:

o-ets-webdeveloper:portal me$ lsof -i :5432
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
postgres 1389     me    5u  IPv6 0x681a62dc601cf1e3      0t0  TCP localhost:postgresql (LISTEN)
postgres 1389     me    6u  IPv4 0x681a62dc6499362b      0t0  TCP localhost:postgresql (LISTEN)

Оказывается, это локальные Postgres, уничтожение этих процессов позволило мне успешно запустить vagrant resume.

Ответ 8

Я исправил это так:

  1. vagrant suspend
  2. Закрыть проект в RubyMine IDE
  3. vagrant resume
  4. Открыть последние на RubyMine IDE

Ответ 9

Мое наблюдение: у меня не было никаких процессов, работающих на порту 8000, поэтому по сути переадресация портов не работала. Исправление: Фил ответ дал решение

~/.vagrant.d/boxes/ 

В указанном выше пути были другие версии vagrant файлов, в которых был указан порт 8000. После того как я удалил их все с помощью приведенной ниже команды, я смог успешно запустить vagrant up

vagrant box remove [name] --all

Ответ 10

Выход:

  1. $ vagrant suspend
  2. $ vagrant резюме