Отладка "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 на моей машине?
Спасибо,
Кевин
Ответы
Ответ 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
Я исправил это так:
-
vagrant suspend
- Закрыть проект в RubyMine IDE
-
vagrant resume
- Открыть последние на RubyMine IDE
Ответ 9
Мое наблюдение: у меня не было никаких процессов, работающих на порту 8000, поэтому по сути переадресация портов не работала. Исправление: Фил ответ дал решение
~/.vagrant.d/boxes/
В указанном выше пути были другие версии vagrant файлов, в которых был указан порт 8000. После того как я удалил их все с помощью приведенной ниже команды, я смог успешно запустить vagrant up
vagrant box remove [name] --all
Ответ 10
Выход:
- $ vagrant suspend
- $ vagrant резюме