2012-02-24 1 views
117

Как-то мой проект Vagrant отключился от виртуальной виртуальной машины, так что когда я vagrant up Vagrant импортирует базовый ящик и создаст новую виртуальную машину.Как связать каталог проекта Vagrant с существующей виртуальной виртуальной машиной VM?

Есть ли способ связать проект Vagrant с существующей виртуальной машиной? Как Vagrant внутренне связывает Vagrantfile с виртуальным каталогом VirtualBox?

ответ

85

ПРЕДУПРЕЖДЕНИЕ: Раствор ниже работает для Vagrant 1.0.x, но не Vagrant 1.1+.

Vagrant использует файл «.vagrant» в том же каталоге, что и ваш «Vagrantfile» для отслеживания UUID вашей виртуальной машины. Этот файл не будет существовать, если виртуальная машина не существует. Формат файла - JSON. Похоже, это если один VM существует:

{ 
    "active":{ 
     "default":"02f8b71c-75c6-4f33-a161-0f46a0665ab6" 
    } 
} 

default это имя виртуальной машины по умолчанию (если вы не используете мульти-VM установок).

Если ваша виртуальная машина каким-то образом отключилась, то вы можете сделать VBoxManage list vms, в котором будут перечислены все виртуальные машины, о которых VirtualBox знает по их имени и UUID. Затем вручную создайте файл .vagrant в том же каталоге, что и ваш Vagrantfile, и заполните его соответствующим образом.

Запустите vagrant status, чтобы убедиться, что Вагрант внес правильные изменения.

Примечание: Это официально не поддерживается Vagrant, и Vagrant может изменить формат .vagrant в любое время. Но это действует с Vagrant 0.9.7 и будет действительным для Vagrant 1.0.

+0

Удивительный! Спасибо. У меня было ощущение, что чего-то не хватает. – jrdmcgr

+0

Невозможно изменить «по умолчанию» на пользовательское имя без использования конфигурации с несколькими VM? –

+40

Для Vagrant 1.1 UUID хранятся в файле, зависящем от машины, на '.vagrant/machines/{name}/{provider}/id'. Фактически, единственное, что содержит файл, это UUID. –

6

для мульти-VM установок, это будет выглядеть следующим образом:

{ 
    "active":{ 
     "web":"a1fc9ae4-5d43-49cb-be31-ab3c4f74745d", 
     "db":"13503bc5-76b8-4c26-95c4-32435b372212" 
    } 
} 

Вы можете получить имена виртуальную машину из Vagrantfile используется для создания этих виртуальных машин. Ищите эту строку:

config.vm.define :web do |web_config| 

"web" - это имя vm в этом случае.

+0

И ** db ** является виртуальной машиной по умолчанию? – Robert

+1

Я не думаю, что здесь есть дефолт, просто веб и db. В зависимости от Vagrantfile есть порядок, из которого vm создается первым. – agwntr

47

Решение с верхней версией совершенно одинаково.

Но сначала вам нужно запустить файл .vbox вручную, так что он появится в VBoxManage list vms

Затем вы можете проверить .vagrant/machines/default/virtualbox/id, чтобы проверить, что UUID является правильным.

+4

Также стоит отметить, что если вы редактируете файл 'id', вы должны сохранить его в одной строке. По какой-то причине он не любит новую строку в конце (мой текстовый редактор добавляет ее по умолчанию, поэтому у меня были проблемы). – Dan2552

+0

У меня возникла проблема с этим, потому что я переименовал папку, в которой он находился. Вагрант настаивал на создании новой виртуальной машины с тем же именем, что и папка, вместо использования существующей виртуальной машины. Я исправил его, создав файл '.vagrant' в формате 1.0, и он обновил его автоматически. Как только я это сделал, он фактически переименовал старую виртуальную машину в новое имя каталога проекта. – Jonah

+2

Я не уверен, что привело к отключению, когда мой брандмауэр/машины/default/virtualbox/id указал на неправильный идентификатор машины VirtualBox. Файл, который помог, был $ HOME/.VirtualBox/VirtualBox.xml. Он имеет раздел MachineRegistry, имеющий UUID машины VirtualBox, сопоставленные с именами машин. Например, arntg

181

Для Vagrant 1.6.3 сделать следующее:

1) В папке, где Vagrantfile находится, запустите команду

VBoxManage list vms 

Вы будете иметь что-то вроде этого:

"virtualMachine" {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 

2) Перейти к следующий путь:

cd .vagrant/machines/default/virtualbox 

3) Создайте файл с именем идентификатора с идентификатором вашего виртуальной машиной ХХХХХХХХХХХМ-XXXXXXXX-XXXXXXXXXXXX

4) Сохраните файл и запустите бродягу до

+0

Я пробовал этот подход, и он работает! Благодаря! – Kirby

