Символические ссылки и синхронизированные папки в 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