Символические ссылки и синхронизированные папки в Vagrant


Я хочу использовать Vagrant для обеспечения общей среды разработки для моей команды. Хозяева совершенно разные:

  • некоторые используют OS X, некоторые Linux и некоторые Windows.
  • некоторые используют VMware, некоторые используют VirtualBox.

внутри виртуальной машины, мы хотим запустить Linux.

пока все нормально.

теперь наша идея заключалась в том, что каждый разработчик должен иметь возможность использовать IDE по своему выбору, и поэтому мы ввели синхронизацию папка, которая разделяет исходный код между узлом и виртуальной машиной. Это в принципе тоже работает ... за исключением символических ссылок.

внутри нашего исходного кода у нас на самом деле есть несколько символических ссылок, что не является проблемой в Linux внутри виртуальной машины, но на Windows как хосте это вызывает проблемы. Единственное, что мы можем не do-это избавиться от символических ссылок, поэтому нам нужен другой способ справиться с этим.

до сих пор, мы испытали ряд опции:

  • существует обходной путь, упомянутый в вопрос Бродяга, к сожалению, это VirtualBox-только и не помогает тем, кто работает VMware. До сих пор мы не нашли способ запуска кода в Vagrantfile в зависимости от используемого поставщика.
  • вместо использования стандартной общей папки мы теперь попытались использовать rsync тип. Это работает на Windows, но падает на OS X с рядом ошибок, сообщающих нам что за symlink has no referent (одна ошибка на символьную ссылку).
  • мы думал о NFS, но это работает только в том случае, если вы не используете Windows в качестве хоста.
  • мы тоже думали о SMB, но это снова работает только на Windows, как хост.

Я не могу себе представить, что мы единственные или первые люди на этой планете, которые испытывают проблемы с многоплатформенными хостами и символическими ссылками в общей папке.

Как вы можете решить эта проблема, так что мы можем сохранить символические ссылки, но по-прежнему использовать разные операционные системы хоста?

5 86

5 ответов:

Virtualbox не разрешает символические ссылки на общие папки по соображениям безопасности. Для включения символических ссылок в конфигурационный блок VM provider в Vagrantfile необходимо добавить следующую строку:

config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end

кроме того, в windows vagrant up необходимо выполнить в оболочке с правами администратора. Никаких обходных путей не требуется.

принятый ответ не годится. На вопрос, описывает проблему, с синхр. папки не shared папки. Предложенное решение не будет иметь никакого влияния на rsynced (не общий папку). И даже если ОП использовал shared папка, предложение принятого ответа-это то, что было уже был интегрирован в vagrant по состоянию на 1.1, выпущен за 15 месяцев до публикации OP вопрос (не говоря уже о общие папки VirtualBox ужасно медленные).


я столкнулся с этой же проблемой: на OS X, я получил symlink has no referent ошибка rsync. Лично я был в состоянии решить это путем добавления определенного аргументы rsync для моего vagrantfile:

config.vm.synced_folder ".", "/var/www", type: "rsync", rsync__args: ["--verbose", "--archive", "--delete", "-z"]

Я тоже открыл этот вопрос на GitHub бродяги, чтобы указать что-то, что кажется неправильным с их значением по умолчанию для rsync__args (в частности, что один из по умолчанию аргументы, --copy-links, кажется, ломает другой,--archive, по крайней мере, что касается копирования сломанных символических ссылок).

я попробовал все эти параметры для того, чтобы устранить ошибку работает npm install.

просто запуск vagrant в приглашении администратора и загрузка виртуальной машины (vagrant reload), решен вопрос.

Я вернулся и убрал SharedFoldersEnableSymlinksCreate конфигурация из Vagrantfile, и все было по-прежнему хорошо.

тип синхронизированной папки по умолчанию vboxsf имеет известную проблему производительности с большим количеством файлов / каталогов и не поддерживает символические ссылки и жесткие ссылки (см. ticket 818 - 7+ летняя ошибка). Избегайте его использования.

тип rsync для синхронизации папок может быть вашим лучшим выбором.

вы упомянули, что он разбился, какую версию rsync вы используете? Попробуйте обновить его до 3.1.0 через brew, я знаю, что OOTB один слишком стар (2.X), который может быть вызывая проблемы.

после суеты вокруг в течение часа и попробовать несколько различных решений (vagrant-vbguest, предложенное исправление Марвина), я не смог получить символические ссылки в общих папках для работы с VirtualBox 4.8.10, Vagrant 1.5.1.

я обнаружил, что проще всего будет настроить отдельную общую папку, а затем использовать Руби File.readlink читать в базовом пути:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"