Collegamenti simbolici e cartelle sincronizzate in Vagrant


99

Voglio usare Vagrant per fornire un ambiente di sviluppo comune al mio team. Gli host sono completamente diversi:

  • Alcuni usano OS X, alcuni Linux e alcuni Windows.
  • Alcuni usano VMware, altri usano VirtualBox.

All'interno della VM vogliamo eseguire Linux.

Finora va tutto bene.

Ora la nostra idea era che ogni sviluppatore fosse in grado di utilizzare l'IDE di sua scelta, e quindi abbiamo introdotto una cartella sincronizzata che condivide il codice sorgente tra l'host e la VM. Fondamentalmente, funziona anche ... tranne che per i collegamenti simbolici.

All'interno del nostro codice sorgente abbiamo effettivamente alcuni link simbolici, il che non è un problema all'interno di Linux all'interno della VM, ma su Windows come host questo causa problemi. L'unica cosa che possiamo non facciamo è sbarazzarsi dei link simbolici, quindi abbiamo bisogno di un altro modo di affrontare la questione.

Finora abbiamo provato una serie di opzioni:

  • C'è una soluzione alternativa menzionata in un numero di Vagrant, sfortunatamente questo è solo VirtualBox e non aiuta coloro che eseguono VMware. Finora, non abbiamo trovato un modo per eseguire il codice nel Vagrantfile a seconda del provider utilizzato.
  • Invece di utilizzare una cartella condivisa standard, ora abbiamo provato a utilizzare il tipo rsync . Funziona su Windows, ma si blocca su OS X con una serie di errori che ci dicono che il symlink has no referent(un errore per collegamento simbolico).
  • Abbiamo pensato a NFS , ma funziona solo se non utilizzi Windows come host.
  • Abbiamo anche pensato a SMB , ma anche questo funziona solo su Windows come host.

Non riesco a immaginare che siamo le uniche o le prime persone su questo pianeta ad avere problemi con host multipiattaforma e collegamenti simbolici all'interno della cartella condivisa.

Come puoi risolvere questo problema, in modo da poter mantenere collegamenti simbolici, ma utilizzare comunque diversi sistemi operativi host?



@SteveBennett, quel problema (a cui fa riferimento l'attuale risposta accettata) è stato risolto in Vagrant 1.1, che è stato rilasciato 15 mesi prima che l'OP pubblicasse la domanda. E comunque riguarda le cartelle condivise di VirtualBox, non le cartelle rsync. Vedi la mia risposta di seguito (la risposta accettata è sbagliata).
jdunk

Risposte:


64

Virtualbox non consente collegamenti simbolici su cartelle condivise per motivi di sicurezza. Per abilitare i collegamenti simbolici, è necessario aggiungere la seguente riga al blocco di configurazione del provider vm nel file Vagrant:

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

Inoltre, su Windows Vagrant Up deve essere eseguito in una shell con diritti di amministratore. Non sono necessarie soluzioni alternative.


9
Sospetto che l'OP e molte persone che hanno visualizzato questa domanda usassero i termini "condiviso" e "sincronizzato" in modo intercambiabile. Nota il secondo punto elenco dell'OP che implica fortemente che stava usando cartelle condivise, ma ha provato a passare a una cartella rsynced perché non funzionavano. IIRC, la soluzione fornita qui ha risolto il problema che stavo avendo, in ogni caso.
Steve Bennett

2
@SteveBennett, d'accordo sul riferimento: potenziale confusione. Ragione in più per chiarire. È difficile immaginare che questo suggerimento avrebbe risolto il tuo problema quando si riferisce a un problema così vecchio [risolto da tempo], a meno che tu non stia usando una versione considerevolmente vecchia di vagabondo. E anche se lo facesse, IMO sarebbe stato di pochissimo aiuto considerando le pessime prestazioni del filesystem di VBox per le directory condivise (ad esempio "git status" che richiede diversi secondi), anche se è possibile che stavi condividendo solo un piccolo progetto con pochissimi file. mitchellh.com/…
jdunk

5
L'esecuzione vagrant upin una shell con diritti di amministratore è tutto ciò che è richiesto. Come ha sottolineato @jdunk, questa opzione di configurazione è già impostata di default in Vagrant, a partire da questo commit che è avvenuto quasi un anno prima che questa risposta fosse pubblicata. Detto questo, l'esecuzione vagrant upin una shell con diritti di amministratore ha risolto il mio problema.
Ajedi32

2
Non risponde alla domanda. Non funziona sulle cartelle sincronizzate.
Manel

Questa risposta è sbagliata per 2 motivi principali. 1. Si riferisce alle cartelle condivise di VBox, non alle directory sincronizzate - due cose completamente diverse. 2. Questa impostazione era comunque già predefinita in Vagrant 1.1, rilasciata 15 mesi prima della domanda dell'OP. Vedi la mia risposta qui sotto per maggiori informazioni.
jdunk

94

La risposta accettata non va bene. La domanda descrive un problema con le cartelle sincronizzate , non con le cartelle condivise . La soluzione proposta non avrebbe alcun effetto su una cartella rsynced ( non condivisa ). E anche se l'OP stava utilizzando una cartella condivisa , il suggerimento della risposta accettata è qualcosa che era già stato integrato in vagrant a partire dalla 1.1, rilasciato 15 mesi prima che l'OP pubblicasse la domanda (per non parlare delle cartelle condivise di VirtualBox sono estremamente lente ).


Ho riscontrato lo stesso problema: su OS X, ho ricevuto l' symlink has no referenterrore rsync. Sono stato personalmente in grado di risolverlo aggiungendo particolari argomenti rsync al mio vagrantfile:

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

Ho anche aperto questo numero su gitHub di vagrant per sottolineare qualcosa che sembra essere sbagliato con il loro valore predefinito per rsync__args(in particolare, che uno degli argomenti predefiniti --copy-links, sembra rompere un altro, --archivealmeno per quanto riguarda la copia di collegamenti simbolici interrotti ).


Buona chiamata - grazie @jdunk. Sì, secondo i documenti di Vagrant, l' --copy-linksopzione è impostata per impostazione predefinita. Questo era il mio problema. Rimuovendolo (usando la tua risposta sopra), questo si prende cura di tutto.
Phil Birnie

1
Molto utile, grazie. Anche se vorrei un'alternativa a Windows.
Aleksandr Makov

4
Nota che, secondo i documenti di Vagrant, le cartelle condivise sono il tipo predefinito di cartella sincronizzata per gli utenti di VirtualBox: "Se stai utilizzando il provider VirtualBox, le cartelle condivise di VirtualBox sono il tipo di cartella sincronizzato predefinito." ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) La domanda dell'OP sembra anche implicare che le cartelle condivise di VirtualBox siano una preoccupazione, quindi la risposta accettata tenta di affrontare almeno una parte del problema (e in effetti lo ha fatto risolvi il problema per me).
Ajedi32

