Dowiązania symboliczne i zsynchronizowane foldery w Vagrant

99

Chcę używać 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, niektórzy używają VirtualBox.

Wewnątrz maszyny wirtualnej chcemy uruchomić Linuksa.

Jak dotąd wszystko jest w porządku.

Nasz pomysł polegał na tym, że każdy programista będzie mógł korzystać z wybranego przez siebie IDE, dlatego wprowadziliśmy zsynchronizowany folder, który udostępnia kod źródłowy między hostem a maszyną wirtualną. Zasadniczo działa to również… z wyjątkiem dowiązań symbolicznych.

Wewnątrz naszego kodu źródłowego faktycznie mamy kilka dowiązań symbolicznych, co nie jest problemem w Linuksie wewnątrz maszyny wirtualnej, ale w systemie Windows jako hosta powoduje to problemy. Jedyne, czego nie możemy 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:

  • W numerze Vagrant jest omówione obejście , niestety jest to tylko VirtualBox i nie pomaga tym, którzy używają VMware. Jak dotąd nie znaleźliśmy sposobu na uruchomienie kodu w Vagrantfile w zależności od używanego dostawcy.
  • Zamiast używać standardowego folderu współdzielonego, próbowaliśmy teraz użyć typu rsync . Działa to w systemie Windows, ale ulega awarii w systemie OS X z wieloma błędami informującymi nas, że symlink has no referent(jeden błąd na łącze symboliczne).
  • Myśleliśmy o NFS , ale działa to tylko wtedy, gdy nie używasz systemu Windows jako hosta.
  • Pomyśleliśmy również o SMB , ale to znowu działa tylko w systemie Windows jako host.

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

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

Golo Roden
źródło
@SteveBennett, ten problem (do którego odnosi się obecna akceptowana odpowiedź) został rozwiązany w Vagrant 1.1, który został opublikowany 15 miesięcy przed opublikowaniem pytania przez PO. I tak jest o folderach współdzielonych VirtualBox, a nie o folderach rsync. Zobacz moją odpowiedź poniżej (zaakceptowana odpowiedź jest błędna).
śmieci

Odpowiedzi:

64

Virtualbox nie zezwala na dowiązania symboliczne do folderów współdzielonych ze względów bezpieczeństwa. Aby włączyć łącza symboliczne, do bloku konfiguracyjnego dostawcy maszyny wirtualnej w pliku Vagrantfile należy dodać następujący wiersz:

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

Dodatkowo w systemie Windows vagrant up musi być uruchamiany w powłoce z uprawnieniami administratora. Nie są potrzebne żadne obejścia.

Marvin
źródło
9
Podejrzewam, że OP i wiele osób przeglądających to pytanie używało zamiennie terminów „udostępniony” i „zsynchronizowany”. Zwróć uwagę na drugi punkt w OP, który wyraźnie sugeruje, że używał folderów współdzielonych, ale próbował przełączyć się do folderu rsynced, ponieważ nie działały. IIRC, podane tutaj rozwiązanie rozwiązało w każdym razie problem, który miałem.
Steve Bennett
2
@SteveBennett, zgodził się odnośnie: potencjalnego zamieszania. Tym bardziej należy wyjaśnić. Trudno sobie wyobrazić, że ta sugestia rozwiązałaby twój problem, gdy odnosi się do tak starego [dawno rozwiązanego] problemu, chyba że używasz znacznie starej wersji włóczęgi. A nawet gdyby tak było, IMO byłoby to bardzo mało pomocne, biorąc pod uwagę fatalną wydajność systemu plików VBox dla współdzielonych katalogów (np. „Stan git” zajmuje kilka sekund), chociaż możliwe, że współdzieliłeś tylko mały projekt z bardzo małą liczbą plików. mitchellh.com/…
jdunk
5
Wystarczy vagrant upuruchomić w powłoce z uprawnieniami administratora. Jak zauważył @jdunk, ta opcja konfiguracji jest już domyślnie ustawiona w Vagrant, od tego zatwierdzenia, które miało miejsce prawie rok przed opublikowaniem tej odpowiedzi. To powiedziawszy, uruchomienie vagrant upw powłoce z uprawnieniami administratora rozwiązało mój problem.
Ajedi, 32
2
Nie odpowiada na pytanie. Nie działa na zsynchronizowanych folderach.
Manel
Ta odpowiedź jest błędna z dwóch głównych powodów. 1. Odnosi się do folderów współdzielonych VBox, a nie do katalogów zsynchronizowanych - dwie zupełnie różne rzeczy. 2. To ustawienie i tak było już domyślne w Vagrant 1.1, wydane 15 miesięcy przed pytaniem PO. Zobacz moją odpowiedź poniżej, aby uzyskać więcej informacji.
jdunk
94

Przyjęta odpowiedź nie jest dobra. Pytanie dotyczy problemu z synchronizowanymi folderami, a nie folderami udostępnionymi . Proponowane rozwiązanie nie miałoby wpływu na folder zsynchronizowany ( nie udostępniony ). I nawet jeśli OP korzystał z folderu współdzielonego , sugestia zaakceptowanej odpowiedzi jest czymś, co zostało już zintegrowane z włóczęgą od 1.1, wydanej 15 miesięcy przed opublikowaniem pytania przez OP (nie wspominając o udostępnionych folderach VirtualBox są strasznie powolne ).