+0

Это отлично работает! – smo0f

+7

Хорошим способом создания файла 'id' * без * новой строки является' echo -n '<ваш id here>'> id'. –

8

обновления с тем же проблемой сегодня с Vagrant 1.7.4:

Например, для сопряжения коробки «VIP-quickstart_defa ult_1431365185830_12124 'для бродяг.

$ VBoxManage list 
"vip-quickstart_default_1431365185830_12124" {50feafd3-74cd-40b5-a170-3c976348de27} 
$ echo -n "50feafd3-74cd-40b5-a170-3c976348de27" > .vagrant/machines/default/virtualbox/id 
0

Я нахожусь на macos и обнаружил, что удаление ящиков на коробках решило мою проблему.

По какой-то причине

vagrant halt 

не устранили эти замки, и после восстановления всех моих настроек в .vagrant/машине/по умолчанию/VirtualBox с помощью TimeMachine, удаление замки, правая машина загрузилась.

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

Я бег бродячей 1.7.4 и VirtualBox 5.0.2

3

Я использую Vagrant 1.8.1 на OSX El Capitan

Моего ВМ не был закрыт правильно, когда мой компьютер перезапущен, поэтому, когда я попробовал vagrant up, он всегда создавал новый vm. Никакие решения здесь не работали для меня. Но в чем работа была изменением ingmmurillo's answer

Таким образом, вместо создания .vagrant/machines/default/virtualbox/id на основании идентификатора от запуска VBoxManage list vms.Я должен был обновить идентификатор в .vagrant/machines/local/virtual_box/id

У меня есть один вкладыш, который по существу делает это для меня:

echo -n `VBoxManage list vms | head -n 1 | awk '{print substr($2, 2, length($2)-2)}'` > .vagrant/machines/local/virtualbox/id

Это предполагает, первое поле является один я должен начать с запуска VBoxManage list vms

11

Если бы этот вопрос сегодня, моя папка .vagrant отсутствовал и обнаружил, что там было несколько шагов, чем просто установка ID:

  1. указан идентификатор:

    VBoxManage list vms 
    

    Найти идентификатор и установить в {project-folder}/.vagrant/machines/default/virtualbox/id.

    Обратите внимание, что default может отличаться, если установлено в Vagrantfile, например. config.vm.define "someothername".

  2. Остановите машину от предоставления:

    Создайте файл с именем action_provision в том же директории, что и файл id, установите его содержимое: 1.5:{id} замена {id} с идентификатором, найденного в шаге 1.

  3. Установите новый открытый/закрытый ключ:

    Vagrant использует закрытый ключ, хранящийся в .vagrant/machines/default/virtualbox/private_key, в ssh в машину. Вам нужно будет создать новый.

    ssh-keygen -t rsa 
    

    это private_key.

    vagrant ssh затем скопируйте private_key.pub в /home/vagrant/.ssh/authorized_keys.

+0

является "authorized_keys" файлом или каталогом? – user2568374

+0

это файл, если вы его найдете, вы найдете много вещей, это стандартная вещь ssh – Petecoop

3

В Vagrant 1.9.1:

У меня был VM в Virtual Box под названием 'Ubuntu 16.04.1', поэтому я упаковываю его в качестве бродячих коробок с:

vagrant package --base "Ubuntu 16.04.1" 

отвечает ...

==> Ubuntu 16.04.1: Exporting VM... 
==> Ubuntu 16.04.1: Compressing package to: blah blah/package.box 
2

Это изменение с @Petecoop's answer.

Запустите vagrant halt, если вы еще не закрыли коробку.

Затем список ваших virtualboxes: VBoxManage list vms

Это будет перечислить все ваши virtualboxes. Определите поле, в которое вы хотите вернуться, и возьмите идентификатор между фигурными скобками: {}.

Затем отредактируйте файл идентификатор проекта: sudo nano /.vagrant/machines/default/virtualbox/id

Заменить его с идентификатором скопированный из списка VBS.

Попробуйте vagrant reload.

Если это не работает, и получает повесила на авторизации SSH (где я споткнулся), скопировать незащищенный открытый ключ из vagrant git. Замените содержимое /.vagrant/machines/default/virtualbox/private_key. Резервное копирование оригинала, конечно: cp private_key private_key-bak.

Затем запустить vagrant reload. Он скажет, что он идентифицировал небезопасный ключ и создал новый.

default: Vagrant insecure key detected. Vagrant will automatically replace 
default: this with a newly generated keypair for better security. 
default: Inserting generated public key within guest... 
default: Removing insecure key from the guest if it's present... 
default: Key inserted! Disconnecting and reconnecting using new SSH key... 
==> default: Machine booted and ready! 

Вы все должны быть установлены.

Смежные вопросы