Liens symboliques et dossiers synchronisés dans Vagrant

99

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 la machine virtuelle, nous voulons exécuter Linux.

Jusqu'à présent, tout va bien.

À présent, notre idée était que chaque développeur puisse utiliser l'EDI de son choix, et nous avons donc introduit un dossier synchronisé qui partage le code source entre l'hôte et la VM. Cela fonctionne aussi bien… sauf pour les liens symboliques.

À l'intérieur de notre code source, nous avons en fait quelques liens symboliques, ce qui n'est pas un problème dans le Linux à l'intérieur de la VM, mais sur Windows en tant qu'hôte, cela pose des problèmes. La seule chose que nous ne pouvons pas faire est de nous débarrasser des liens symboliques, nous avons donc besoin d'un autre moyen de gérer cela.

Jusqu'à présent, nous avons essayé un certain nombre d'options:

  • Il existe une solution de contournement 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 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 plante 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 comme hôte.
  • Nous avons également pensé à SMB , mais cela ne fonctionne encore que sur Windows en tant qu'hôte.

Je ne peux pas imaginer que nous soyons les seuls ou les premiers sur cette planète à rencontrer des problèmes avec les hôtes multi-plateformes et les 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?

Golo Roden
la source
@SteveBennett, ce problème (auquel la réponse acceptée actuelle fait référence) a été résolu dans Vagrant 1.1, qui a été publié 15 mois avant que le PO ait publié la question. Et il s'agit de toute façon de dossiers partagés VirtualBox, pas de dossiers rsync'd. Voir ma réponse ci-dessous (la réponse acceptée est fausse).
jdunk

Réponses:

64

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 Windows, vagrant up doit être exécuté dans un shell avec des droits d'administrateur. Aucune solution de contournement nécessaire.

Marvin
la source
9
Je soupçonne que l'OP et de nombreuses personnes qui consultent cette question utilisaient les termes «partagé» et «synchronisé» de manière interchangeable. Notez le deuxième point de l'OP qui implique fortement qu'il utilisait des dossiers partagés, mais a essayé de basculer vers un dossier rsynced car ils ne fonctionnaient pas. IIRC, la solution fournie ici a résolu le problème que j'avais, dans tous les cas.
Steve Bennett
2
@SteveBennett, d'accord sur: confusion potentielle. Raison de plus pour clarifier. Il est difficile d'imaginer que cette suggestion aurait résolu votre problème lorsqu'elle se réfère à un problème aussi ancien [résolu depuis longtemps], à moins que vous n'utilisiez une version considérablement ancienne de vagrant. Et même si c'était le cas, OMI, cela aurait été très peu utile compte tenu des performances épouvantables du système de fichiers de VBox pour les répertoires partagés (par exemple, "git status" prend plusieurs secondes), bien qu'il soit possible que vous ne partagiez qu'un petit projet avec très peu de fichiers. mitchellh.com
...
5
Exécuter vagrant updans un shell avec des droits d'administrateur est tout ce qui est nécessaire. Comme @jdunk l'a souligné, cette option de configuration est déjà définie par défaut dans Vagrant, à partir de ce commit qui s'est produit presque un an avant que cette réponse ne soit publiée. Cela dit, courir vagrant updans un shell avec des droits d'administrateur a résolu mon problème.
Ajedi32
2
Ne répond pas à la question. Cela ne fonctionne pas sur les dossiers synchronisés.
Manel
Cette réponse est fausse pour 2 raisons majeures. 1. Il fait référence aux dossiers partagés VBox, pas aux répertoires resynchronisés - deux choses complètement différentes. 2. Ce paramètre était déjà un paramètre par défaut de toute façon dans Vagrant 1.1, sorti 15 mois avant la question de l'OP. Voir ma réponse ci-dessous pour plus d'informations.
jdunk
94

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


J'ai rencontré ce même problème: sous OS X, j'ai eu l' symlink has no referenterreur 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 également ouvert ce numéro sur le github de vagrant pour signaler quelque chose qui semble être incorrect avec leur valeur par défaut pour rsync__args(en particulier, que l'un des arguments par défaut --copy-links, semble en casser un autre --archive, du moins en ce qui concerne la copie de liens symboliques rompus ).