Grazie mille per avermi salvato il culo, ho cercato ovunque su Internet e finalmente qualcuno che capisce questo problema!
Dovizu

1
Grazie. Questo è ciò che ha risolto il mio problema (quello nel titolo, e quello a cui sono arrivato qui in cerca di una soluzione, e che non è quello che viene chiesto in modo confuso).
johncip

6

Ho provato tutte queste opzioni per risolvere un errore in esecuzione npm install .

Semplicemente eseguendo vagrant in un prompt di amministrazione e caricando il vm (vagrant reload ), il problema è stato risolto.

Sono tornato indietro e ho rimosso la SharedFoldersEnableSymlinksCreateconfigurazione dal Vagrantfile, e tutto andava ancora bene.


npm updatenon funzionava nella mia cartella condivisa vagabonda. Questa soluzione lo ha risolto per qualche motivo.
Emre

1
Dopo ulteriori ricerche, risulta che la creazione di un collegamento simbolico richiede l'autorizzazione di amministratore in Windows per impostazione predefinita. Per modificare le autorizzazioni, vedere la risposta qui: superuser.com/a/125981
gameweld

2

Il tipo di cartella sincronizzata predefinita vboxsfpresenta un problema di prestazioni noto con un numero elevato di file / directory e manca il supporto per collegamenti simbolici e collegamenti fisici (vedere ticket 818 - un bug di più di 7 anni). Evita di usarlo.

La cartella sincronizzata di tipo rsync potrebbe essere la scelta migliore.

Hai detto che si è bloccato, quale versione di rsync stai utilizzando? Prova ad aggiornarlo a 3.1.0 tramite brew, so che quello OOTB è troppo vecchio (2.x), il che potrebbe causare problemi.


[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'
Musa Haidari

1
Sono stato contento quando ho letto questa risposta, pensando che avrebbe risolto il mio problema ma ottengo lo stesso di sopra quando faccio sudo mount -t rsync shared /var/wwwl'errore di esseremount: unknown filesystem type 'rsync'
samayo

rsyncnon è mai un tipo di file system, quindi non sarai in grado di montarlo.
Terry Wang

@samyo fare riferimento a vagrantup.com/docs/synced-folders/rsync.html è necessario configurare in Vagrantfileed eseguire manualmente vagrant rsynco vagrant rsync-auto. Altrimenti verrà sincronizzato solo in alto e ricaricato.
Terry Wang

1

Dopo aver agitato per un'ora e aver provato alcune soluzioni diverse (vagrant-vbguest , la correzione suggerita da Marvin), non sono stato in grado di ottenere collegamenti simbolici nelle cartelle condivise per lavorare con VirtualBox 4.8.10, Vagrant 1.5.1.

Ho scoperto che una soluzione più semplice consiste nel configurare una cartella condivisa separata e quindi utilizzare Ruby File.readlinkper leggere il percorso sottostante:

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

1
Non lo capisco. Potresti spiegare con un esempio? Grazie
Cassiano

0

Aggiungi la seguente riga a Vagrantfile:

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

Questo ha funzionato per me SOLO dopo aver effettuato il downgrade da virtualbox 6.0.8 a 6.0.4 e vagrant 2.2.4 a 2.2.1.

quando apri il terminale (io uso git bash su Windows 10) con "Esegui come amministratore".

prova anche a cambiare git bash: nel file di progetto: $ vim .git / config cambia in link simbolici = 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.