web-dev-qa-db-fra.com

Liens symboliques et dossiers synchronisés dans Vagrant

Je souhaite utiliser Vagrant pour fournir un environnement de développement commun à mon équipe. Les hôtes sont complètement différents:

  • Certains utilisent OS X, certains Linux et certains Windows.
  • Certains utilisent VMware, certains utilisent VirtualBox.

À l’intérieur de VM), nous souhaitons utiliser Linux.

Jusqu'à présent, tout va bien.

Maintenant, notre idée était que chaque développeur puisse utiliser le IDE de son choix) et nous avons donc introduit un dossier synchronisé qui partage le code source entre l'hôte et la machine virtuelle. aussi… sauf pour les liens symboliques.

Dans notre code source, nous avons en fait quelques liens symboliques, ce qui ne pose pas de problème sous Linux dans la machine virtuelle, mais sous Windows en tant qu'hôte, cela pose des problèmes. La seule chose que nous puissions ne pas faire est de supprimer les liens symboliques. Nous avons donc besoin d'une autre façon de gérer cela.

Jusqu'à présent, nous avons essayé plusieurs options:

  • Une solution de contournement est mentionnée dans un numéro de Vagrant. Malheureusement, il s’agit uniquement de VirtualBox et n’aide pas ceux qui exécutent VMware. Jusqu'à présent, nous n'avons pas trouvé de moyen d'exécuter du code dans le fichier Vagrantfile en fonction du fournisseur utilisé.
  • Au lieu d'utiliser un dossier partagé standard, nous avons maintenant essayé d'utiliser le type rsync . Cela fonctionne sous Windows, mais se bloque sous OS X avec un certain nombre d'erreurs nous indiquant que le symlink has no referent _ (une erreur par lien symbolique).
  • Nous avons pensé à NFS , mais cela ne fonctionne que si vous n'utilisez pas Windows en tant qu'hôte.
  • Nous avons également pensé à propos de SMB , mais cela ne fonctionne à nouveau que sous Windows en tant qu'hôte.

Je ne peux pas imaginer que nous sommes les seules ou les premières personnes sur cette planète à avoir des problèmes avec des hôtes multi-plateformes et des liens symboliques dans le dossier partagé.

Comment pouvez-vous résoudre ce problème afin que nous puissions conserver des liens symboliques tout en utilisant des systèmes d'exploitation hôtes différents?

92
Golo Roden

Virtualbox n'autorise pas les liens symboliques sur les dossiers partagés pour des raisons de sécurité. Pour activer les liens symboliques, la ligne suivante doit être ajoutée au bloc de configuration du fournisseur vm dans le fichier Vagrant:

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

De plus, sur les fenêtres vagabondes, il doit être exécuté dans un shell avec des droits d'administrateur. Aucune solution de contournement nécessaire.

57
Marvin

La réponse acceptée n'est pas bonne. La question décrit un problème avec les dossiers synchronisés , et non partagé dossiers. La solution proposée n’aurait aucun effet sur un dossier rsynced ( non partagé). Et même si le PO utilisait un dossier partagé , la suggestion de réponse acceptée est quelque chose qui avait déjà été intégré à vagrant à partir de 1.1, publié 15 mois avant que le PO ne pose sa question (sans parler de les dossiers partagés de VirtualBox sont extrêmement lents ).


J'ai rencontré le même problème: sous OS X, j'ai le symlink has no referent erreur rsync. J'ai personnellement pu le résoudre en ajoutant des arguments rsync particuliers à mon vagrantfile:

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

J'ai aussi ouvert ce numéro sur le github de vagrant pour signaler quelque chose qui semble être faux avec leur valeur par défaut pour rsync__args _ (spécifiquement, l’un des arguments par défaut, --copy-links, semble en briser une autre, --archive, du moins en ce qui concerne la copie de liens symboliques rompus).

91
jdunk

J'ai essayé toutes ces options afin de résoudre une erreur en cours d'exécution npm install.

Il suffit de lancer vagrant dans une invite d’administration et de charger le vm (vagrant reload), a résolu le problème.

Je suis retourné et j'ai retiré la configuration SharedFoldersEnableSymlinksCreate du fichier Vagrant, et tout allait bien.

5
gameweld

Le type de dossier synchronisé par défaut est vboxsf a des problèmes de performances connus avec un grand nombre de fichiers/répertoires et ne prend pas en charge les liens symboliques et les liens physiques (voir ticket 818 - âgé de plus de 7 ans punaise). Évitez de l'utiliser.

le dossier synchronisé de type rsync peut être votre meilleur choix.

Vous avez mentionné le blocage, quelle version de rsync utilisez-vous? Essayez de le mettre à jour à la version 3.1.0 via brew, je connais le OOTB l’un est bien trop ancien (2.x), ce qui pourrait poser problème.

2
Terry Wang

Après avoir passé une heure à s’agiter et à essayer différentes solutions (vagrant-vbguest, Suggestion de Marvin), je ne pouvais pas utiliser les liens symboliques dans les dossiers partagés pour fonctionner avec VirtualBox 4.8.10, Vagrant 1.5.1.

J'ai trouvé qu'une solution plus simple consiste à configurer un dossier partagé distinct, puis à utiliser Ruby's File.readlink à lire dans le chemin sous-jacent:

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

Ajoutez la ligne suivante à Vagrantfile:

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

Cela a fonctionné pour moi SEULEMENT après avoir rétrogradé virtualbox 6.0.8 à 6.0.4 et vagrant 2.2.4 à 2.2.1.

lorsque vous ouvrez un terminal (j'utilise git bash sur Windows 10) avec "Exécuter en tant qu'administrateur".

essayez aussi de changer dans git bash: dans le fichier projet: $ vim .git/config change en symlinks = 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
0
Batchen Regev