Dowiązania symboliczne i synchronizowane foldery w Vagrant

Chcę użyć Vagrant, aby zapewnić mojemu zespołowi wspólne środowisko programistyczne. Gospodarze są zupełnie inni:

  • niektórzy używają OS X, niektórzy Linux, a niektórzy Windows.
  • niektórzy używają VMware, inni VirtualBox.

Wewnątrz maszyny wirtualnej chcemy uruchomić Linuksa.

Jak na razie wszystko jest w porządku.

Teraz naszym pomysłem było, że każdy programista będzie mógł korzystać z IDE swojego wyboru, dlatego wprowadziliśmy zsynchronizowany folder, który dzieli kod źródłowy między gospodarz i VM. To w zasadzie działa również ... z wyjątkiem dowiązań symbolicznych.

Wewnątrz naszego kodu źródłowego mamy kilka dowiązań symbolicznych, co nie jest problemem w Linuksie wewnątrz maszyny wirtualnej, ale w systemie Windows jako host powoduje to problemy. Jedyną rzeczą, którą możemy Nie zrobić, to pozbyć się dowiązań symbolicznych, więc potrzebujemy innego sposobu, aby sobie z tym poradzić.

Do tej pory wypróbowaliśmy kilka opcji:

  • istnieje obejście wymienione w problem Vagrant, niestety jest to tylko VirtualBox i nie pomaga tym, którzy uruchamiają VMware. Jak dotąd nie znaleźliśmy sposobu uruchamiania kodu w Vagrantfile w zależności od użytego dostawcy.
  • zamiast standardowego folderu współdzielonego spróbowaliśmy użyć typu rsync. Działa to w systemie Windows, ale wywala się na OS X z szeregiem błędów mówiących nam, że symlink has no referent (jeden błąd na dowiązanie symboliczne).
  • myśleliśmy o NFS, ale to działa tylko wtedy, gdy nie używasz systemu Windows jako hosta.
  • myślimy również o SMB , ale to znowu działa tylko na Windows jako host.

Nie mogę sobie wyobrazić, że jesteśmy jedynymi lub pierwszymi osobami na tej planecie, które doświadczają problemów z wieloplatformowymi hostami i dowiązaniami symbolicznymi w folderze udostępnionym.

Jak rozwiązać ten problem, abyśmy mogli zachować dowiązania symboliczne, ale nadal używać różnych systemów operacyjnych hosta?

Author: Golo Roden, 2014-06-13

5 answers

Virtualbox nie zezwala na dowiązania symboliczne w folderach udostępnionych ze względów bezpieczeństwa. Aby włączyć dowiązania symboliczne, należy dodać następującą linię do bloku konfiguracji dostawcy maszyn wirtualnych w pliku Vagrantfile:

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

Dodatkowo, w windows vagrant up musi być wykonywany w powłoce z uprawnieniami administratora. Obejścia nie są konieczne.

 52
Author: Marvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-07 12:25:26

Przyjęta odpowiedź nie jest dobra. Pytanie opisuje problem z zsynchronizowanymi folderami, nie wspólne foldery. Proponowane rozwiązanie nie miałoby wpływu na folder rsynced (nie udostępniany). I nawet jeśli OP używał folderu shared , zaakceptowana sugestia odpowiedzi jest czymś, co zostało już zintegrowane z vagrant od wersji 1.1, opublikowanego 15 miesięcy przed wysłaniem pytania (Nie wspominając o tym, że VirtualBox jest dostępny w dwóch wersjach językowych: angielskiej i Angielskiej.


Napotkałem ten sam problem: na OS X pojawił się błąd symlink has no referent rsync. Ja osobiście byłem w stanie rozwiązać go przez dodanie poszczególnych args rsync do mojego vagrantfile:

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

Również otworzyłem ten problem na GitHubie vagranta, aby wskazać coś, co wydaje się być nie tak z ich domyślną wartością dla rsync__args (w szczególności, że jeden z domyślnych args, --copy-links, wydaje się łamać inny, --archive, przynajmniej tak jak jeśli chodzi o kopiowanie uszkodzonych dowiązań symbolicznych).

 85
Author: jdunk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-02 12:51:06

Wypróbowałem wszystkie te opcje, aby rozwiązać problem z uruchomieniem npm install.

Po prostu uruchomienie vagrant w monicie administratora i załadowanie maszyny wirtualnej (vagrant reload) rozwiązało problem.

Wróciłem i usunąłem konfigurację SharedFoldersEnableSymlinksCreate z pliku Vagrantfile, i wszystko było nadal w porządku.

 4
Author: gameweld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-09 00:15:53

Domyślny typ synchronizowanego folderu to vboxsf mA znany problem z wydajnością z dużą liczbą plików / katalogów i nie obsługuje dowiązań symbolicznych i twardych (zobacz bilet 818 - 7-letni bug). Unikaj jej używania.

Synchronizowany folder typu Rsync może być najlepszym wyborem.

Wspomniałeś, że się rozbił, jaką wersję rsync używasz? Spróbuj zaktualizować go do 3.1.0 przez brew, wiem, że OOTB jeden jest zbyt stary (2.x), co może powodować problemy.

 2
Author: Terry Wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 06:26:42

Po godzinnym zamieszaniu i wypróbowaniu kilku różnych rozwiązań (vagrant-vbguest, sugerowana poprawka Marvina), nie byłem w stanie uzyskać dowiązań symbolicznych w folderach udostępnionych do pracy z VirtualBox 4.8.10, Vagrant 1.5.1.

Odkryłem, że prostszym rozwiązaniem jest skonfigurowanie oddzielnego folderu udostępnionego, a następnie użycie File.readlink Rubiego do odczytu w ścieżce bazowej:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
 1
Author: James O'Beirne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 18:15:52