Napotkałem ten sam problem: na OS X otrzymałem symlink has no referentbłąd rsync. Osobiście udało mi się go rozwiązać, dodając określone argumenty rsync do mojego vagrantfile:

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

Otworzyłem również ten problem na githubie włóczęgi, aby wskazać coś, co wydaje się być nie tak z ich domyślną wartością rsync__args(konkretnie, że jeden z domyślnych argumentów --copy-linkswydaje się łamać inny, --archiveprzynajmniej jeśli chodzi o kopiowanie uszkodzonych linków symbolicznych ).

śmieci
źródło
Dobra rozmowa - dzięki @jdunk. Tak, zgodnie z dokumentacją Vagrant ta --copy-linksopcja jest ustawiona domyślnie. To był mój problem. Usuwając to (używając swojej odpowiedzi powyżej) - to załatwia sprawę.
Phil Birnie,
1
Bardzo przydatne, dzięki. Chociaż chciałbym mieć alternatywę dla systemu Windows.
Aleksandr Makov
4
Zauważ, że zgodnie z dokumentacją Vagrant foldery współdzielone są domyślnym typem folderu synchronizowanego dla użytkowników VirtualBox: „Jeśli używasz dostawcy VirtualBox, foldery współdzielone VirtualBox są domyślnym typem folderu synchronizowanego”. ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) Pytanie OP wydaje się również sugerować, że foldery współdzielone VirtualBox są problemem, więc zaakceptowana odpowiedź próbuje rozwiązać przynajmniej część problemu (i rzeczywiście napraw problem za mnie).
Ajedi, 32
Dziękuję bardzo za uratowanie mojego tyłka, szukałem wszędzie w Internecie i wreszcie ktoś, kto rozumie ten problem!
Dovizu
1
Dziękuję Ci. To właśnie rozwiązało mój problem (ten w tytule i ten, który przyjechałem tutaj, szukając rozwiązania, a który, myląco, nie jest tym, o który pytano).
johncip
7

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

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

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

gameweld
źródło
npm updatenie działa w moim folderze współdzielonym włóczęgi. To rozwiązanie naprawiło to z jakiegoś powodu.
Emre
1
Po dalszych badaniach okazuje się, że utworzenie dowiązania symbolicznego wymaga domyślnie uprawnień administratora w systemie Windows. Aby zmodyfikować uprawnienia, zobacz odpowiedź tutaj: superuser.com/a/125981
gameweld
Uruchamianie Vagranta i promta poleceń jako administrator na maszynie z systemem Windows 10 działało dla mnie na npx create-react-app `` nazwa_projektu ''.
sybozz
2

Domyślny typ folderu zsynchronizowanego vboxsfma znany problem z wydajnością z dużą liczbą plików / katalogów i nie obsługuje dowiązań symbolicznych i twardych (patrz zgłoszenie 818 - błąd sprzed 7 lat). Unikaj używania go.

Folder synchronizowany typu rsync może być najlepszym wyborem.

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

Terry Wang
źródło
[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'
Musa Haidari
1
Ucieszyłem się, gdy przeczytałem tę odpowiedź, myśląc, że rozwiąże to mój problem, ale otrzymuję to samo co powyżej, gdy robię sudo mount -t rsync shared /var/wwwbłądmount: unknown filesystem type 'rsync'
samayo
rsyncnigdy nie jest typem systemu plików, więc nie będzie można go zamontować.
Terry Wang
@samyo patrz vagrantup.com/docs/synced-folders/rsync.html, które musisz skonfigurować w Vagrantfilei ręcznie uruchomić vagrant rsynclub vagrant rsync-auto. W przeciwnym razie zostanie zsynchronizowany tylko po uruchomieniu i ponownym załadowaniu.
Terry Wang
1

Po godzinie kłopotania się i wypróbowania kilku różnych rozwiązań (zgodnie vagrant-vbguestz sugestią Marvina) nie udało mi się uzyskać dowiązań symbolicznych w folderach współdzielonych do pracy z VirtualBox 4.8.10, Vagrant 1.5.1.

Odkryłem, że prostszym rozwiązaniem jest skonfigurowanie oddzielnego folderu współdzielonego, a następnie użycie Rubiego File.readlinkdo odczytu w podstawowej ścieżce:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
James O'Beirne
źródło
1
Nie rozumiem. Czy mógłbyś wyjaśnić na przykładzie? Dzięki
Cassiano
0

Dodaj następujący wiersz do pliku Vagrantfile:

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

To zadziałało dla mnie TYLKO po obniżeniu virtualbox 6.0.8 do 6.0.4 i włóczędze 2.2.4 do 2.2.1.

kiedy otwierasz terminal (ja używam git bash w Windows 10) z "Uruchom jako administrator".

spróbuj także zmienić git bash: w pliku projektu: $ vim .git / config zmień na symbollinks = 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
Batchen Regev
źródło