Enlaces simbólicos y carpetas sincronizadas en Vagrant

99

Quiero utilizar Vagrant para proporcionar un entorno de desarrollo común a mi equipo. Los anfitriones son completamente diferentes:

  • Algunos usan OS X, algunos Linux y algunos Windows.
  • Algunos usan VMware, algunos usan VirtualBox.

Dentro de la VM queremos ejecutar Linux.

Hasta ahora todo está bien.

Ahora nuestra idea era que cada desarrollador pudiera usar el IDE de su elección y, por lo tanto, hemos introducido una carpeta sincronizada que comparte el código fuente entre el host y la VM. Básicamente, esto también funciona ... excepto para los enlaces simbólicos.

Dentro de nuestro código fuente tenemos algunos enlaces simbólicos, lo cual no es un problema dentro de Linux dentro de la VM, pero en Windows como host esto causa problemas. La única cosa que podemos no hacer es deshacerse de los enlaces simbólicos, por lo que necesitamos otra manera de lidiar con esto.

Hasta ahora, hemos probado varias opciones:

  • Hay una solución alternativa mencionada en un problema de Vagrant, desafortunadamente esto es solo para VirtualBox y no ayuda a quienes ejecutan VMware. Hasta ahora, no hemos encontrado una forma de ejecutar código en Vagrantfile dependiendo del proveedor utilizado.
  • En lugar de usar una carpeta compartida estándar, ahora hemos intentado usar el tipo rsync . Esto funciona en Windows, pero se bloquea en OS X con una serie de errores que nos indican que symlink has no referent(un error por enlace simbólico).
  • Pensamos en NFS , pero eso solo funciona si no usa Windows como host.
  • También pensamos en SMB , pero esto nuevamente solo funciona en Windows como host.

No puedo imaginar que seamos los únicos o las primeras personas en este planeta en experimentar problemas con hosts multiplataforma y enlaces simbólicos dentro de la carpeta compartida.

¿Cómo puede resolver este problema, de modo que podamos mantener enlaces simbólicos, pero seguir utilizando diferentes sistemas operativos de host?

Golo Roden
fuente
@SteveBennett, ese problema (al que se refieren las respuestas aceptadas actualmente) se resolvió en Vagrant 1.1, que se publicó 15 meses antes de que el OP publicara la pregunta. Y de todos modos se trata de carpetas compartidas de VirtualBox, no de carpetas rsync. Vea mi respuesta a continuación (la respuesta aceptada es incorrecta).
jdunk

Respuestas:

64

Virtualbox no permite enlaces simbólicos en carpetas compartidas por razones de seguridad. Para habilitar los enlaces simbólicos, se debe agregar la siguiente línea al bloque de configuración del proveedor de VM en Vagrantfile:

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

Además, en Windows, vagrant up debe ejecutarse en un shell con derechos de administrador. No se necesitan soluciones alternativas.

Marvin
fuente
9
Sospecho que el OP y muchas personas que vieron esta pregunta estaban usando el término "compartido" y "sincronizado" indistintamente. Tenga en cuenta la segunda viñeta del OP que implica fuertemente que estaba usando carpetas compartidas, pero intentó cambiar a una carpeta sincronizada porque no funcionaron. IIRC, la solución proporcionada aquí resolvió el problema que estaba teniendo, en cualquier caso.
Steve Bennett
2
@SteveBennett, estuvo de acuerdo con respecto a: posible confusión. Razón de más para aclarar. Es difícil imaginar que esta sugerencia haya resuelto su problema cuando se refiere a un problema tan antiguo [resuelto desde hace mucho tiempo], a menos que estuviera usando una versión considerablemente antigua de vagrant. E incluso si lo hiciera, en mi opinión, habría sido de muy poca ayuda considerando el pésimo rendimiento del sistema de archivos de VBox para directorios compartidos (por ejemplo, "git status" tarda varios segundos), aunque es posible que estuvieras compartiendo solo un pequeño proyecto con muy pocos archivos. mitchellh.com/…
jdunk
5
vagrant upTodo lo que se necesita es ejecutar en un shell con derechos de administrador. Como señaló @jdunk, esta opción de configuración ya está configurada de forma predeterminada en Vagrant, a partir de este compromiso que sucedió casi un año antes de que se publicara esta respuesta. Dicho esto, ejecutar vagrant upen un shell con derechos de administrador resolvió mi problema.
Ajedi32
2
No responde a la pregunta. No funciona en carpetas sincronizadas.
Manel
Esta respuesta es incorrecta por 2 razones principales. 1. Se refiere a carpetas compartidas de VBox, no a directorios sincronizados, dos cosas completamente diferentes. 2. Esta configuración ya era predeterminada de todos modos en Vagrant 1.1, lanzado 15 meses antes de la pregunta del OP. Vea mi respuesta a continuación para obtener más información.
jdunk
94

