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

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

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

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

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

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

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

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

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

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

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

Комментарии к вопросу (2)

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


Я столкнулся с этой же проблемой: на OS X, я получил символическая ссылка имеет ошибку не референт в rsync. Лично я был в состоянии решить это путем добавления определенного аргументы rsync для мой файл Vagrantfile`:

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

Я тоже открыла этот вопрос](https://github.com/mitchellh/vagrant/issues/5471) на Vagrant'ы на GitHub, что представляется неверным с их значением по умолчанию для команды rsync__аргументы (в частности, что одним из умолчанию параметр args, --копировать ссылки, кажется, ломая другое, --архив, по крайней мере копировать символические ссылки обеспокоен).

Комментарии (7)
Решение

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

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

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

Комментарии (7)

Я пробовал все эти варианты для того, чтобы устранить ошибку запуска НПМ установки.

Просто запустив бродяга в администратора строке и загрузка ВМ (бродяга перезагрузить), решен вопрос.

Я вернулся и снял SharedFoldersEnableSymlinksCreate конфигурацию в файл Vagrantfile, и все еще было нормально.

Комментарии (2)

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

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

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

Комментарии (4)

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

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

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
Комментарии (2)

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

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

Это работало для меня только после того как я понижен в VirtualBox 6.0.8 на 6.0.4 и Бродяга 2.2.4 до 2.2.1.

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

также попробуйте в Git изменения Баш : в файле проекта: $ ВИМ .в git/config файл изменение симлинки = правда

[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
Комментарии (0)