Symbolische Links und synchronisierte Ordner in Vagrant

99

Ich möchte Vagrant verwenden, um meinem Team eine gemeinsame Entwicklungsumgebung bereitzustellen. Die Gastgeber sind völlig anders:

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

Innerhalb der VM möchten wir Linux ausführen.

Bisher ist alles in Ordnung.

Unsere Idee war nun, dass jeder Entwickler die IDE seiner Wahl verwenden kann. Daher haben wir einen synchronisierten Ordner eingeführt, der den Quellcode zwischen dem Host und der VM gemeinsam nutzt. Dies funktioniert im Grunde auch… mit Ausnahme von symbolischen Links.

In unserem Quellcode gibt es tatsächlich einige 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 loszuwerden. Wir brauchen also einen anderen Weg, um damit umzugehen.

Bisher haben wir eine Reihe von Optionen ausprobiert:

  • In einer Ausgabe von Vagrant wird eine Problemumgehung erwähnt. 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 auszuführen, je nach verwendetem Anbieter.
  • Anstatt einen freigegebenen Standardordner zu verwenden, 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 symlink has no referent(ein Fehler pro symbolischem Link).
  • Wir haben über NFS nachgedacht , aber das funktioniert nur, wenn Sie Windows nicht als Host verwenden.
  • Wir haben auch über SMB nachgedacht , 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 Hosts mit mehreren Plattformen und symbolischen Links im freigegebenen Ordner haben.

Wie können Sie dieses Problem lösen, damit wir symbolische Links beibehalten und dennoch unterschiedliche Host-Betriebssysteme verwenden können?

Golo Roden
quelle
@SteveBennett, dieses Problem (auf das die derzeit akzeptierten Antwortreferenzen verweisen) wurde in Vagrant 1.1 behoben, das 15 Monate vor der Veröffentlichung der Frage durch das OP veröffentlicht wurde. Und es geht sowieso um freigegebene VirtualBox-Ordner, nicht um rsync-Ordner. Siehe meine Antwort unten (die akzeptierte Antwort ist falsch).
JDunk

Antworten:

64

Virtualbox erlaubt aus Sicherheitsgründen keine Symlinks zu freigegebenen Ordnern. 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

Darüber hinaus muss unter Windows Vagrant Up in einer Shell mit Administratorrechten ausgeführt werden. Keine Problemumgehungen erforderlich.

Marvin
quelle
9
Ich vermute, dass das OP und viele Leute, die diese Frage sahen, den Begriff "geteilt" und "synchronisiert" austauschbar verwendeten. Beachten Sie den zweiten Aufzählungspunkt des OP, der stark impliziert, dass er freigegebene Ordner verwendet hat, aber versucht hat, zu einem synchronisierten Ordner zu wechseln, weil diese nicht funktionierten. IIRC, die hier bereitgestellte Lösung löste auf jeden Fall das Problem, das ich hatte.
Steve Bennett
2
@SteveBennett, vereinbart bezüglich möglicher Verwirrung. Umso mehr Grund zur Klarstellung. Es ist schwer vorstellbar, dass dieser Vorschlag Ihr Problem gelöst hätte, wenn er sich auf ein so altes [längst gelöstes] Problem bezieht, es sei denn, Sie verwenden eine erheblich alte Version von Vagrant. Und selbst wenn dies der Fall wäre, wäre es IMO angesichts der miserablen Leistung des VBox-Dateisystems für gemeinsam genutzte Verzeichnisse (z. B. "Git-Status" dauert einige Sekunden) sehr wenig hilfreich, obwohl Sie möglicherweise nur ein kleines Projekt mit sehr wenigen Dateien freigegeben haben. mitchellh.com/…
jdunk
5
Das Ausführen vagrant upin einer Shell mit Administratorrechten ist alles, was erforderlich ist. Wie @jdunk hervorhob, ist diese Konfigurationsoption in Vagrant bereits standardmäßig festgelegt, und zwar ab diesem Commit, das fast ein Jahr vor der Veröffentlichung dieser Antwort erfolgte. Das heißt, das Ausführen vagrant upin einer Shell mit Administratorrechten hat mein Problem gelöst.
Ajedi32
2
Beantwortet die Frage nicht. Es funktioniert nicht mit synchronisierten Ordnern.
Manel
Diese Antwort ist aus zwei Hauptgründen falsch. 1. Es bezieht sich auf freigegebene VBox-Ordner, nicht auf synchronisierte Verzeichnisse - zwei völlig verschiedene Dinge. 2. Diese Einstellung war ohnehin schon eine Standardeinstellung in Vagrant 1.1, das 15 Monate vor der Frage des OP veröffentlicht wurde. Siehe meine Antwort unten für weitere Informationen.
JDunk
94

Die akzeptierte Antwort ist nicht gut. Die Frage beschreibt ein Problem mit synchronisierten Ordnern, nicht mit freigegebenen Ordnern. Die vorgeschlagene Lösung hätte keine Auswirkungen auf einen synchronisierten ( nicht freigegebenen ) Ordner. Und selbst wenn das OP einen freigegebenen Ordner verwendet, ist der Vorschlag der akzeptierten Antwort bereits ab 1.1 in Vagrant integriert, der 15 Monate vor der Veröffentlichung der Frage durch das OP veröffentlicht wurde (ganz zu schweigen davon, dass die freigegebenen Ordner von VirtualBox äußerst langsam sind ).