La respuesta aceptada no es buena. La pregunta describe un problema con las carpetas sincronizadas , no con las carpetas compartidas . La solución propuesta no tendría ningún efecto en una carpeta sincronizada ( no compartida ). E incluso si el OP estaba usando una carpeta compartida , la sugerencia de la respuesta aceptada es algo que ya se había integrado en vagrant a partir de 1.1, lanzado 15 meses antes de que el OP publicara la pregunta (sin mencionar que las carpetas compartidas de VirtualBox son abismalmente lentas ).


Encontré este mismo problema: en OS X, recibí el symlink has no referenterror rsync. Personalmente, pude resolverlo agregando args rsync particulares a mi vagrantfile:

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

También abrí este problema en el github de vagrant para señalar algo que parece estar mal con su valor predeterminado para rsync__args(específicamente, que uno de los argumentos predeterminados --copy-links, parece estar rompiendo otro --archive, al menos en lo que respecta a la copia de enlaces simbólicos rotos. ).

jdunk
fuente
Buena llamada, gracias @jdunk. Sí, de acuerdo con los documentos de Vagrant, la --copy-linksopción está configurada de forma predeterminada. Este era mi problema. Al eliminar eso (usando su respuesta anterior), eso se soluciona.
Phil Birnie
1
Muy útil, gracias. Aunque desearía una alternativa a Windows.
Aleksandr Makov
4
Tenga en cuenta que, según los documentos de Vagrant, las carpetas compartidas son el tipo predeterminado de carpeta sincronizada para los usuarios de VirtualBox: "Si está utilizando el proveedor de VirtualBox, las carpetas compartidas de VirtualBox son el tipo de carpeta sincronizada predeterminado". ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) La pregunta del OP también parece implicar que las carpetas compartidas de VirtualBox son una preocupación, por lo que la respuesta aceptada intenta abordar al menos parte del problema (y de hecho lo hizo arregla el problema por mí).
Ajedi32
¡Muchas gracias por salvarme el trasero, he buscado en todas partes en Internet y finalmente a alguien que entiende este problema!
Dovizu
1
Gracias. Esto es lo que solucionó mi problema (el del título, y el que llegué aquí buscando una solución, y que confusamente no es el que se pregunta).
johncip
6

Probé todas estas opciones para resolver un error de ejecución npm install.

Simplemente ejecutando vagrant en un indicador de administración y cargando el vm ( vagrant reload), resolvió el problema.

Volví y SharedFoldersEnableSymlinksCreateeliminé la configuración del Vagrantfile, y todo seguía bien.

gameweld
fuente
npm updateno funcionaba en mi carpeta compartida de vagabundos. Esta solución lo solucionó por alguna razón.
Emre
1
Después de más investigación, resulta que la creación de un enlace simbólico requiere permiso de administrador en Windows de forma predeterminada. Para modificar los permisos, consulte respuesta aquí: superuser.com/a/125981
gameweld
2

El tipo de carpeta sincronizada predeterminado vboxsftiene un problema de rendimiento conocido con una gran cantidad de archivos / directorios y carece de soporte para enlaces simbólicos y enlaces duros (consulte el ticket 818 , un error de más de 7 años). Evite usarlo.

La carpeta sincronizada de tipo rsync puede ser su mejor opción.

Mencionaste que se bloqueó, ¿qué versión de rsync estás ejecutando? Intente actualizarlo a 3.1.0 a través de brew, sé que el OOTB es demasiado antiguo (2.x), lo que podría estar causando problemas.

Terry Wang
fuente
[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'
Musa Haidari
1
Me alegré cuando leí esta respuesta, pensando que resolvería mi problema, pero obtengo lo mismo que el anterior cuando sudo mount -t rsync shared /var/wwwmount: unknown filesystem type 'rsync'
cometo
rsyncnunca es un tipo de sistema de archivos, por lo que no podrá montarlo.
Terry Wang
@samyo consulte vagrantup.com/docs/synced-folders/rsync.html que necesita configurar en Vagrantfiley ejecutar manualmente vagrant rsynco vagrant rsync-auto. De lo contrario, solo se sincronizará al subir y volver a cargar.
Terry Wang
1

Después de preocuparme durante una hora y probar algunas soluciones diferentes (la solución vagrant-vbguestsugerida por Marvin), no pude obtener enlaces simbólicos en carpetas compartidas para trabajar con VirtualBox 4.8.10, Vagrant 1.5.1.

Descubrí que una solución más simple es configurar una carpeta compartida separada y luego usar Ruby File.readlinkpara leer en la ruta subyacente:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
James O'Beirne
fuente
1
No lo entiendo. ¿Podrías explicar con un ejemplo? Gracias
Cassiano
0

Agregue la siguiente línea a Vagrantfile:

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

Esto funcionó para mí SÓLO después de degradar virtualbox 6.0.8 a 6.0.4 y vagrant 2.2.4 a 2.2.1.

cuando abres la terminal (yo uso git bash en Windows 10) con "Ejecutar como administrador".

también intente en git bash cambiando: en el archivo del proyecto: $ vim .git / config cambie a 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
fuente