it-swarm.com.de

Symbolische Links und synchronisierte Ordner in Vagrant

Ich möchte Vagrant verwenden, um meinem Team eine gemeinsame Entwicklungsumgebung zur Verfügung zu stellen. Die Gastgeber sind ganz anders:

  • Einige verwenden OS X, einige Linux und einige Windows.
  • Einige verwenden VMware, andere VirtualBox.

Innerhalb der VM wollen wir Linux ausführen.

Bisher ist alles in Ordnung.

Nun bestand unsere Idee darin, dass jeder Entwickler die IDE) seiner Wahl verwenden kann, und daher haben wir einen synchronisierten Ordner eingeführt, der den Quellcode zwischen dem Host und der VM teilt. Dies funktioniert im Grunde genommen auch… außer symbolischen Links.

In unserem Quellcode gibt es tatsächlich ein paar symbolische Links, was unter Linux in der VM kein Problem darstellt, aber unter Windows als Host verursacht dies Probleme. Das Einzige, was wir nicht tun können, ist, die symbolischen Verknüpfungen zu entfernen, also brauchen wir einen anderen Weg, um damit umzugehen.

Bisher haben wir eine Reihe von Optionen ausprobiert:

  • Es gibt eine Problemumgehung, die in einem Problem von Vagrant erwähnt wird. Leider ist dies nur VirtualBox und hilft nicht denjenigen, die VMware ausführen. Bisher haben wir keine Möglichkeit gefunden, Code in der Vagrant-Datei abhängig vom verwendeten Anbieter auszuführen.
  • Anstelle eines gemeinsamen Standardordners haben wir jetzt versucht, den Typ rsync zu verwenden. Dies funktioniert unter Windows, stürzt jedoch unter OS X mit einer Reihe von Fehlern ab, die uns mitteilen, dass das symlink has no referent (ein Fehler pro symbolischem Link).
  • Wir dachten über NFS nach, aber das funktioniert nur, wenn Sie Windows nicht als Host verwenden.
  • Wir denken auch über SMB nach, aber dies funktioniert wieder nur unter Windows als Host.

Ich kann mir nicht vorstellen, dass wir die einzigen oder ersten Personen auf diesem Planeten sind, die Probleme mit plattformübergreifenden Hosts und symbolischen Links innerhalb des freigegebenen Ordners haben.

Wie können Sie dieses Problem lösen, damit wir symbolische Verknüpfungen beibehalten und dennoch verschiedene Host-Betriebssysteme verwenden können?

92
Golo Roden

In Virtualbox sind aus Sicherheitsgründen keine Symlinks für freigegebene Ordner zulässig. Um Symlinks zu aktivieren, muss die folgende Zeile zum Konfigurationsblock des VM-Providers in der Vagrant-Datei hinzugefügt werden:

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

Unter Windows muss vagrant up außerdem in einer Shell mit Administratorrechten ausgeführt werden. Keine Problemumgehungen erforderlich.

57
Marvin

Die akzeptierte Antwort ist nicht gut. Die Frage beschreibt ein Problem mit synchronisierten Ordnern, nicht freigegeben Ordner. Die vorgeschlagene Lösung hat keine Auswirkung auf einen synchronisierten Ordner ( nicht freigegeben). Und selbst wenn das OP einen freigegebenen Ordner verwendet, ist der Vorschlag der akzeptierten Antwort etwas, das bereits ab 1.1 in vagrant integriert wurde, veröffentlicht 15 Monate bevor das OP die Frage gestellt hat (ganz zu schweigen von Die freigegebenen Ordner von VirtualBox sind unglaublich langsam ).


Ich bin auf dasselbe Problem gestoßen: Unter OS X ist der Fehler symlink has no referent rsync aufgetreten. Ich konnte es persönlich lösen, indem ich bestimmte rsync-Argumente zu meinem vagrantfile hinzufügte:

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

Ich habe auch habe dieses Problem geöffnet auf Vagrants Github hingewiesen, um auf etwas hinzuweisen, das mit seinem Standardwert für rsync__args (speziell das eine der Standardargumente, --copy-links, scheint einen anderen zu brechen, --archive, zumindest was das Kopieren defekter Symlinks betrifft).

91
jdunk

Ich habe alle diese Optionen ausprobiert, um einen Fehler bei der Ausführung von npm install Zu beheben.

Durch einfaches Ausführen von vagrant in einer Administrator-Eingabeaufforderung und Laden der vm (vagrant reload) Wurde das Problem behoben.

Ich ging zurück und entfernte die SharedFoldersEnableSymlinksCreate -Konfiguration aus der Vagrant-Datei, und alles war noch in Ordnung.

5
gameweld

Der standardmäßig synchronisierte Ordnertyp ist vboxsf, bei dem Leistungsprobleme mit einer großen Anzahl von Dateien/Verzeichnissen bekannt sind, und es fehlt die Unterstützung für symbolische Links und feste Links (siehe ticket 818 - a 7+ year old Fehler). Vermeiden Sie es.

der synchronisierte Ordner vom Typ rsync ist möglicherweise die beste Wahl.

Sie haben erwähnt, dass es abgestürzt ist. Welche Version von rsync verwenden Sie? Versuchen Sie, es per Brew auf 3.1.0 zu aktualisieren. Ich weiß, dass OOTB) viel zu alt ist (2.x), was Probleme verursachen könnte.

2
Terry Wang

Nachdem ich mich eine Stunde lang umgesehen und ein paar verschiedene Lösungen ausprobiert hatte (vagrant-vbguest, Marvins empfohlene Lösung), konnte ich keine Symlinks in freigegebenen Ordnern für VirtualBox 4.8.10, Vagrant 1.5.1 erhalten.

Ich fand, dass eine einfachere Lösung darin besteht, einen separaten freigegebenen Ordner zu konfigurieren und dann Rubys File.readlink Zu verwenden, um den zugrunde liegenden Pfad einzulesen:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
1
James O'Beirne

Fügen Sie die folgende Zeile zu Vagrantfile hinzu:

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

Dies funktionierte für mich [~ # ~] nur [~ # ~] , nachdem ich virtualbox 6.0.8 auf 6.0.4 und vagrant 2.2.4 auf heruntergestuft hatte 2.2.1.

wenn Sie Terminal öffnen (ich benutze Git Bash unter Windows 10) mit "Run as Admin".

versuchen Sie es auch mit einer Änderung der Git-Bash: In der Projektdatei: $ vim .git/config in symlinks = true ändern

[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
Batchen Regev