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

99

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

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

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

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

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

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

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

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

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

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

Голо Роден
источник
Обсуждение здесь: github.com/mitchellh/vagrant/issues/713#issuecomment-4416384
Стив Беннетт,
@SteveBennett, эта проблема (на которую ссылаются текущие принятые ответы) была решена в Vagrant 1.1, который был выпущен за 15 месяцев до того, как OP опубликовал вопрос. И в любом случае речь идет об общих папках VirtualBox, а не о папках rsync. См. Мой ответ ниже (принятый ответ неверен).
jdunk

Ответы:

64

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

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

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

Марвин
источник
9
Я подозреваю, что ОП и многие люди, просматривающие этот вопрос, использовали термины «общий» и «синхронизированный» как синонимы. Обратите внимание на второй пункт маркера OP, который явно подразумевает, что он использовал общие папки, но пытался переключиться на rsynced папку, потому что они не работали. IIRC, решение, представленное здесь, в любом случае решило мою проблему.
Стив Беннетт
2
@SteveBennett, согласен: потенциальная путаница. Еще одна причина уточнить. Трудно представить, что это предложение решило бы вашу проблему, когда оно относится к такой старой [давно решенной] проблеме, если только вы не использовали значительно старую версию vagrant. И даже если бы это было так, ИМО, это было бы очень мало помощи, учитывая ужасную производительность файловой системы VBox для общих каталогов (например, "git status" занимает несколько секунд), хотя возможно, вы использовали только небольшой проект с очень небольшим количеством файлов. mitchellh.com/…
jdunk
5
vagrant upВсе, что требуется - запустить в оболочке с правами администратора. Как отметил @jdunk, этот параметр конфигурации уже установлен по умолчанию в Vagrant, поскольку этот коммит произошел почти за год до публикации этого ответа. Тем не менее, запуск vagrant upв оболочке с правами администратора решил мою проблему.
Ajedi32
2
Не отвечает на вопрос. Он не работает с синхронизированными папками.
Manel
Этот ответ неверен по двум основным причинам. 1. Это относится к общим папкам VBox, а не к rsynced каталогам - две совершенно разные вещи. 2. Этот параметр уже был по умолчанию в Vagrant 1.1, выпущенном за 15 месяцев до вопроса OP. См. Мой ответ ниже для получения дополнительной информации.
jdunk 02
94

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

барахло
источник
Хороший звонок - спасибо @jdunk. Да, согласно документации Vagrant, этот --copy-linksпараметр установлен по умолчанию. Это была моя проблема. Удалив это (используя ваш ответ выше) - это позаботится об этом.
Фил Бирни,
1
Очень полезно, спасибо. Хотя хотелось бы альтернативы Windows.
Александр Маков
4
Обратите внимание, что согласно документам Vagrant, общие папки являются типом синхронизируемой папки по умолчанию для пользователей VirtualBox: «Если вы используете поставщика VirtualBox, то общие папки VirtualBox являются типом синхронизируемой папки по умолчанию». ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) Вопрос OP также, похоже, подразумевает, что общие папки VirtualBox вызывают беспокойство, поэтому принятый ответ пытается решить хотя бы часть проблемы (и действительно исправьте проблему для меня).
Ajedi32
Большое спасибо за то, что спас мою задницу, я искал везде в Интернете и, наконец, кто-то, кто понимает эту проблему!
Довизу
1
Спасибо. Это то, что решило мою проблему (та, что указана в заголовке, и та, которую я пришел сюда в поисках решения, и которая, как ни странно, не та, о которой спрашивают).
johncip
7

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

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

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

Gameweld
источник
npm updateне работал в моей бродячей общей папке. Это решение по какой-то причине исправило это.
Emre
1
После дополнительных исследований выяснилось, что для создания символической ссылки по умолчанию требуется разрешение администратора в Windows. Чтобы изменить разрешения, см. Ответ здесь: superuser.com/a/125981
gameweld
Запуск Vagrant и командной строки от имени администратора на машине с Windows 10 работал у меня на npx create-response-app 'project_name'.
sybozz
2

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

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

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

Терри Ван
источник
[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'
Муса Хайдари,
1
Я был рад, когда прочитал этот ответ, думая, что это решит мою проблему, но я получаю то же самое, что и выше, когда я делаю sudo mount -t rsync shared /var/wwwошибкуmount: unknown filesystem type 'rsync'
samayo
rsyncникогда не является типом файловой системы, поэтому вы не сможете его смонтировать.
Терри Ван
@samyo - ссылка на vagrantup.com/docs/synced-folders/rsync.html, которую необходимо настроить в Vagrantfileи вручную запустить vagrant rsyncили vagrant rsync-auto. В противном случае он будет синхронизироваться только при включении и перезагрузке.
Терри Ван
1

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

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

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
Джеймс О'Бейрн
источник
1
Я не понимаю. Не могли бы вы объяснить на примере? Спасибо
Cassiano
0

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

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

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

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

также попробуйте изменить git bash: в файле проекта: $ vim. git / config изменить на символические ссылки = 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
Батчен Регев
источник