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

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

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

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

Пока все в порядке.

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

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

До сих пор мы пробовали несколько вариантов:

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

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

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

Ответ 1

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

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

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

Ответ 2

Принятый ответ не годится. Этот вопрос описывает проблему с синхронизированными папками, не общедоступными папками. Предлагаемое решение не повлияет на папку rsynced (не общая). И даже если OP использует папку shared, принятое предложение ответа - это то, что уже было интегрировано в бродягу с 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, по крайней мере, до копирования сломанных символических ссылок).

Ответ 3

Я попробовал все эти параметры, чтобы разрешить ошибку с запуском npm install.

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

Я вернулся и удалил конфигурацию SharedFoldersEnableSymlinksCreate из Vagrantfile, и все было в порядке.

Ответ 4

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

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

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

Ответ 5

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

Я обнаружил, что более простым решением является настройка отдельной общей папки, а затем использование Ruby File.readlink для чтения в базовом пути:

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

Ответ 6

Добавьте следующую строку в Vagrantfile:

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

Это сработало для меня ТОЛЬКО после того, как я понизил версию Virtualbox 6.0.8 до 6.0.4 и vagrant 2.2.4 до 2.2.1.

когда вы открываете терминал (я использую git bash на Windows 10) с "Запуск от имени администратора".

также попробуйте изменить git bash: в файле проекта: $ vim.git/config изменить на symlinks = true

[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = true
        ignorecase = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master