Ich bin auf dasselbe Problem gestoßen: Unter OS X wurde der symlink has no referentFehler rsync angezeigt. Ich konnte es persönlich lösen, indem ich meinem rsync bestimmte Argumente hinzufügte vagrantfile:

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

Ich habe dieses Problem auch auf Vagrants Github eröffnet, um auf etwas hinzuweisen, das mit seinem Standardwert für falsch zu sein scheint rsync__args(insbesondere, dass eines der Standardargumente ein --copy-linksanderes zu brechen scheint --archive, zumindest was das Kopieren defekter Symlinks betrifft ).

jdunk
quelle
Guter Anruf - danke @jdunk. Ja, laut Vagrant-Dokumenten ist die --copy-linksOption standardmäßig festgelegt. Das war mein Problem. Indem Sie das entfernen (mit Ihrer Antwort oben) - das kümmert sich darum.
Phil Birnie
1
Sehr nützlich, danke. Obwohl ich mir eine Windows-Alternative wünschen würde.
Aleksandr Makov
4
Beachten Sie, dass gemäß den Vagrant-Dokumenten Freigegebene Ordner der Standardtyp für synchronisierte Ordner für VirtualBox-Benutzer sind: "Wenn Sie den VirtualBox-Anbieter verwenden, sind freigegebene VirtualBox-Ordner der Standardtyp für synchronisierte Ordner." ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) Die Frage des OP scheint auch zu implizieren, dass freigegebene VirtualBox-Ordner ein Problem darstellen, sodass die akzeptierte Antwort versucht, zumindest einen Teil des Problems zu beheben (und dies tatsächlich tat) behebe das Problem für mich).
Ajedi32
Vielen Dank, dass du meinen Arsch gerettet hast. Ich habe überall im Internet gesucht und endlich jemanden, der dieses Problem versteht!
Dovizu
1
Danke dir. Dies hat mein Problem gelöst (das im Titel und das, bei dem ich hier angekommen bin, um eine Lösung zu finden, und das verwirrenderweise nicht gefragt wird).
Johncip
6

Ich habe alle diese Optionen ausprobiert, um einen laufenden Fehler zu beheben npm install.

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

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

Gameweld
quelle
npm updatefunktionierte nicht in meinem freigegebenen Ordner. Diese Lösung hat es aus irgendeinem Grund behoben.
Emre
1
Nach weiteren Recherchen stellt sich heraus, dass das Erstellen eines symbolischen Links standardmäßig die Administratorberechtigung in Windows erfordert. Zum Ändern von Berechtigungen finden Sie Antwort hier: superuser.com/a/125981
gameweld
2

Der standardmäßig synchronisierte Ordnertyp vboxsfweist ein bekanntes Leistungsproblem mit einer großen Anzahl von Dateien / Verzeichnissen auf und unterstützt keine symbolischen und festen Links (siehe Ticket 818 - ein über 7 Jahre alter 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 über Brew auf 3.1.0 zu aktualisieren. Ich weiß, dass der OOTB viel zu alt ist (2.x), was zu Problemen führen kann.

Terry Wang
quelle
[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'
Musa Haidari
1
Ich war froh, als ich diese Antwort las und dachte, sie würde mein Problem lösen, aber ich bekomme das gleiche wie oben, wenn ich sudo mount -t rsync shared /var/wwwden Fehler mount: unknown filesystem type 'rsync'
mache
rsyncist niemals ein Dateisystemtyp, daher können Sie ihn nicht bereitstellen.
Terry Wang
@samyo finden Sie unter vagrantup.com/docs/synced-folders/rsync.html, die Sie im konfigurieren Vagrantfileund manuell ausführen müssen vagrant rsyncoder vagrant rsync-auto. Andernfalls wird es nur beim Hochladen und Neuladen synchronisiert.
Terry Wang
1

Nachdem ich eine Stunde lang herumgespielt und ein paar verschiedene Lösungen ausprobiert hatte ( vagrant-vbguestMarvins Lösungsvorschlag ), konnte ich keine Symlinks in freigegebenen Ordnern für die Arbeit mit 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 mit Ruby File.readlinkden zugrunde liegenden Pfad einzulesen:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
James O'Beirne
quelle
1
Ich verstehe es nicht Könnten Sie das anhand eines Beispiels erklären? Danke
Cassiano
0

Fügen Sie Vagrantfile die folgende Zeile hinzu:

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

Dies funktionierte NUR für mich, nachdem ich virtualbox 6.0.8 auf 6.0.4 und vagrant 2.2.4 auf 2.2.1 heruntergestuft hatte.

Wenn Sie das Terminal öffnen (ich verwende Git Bash unter Windows 10) mit "Als Administrator ausführen".

Versuchen Sie auch, die Git-Bash zu ändern: 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
Batchen Regev
quelle