Символічні посилання та синхронізовані папки у Vagrant


99

Я хочу використовувати Vagrant, щоб забезпечити спільне середовище розробки для своєї команди. Господарі абсолютно різні:

  • Хтось використовує OS X, хтось Linux, а хтось Windows.
  • Хтось використовує VMware, хтось використовує VirtualBox.

Усередині віртуальної машини ми хочемо запустити Linux.

Поки що все гаразд.

Тепер наша ідея полягала в тому, що кожен розробник зможе використовувати IDE за власним вибором, і отже, ми ввели синхронізовану папку, яка передає вихідний код між хостом та віртуальною машиною. Це в основному працює також ... за винятком символічних посилань.

Всередині нашого вихідного коду ми насправді маємо кілька символічних посилань, що не є проблемою в Linux всередині віртуальної машини, але в Windows як хості це викликає проблеми. Єдине, що ми не можемо зробити - це позбутися символічних посилань, тому нам потрібен інший спосіб впоратися з цим.

Наразі ми спробували ряд варіантів:

  • У випуску Vagrant є згаданий обхідний шлях , на жаль, це лише VirtualBox і не допомагає тим, хто працює на VMware. Поки ми не знайшли спосіб запуску коду у Vagrantfile залежно від використовуваного постачальника.
  • Замість використання стандартної спільної папки ми спробували використати тип rsync . Це працює в Windows, але виходить з ладу в ОС X з низкою помилок, які говорять нам про те, що symlink has no referent(одна помилка за символічне посилання).
  • Ми думали про NFS , але це працює лише в тому випадку, якщо ви не використовуєте Windows як хост.
  • Ми також говорили про SMB , але це знову працює лише в Windows як хост.

Я не можу уявити, що ми єдині або перші люди на цій планеті, які стикаються з проблемами з мультиплатформенними хостами та символічними посиланнями у спільній папці.

Як ви можете вирішити це питання, щоб ми могли зберігати символічні посилання, але все ж використовувати різні операційні системи хоста?



@SteveBennett, ця проблема (на яку в даний час прийняті посилання на відповіді) була вирішена у Vagrant 1.1, який був випущений за 15 місяців до того, як ОП розмістило питання. І все-таки мова йде про спільні папки VirtualBox, а не про папки rsync'd. Дивіться мою відповідь нижче (прийнята відповідь неправильна).
jdunk

Відповіді:


64

Virtualbox не дозволяє символічні посилання на спільні папки з міркувань безпеки. Щоб увімкнути символічні посилання, до блоку конфігурації провайдера vm у файлі Vagrant потрібно додати наступний рядок:

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

Окрім того, на windows vagrant up потрібно виконувати оболонку з правами адміністратора. Жодних обхідних шляхів не потрібно.


9
Я підозрюю, що OP та багато людей, які переглядали це питання, використовували термін "спільний доступ" та "синхронізований" як взаємозамінні. Зверніть увагу на другий маркер OP, що суттєво означає, що він використовував спільні папки, але спробував переключитися на папку rsynced, оскільки вони не працювали. IIRC, запропоноване тут рішення у будь-якому випадку вирішило проблему, яку я мав.
Стів Беннетт,

2
@SteveBennett, погодився re: потенційна плутанина. Тим більше підстав для уточнення. Важко уявити, щоб ця пропозиція вирішила вашу проблему, коли вона стосується такої старої [давно вирішеної] проблеми, якщо ви не використовували значно стару версію бродяги. І навіть якби це сталося, ІМО це мало б допомогти, враховуючи безглузду продуктивність файлової системи VBox для спільних каталогів (наприклад, "git status" займає кілька секунд), хоча цілком можливо, ви ділилися лише невеликим проектом із дуже малою кількістю файлів. mitchellh.com/…
jdunk

5
Запуск vagrant upв оболонці з правами адміністратора - це все, що потрібно. Як зазначив @jdunk, ця опція конфігурації вже встановлена ​​за замовчуванням у Vagrant, станом на цей коміт, який відбувся майже за рік до публікації цієї відповіді. Тим не менш, запуск vagrant upв оболонці з правами адміністратора вирішив мою проблему.
Ajedi32

2
Не відповідає на запитання. Він не працює на синхронізованих папках.
Манел

Ця відповідь неправильна з двох основних причин. 1. Це стосується спільних папок VBox, а не rsynced каталогів - дві абсолютно різні речі. 2. Це налаштування вже було за замовчуванням у Vagrant 1.1, випущеному за 15 місяців до запитання OP. Дивіться мою відповідь нижче для отримання додаткової інформації.
jdunk 02.03.17

94

Прийнята відповідь не є доброю. Питання описує проблему із синхронізованими папками, а не спільними папками. Запропоноване рішення не вплине на rsynced ( не спільну ) папку. І навіть якщо 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опція встановлена ​​за замовчуванням. Це була моя проблема. Видаливши це (використовуючи вашу відповідь вище) - це подбає про це.
Phil Birnie,

1
Дуже корисно, дякую. Хоча я хотів би альтернативи Windows.
Олександр Маков

4
Зверніть увагу, що згідно з документами Vagrant, спільні папки є типовим типом синхронізованої папки для користувачів VirtualBox: "Якщо ви використовуєте постачальника VirtualBox, то загальні папки VirtualBox є типом синхронізованих стандартних папок". ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) Питання OP також, мабуть, передбачає, що спільні папки VirtualBox викликають занепокоєння, тому прийнята відповідь намагається вирішити принаймні частину проблеми (і справді вирішити проблему для мене).
Ajedi32

Щиро дякую, що врятували мою попку, я шукав всюди в Інтернеті і нарешті хтось, хто розуміє цю проблему!
Dovizu

1
Дякую. Це те, що вирішило моє питання (те, що в заголовку, і те, яке я приїхав сюди, шукаючи рішення, і яке заплутано не те, про що запитують).
johncip

6

Я спробував усі ці варіанти, щоб усунути запущену помилку npm install.

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

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


npm updateне працював у моїй бродячій спільній папці. Це рішення з якихось причин це виправило.
Емре

1
Після подальших досліджень виявляється, що створення символічного посилання за замовчуванням вимагає дозволу адміністратора у Windows. Щоб змінити дозволи, див. Відповідь тут: superuser.com/a/125981
gameweld

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. В іншому випадку він буде синхронізований лише при завантаженні та перезавантаженні.
Terry Wang

1

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

Я виявив, що простішим рішенням є налаштування окремої спільної папки, а потім використання Ruby's File.readlinkдля читання основного шляху:

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

1
Я не розумію. Не могли б ви пояснити на прикладі? Дякую
Кассіано

0

Додайте наступний рядок до 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.