poubelle
la source
Bon appel - merci @jdunk. Oui, selon la documentation de Vagrant, l' --copy-linksoption est définie par défaut. C'était mon problème. En supprimant cela (en utilisant votre réponse ci-dessus) - cela s'en occupe.
Phil Birnie
1
Très utile, merci. Bien que je souhaiterais une alternative Windows.
Aleksandr Makov
4
Notez que selon la documentation de Vagrant, les dossiers partagés sont le type par défaut de dossier synchronisé pour les utilisateurs de VirtualBox: "Si vous utilisez le fournisseur VirtualBox, les dossiers partagés VirtualBox sont le type de dossier synchronisé par défaut." ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) La question de l'OP semble également impliquer que les dossiers partagés VirtualBox sont un problème, donc la réponse acceptée tente de résoudre au moins une partie du problème (et résoudre le problème pour moi).
Ajedi32
Merci beaucoup de m'avoir sauvé le cul, j'ai cherché partout sur internet et enfin quelqu'un qui comprend ce problème!
Dovizu
1
Je vous remercie. C'est ce qui a résolu mon problème (celui dans le titre, et celui auquel je suis arrivé ici à la recherche d'une solution, et qui, de manière déroutante, n'est pas celui qui est demandé).
johncip
7

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

Le simple fait d'exécuter vagrant dans une invite d'administration et le chargement de vm ( vagrant reload) ont résolu le problème.

Je suis retourné et j'ai supprimé la SharedFoldersEnableSymlinksCreateconfiguration du Vagrantfile, et tout allait toujours bien.

gameweld
la source
npm updatene fonctionnait pas dans mon dossier partagé vagabond. Cette solution l'a corrigé pour une raison quelconque.
Emre
1
Après plus de recherches, il s'avère que la création d'un lien symbolique nécessite par défaut l'autorisation d'administrateur dans Windows. Pour modifier les autorisations, voir la réponse ici: superuser.com/a/125981
gameweld
L'exécution du Vagrant et de l'invite de commande en tant qu'administrateur dans la machine Windows 10 a fonctionné pour moi sur npx create-react-app 'project_name'.
sybozz il y a
2

Le type de dossier synchronisé par défaut vboxsfa un problème de performance connu avec un grand nombre de fichiers / répertoires, et ne prend pas en charge les liens symboliques et les liens physiques (voir ticket 818 - un bogue vieux de 7 ans et plus). Évitez de l'utiliser.

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

Vous avez mentionné qu'il s'est écrasé, quelle version de rsync utilisez-vous? Essayez de le mettre à jour vers 3.1.0 via brew, je sais que celui OOTB est bien trop ancien (2.x), ce qui pourrait causer des problèmes.

Terry Wang
la source
[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'
Musa Haidari
1
J'étais heureux quand j'ai lu cette réponse, pensant que cela résoudrait mon problème, mais j'obtiens la même chose que ci-dessus quand je fais sudo mount -t rsync shared /var/wwwl'erreurmount: unknown filesystem type 'rsync'
samayo
rsyncn'est jamais un type de système de fichiers, vous ne pourrez donc pas le monter.
Terry Wang
@samyo se réfère à vagrantup.com/docs/synced-folders/rsync.html que vous devez configurer dans le Vagrantfileet exécuter manuellement vagrant rsyncou vagrant rsync-auto. Sinon, il ne sera synchronisé et rechargé.
Terry Wang
1

Après avoir travaillé pendant une heure et essayé quelques solutions différentes ( vagrant-vbguest, solution suggérée par Marvin), je n'ai pas pu obtenir de liens symboliques dans des 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é séparé, puis à utiliser Ruby File.readlinkpour lire le chemin sous-jacent:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
James O'Beirne
la source
1
Je ne comprends pas. Pourriez-vous expliquer avec un exemple? Merci
Cassiano
0

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 UNIQUEMENT après avoir rétrogradé virtualbox 6.0.8 à 6.0.4 et vagrant 2.2.4 à 2.2.1.

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

essayez aussi dans git bash en changeant: 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
Batchen Regev
la source