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

#synchronization #sync #vagrant #rsync #vagrantfile

#синхронизация #vagrant #rsync #vagrantfile

Вопрос:

Я хочу использовать 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 как хост.

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

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

Комментарии:

1. Обсуждение здесь: github.com/mitchellh/vagrant/issues/713#issuecomment-4416384

2. @SteveBennett, эта проблема (на которую ссылается текущий принятый ответ) была решена в Vagrant 1.1, который был выпущен за 15 месяцев до того, как ОП опубликовал вопрос. И в любом случае речь идет об общих папках VirtualBox, а не о папках rsync. Смотрите мой ответ ниже (принятый ответ неверен).

Ответ №1:

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

Комментарии:

1. Хороший звонок — спасибо @jdunk. Да, согласно документам Vagrant, этот --copy-links параметр установлен по умолчанию. Это была моя проблема. Удалив это (используя ваш ответ выше) — это позаботится об этом.

2. Очень полезно, спасибо. Хотя я бы предпочел альтернативу Windows.

3. Обратите внимание, что согласно документам Vagrant, общие папки являются типом синхронизированной папки по умолчанию для пользователей VirtualBox: «Если вы используете поставщика VirtualBox, то общие папки VirtualBox являются типом синхронизированной папки по умолчанию». ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) Вопрос OP также, по-видимому, подразумевает, что общие папки VirtualBox вызывают беспокойство, поэтому принятый ответ пытается решить хотя бы часть проблемы (и действительно решил проблему для меня).

4. Большое вам спасибо за спасение моей задницы, я искал везде в Интернете и, наконец, кого-то, кто понимает эту проблему!

5. Спасибо. Это то, что решило мою проблему (ту, что в названии, и ту, которую я прибыл сюда в поисках решения, и которая, к сожалению, не является той, о которой спрашивают).

Ответ №2:

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

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

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

Комментарии:

1. Я подозреваю, что OP и многие люди, просматривающие этот вопрос, использовали термины «общий» и «синхронизированный» взаимозаменяемо. Обратите внимание на второй пункт OP, который явно подразумевает, что он использовал общие папки, но попытался переключиться на синхронизированную папку, потому что они не работали. IIRC, решение, представленное здесь, в любом случае решило проблему, с которой я столкнулся.

2. @SteveBennett, согласен с: потенциальная путаница. Тем больше причин для уточнения. Трудно представить, что это предложение решило бы вашу проблему, когда оно ссылается на такую старую [давно решенную] проблему, если только вы не использовали значительно старую версию vagrant. И даже если бы это было так, ИМО, это мало помогло бы, учитывая ужасную производительность файловой системы VBox для общих каталогов (например, «git status» занимает несколько секунд), хотя, возможно, вы делились только небольшим проектом с очень небольшим количеством файлов. mitchellh.com /…

3. Запуск vagrant up в командной оболочке с правами администратора — это все, что требуется. Как указал @jdunk, этот параметр конфигурации уже установлен по умолчанию в Vagrant, начиная с этого коммита , который произошел почти за год до публикации этого ответа. Тем не менее, запуск vagrant up в оболочке с правами администратора решил мою проблему.

4. Не отвечает на вопрос. Он не работает с синхронизированными папками.

5. Этот ответ неверен по 2 основным причинам. 1. Это относится к общим папкам VBox, а не к синхронизированным каталогам — две совершенно разные вещи. 2. Этот параметр уже был установлен по умолчанию в Vagrant 1.1, выпущенном за 15 месяцев до вопроса OP. Смотрите Мой ответ ниже для получения дополнительной информации.

Ответ №3:

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

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

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

Комментарии:

1. npm update не работал в моей общей папке vagrant. Это решение по какой-то причине исправило это.

2. После дополнительных исследований выясняется, что для создания символической ссылки по умолчанию требуется разрешение администратора в Windows. Чтобы изменить разрешения, см. Ответ здесь: superuser.com/a/125981

3. Запуск Vagrant и command promt от имени администратора на компьютере с Windows 10 работал для меня на npx create-react-app ‘project_name’.

Ответ №4:

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

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

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

Комментарии:

1. [wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'

2. Я был рад, когда прочитал этот ответ, думая, что это решит мою проблему, но я получаю то же самое, что и выше, когда я делаю sudo mount -t rsync shared /var/www ошибку mount: unknown filesystem type 'rsync'

3. rsync никогда не является типом файловой системы, поэтому вы не сможете его смонтировать.

4. @samyo обратитесь к vagrantup.com/docs/synced-folders/rsync.html вам нужно настроить в Vagrantfile и вручную запустить vagrant rsync или vagrant rsync-auto . В противном случае он будет синхронизироваться только при запуске и перезагрузке.

Ответ №5:

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

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

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

Комментарии:

1. Я не понимаю. Не могли бы вы объяснить на примере? Спасибо

Ответ №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