Links simbólicos e pastas sincronizadas no Vagrant

99

Eu quero usar o Vagrant para fornecer um ambiente de desenvolvimento comum para minha equipe. Os anfitriões são completamente diferentes:

  • Alguns usam OS X, alguns Linux e alguns Windows.
  • Alguns usam VMware, alguns usam VirtualBox.

Dentro da VM, queremos executar o Linux.

Até agora está tudo bem.

Nossa ideia era que cada desenvolvedor fosse capaz de usar o IDE de sua escolha e, portanto, introduzimos uma pasta sincronizada que compartilha o código-fonte entre o host e a VM. Isso basicamente funciona bem ... exceto para links simbólicos.

Dentro de nosso código-fonte, temos alguns links simbólicos, o que não é um problema no Linux dentro da VM, mas no Windows como host isso causa problemas. A única coisa que nós podemos não fazer é se livrar das ligações simbólicas, então precisamos de uma outra maneira de lidar com isso.

Até agora, tentamos várias opções:

  • Há uma solução alternativa mencionada em uma edição do Vagrant, infelizmente isso é apenas para o VirtualBox e não ajuda quem executa o VMware. Até agora, não encontramos uma maneira de executar o código no Vagrantfile dependendo do provedor usado.
  • Em vez de usar uma pasta compartilhada padrão, agora tentamos usar o tipo rsync . Isso funciona no Windows, mas trava no OS X com uma série de erros informando que o symlink has no referent(um erro por link simbólico).
  • Pensamos no NFS , mas isso só funciona se você não usar o Windows como host.
  • Também pensamos sobre o SMB , mas isso só funciona no Windows como host.

Não posso imaginar que sejamos as únicas ou as primeiras pessoas neste planeta a ter problemas com hosts multiplataforma e links simbólicos dentro da pasta compartilhada.

Como você pode resolver esse problema, para que possamos manter links simbólicos, mas ainda usar sistemas operacionais de host diferentes?

Golo Roden
fonte
@SteveBennett, esse problema (ao qual a resposta aceita atualmente faz referência) foi resolvido no Vagrant 1.1, que foi lançado 15 meses antes de o OP postar a pergunta. E trata-se de pastas compartilhadas do VirtualBox, não de pastas rsync. Veja minha resposta abaixo (a resposta aceita está errada).
jdunk

Respostas:

64

O Virtualbox não permite links simbólicos em pastas compartilhadas por razões de segurança. Para habilitar os links simbólicos, a seguinte linha precisa ser adicionada ao bloco de configuração do provedor vm no Vagrantfile:

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

Além disso, no Windows, o vagrant up precisa ser executado em um shell com direitos de administrador. Nenhuma solução alternativa necessária.

Marvin
fonte
9
Suspeito que o OP e muitas pessoas que visualizaram essa pergunta usaram os termos "compartilhado" e "sincronizado" de forma intercambiável. Observe o segundo ponto do OP que indica fortemente que ele estava usando pastas compartilhadas, mas tentou alternar para uma pasta rsynced porque elas não funcionaram. IIRC, a solução apresentada aqui resolveu o problema que eu estava tendo, de qualquer forma.
Steve Bennett,
2
@SteveBennett, concordou com relação a: confusão potencial. Mais uma razão para esclarecer. É difícil imaginar que esta sugestão teria resolvido seu problema quando se refere a um problema tão antigo [há muito resolvido], a menos que você estivesse usando uma versão consideravelmente antiga do vagrant. E mesmo se tivesse, IMO teria sido de pouca ajuda considerando o desempenho abismal do sistema de arquivos do VBox para diretórios compartilhados (por exemplo, "git status" levando vários segundos), embora seja possível que você estivesse compartilhando apenas um pequeno projeto com poucos arquivos. mitchellh.com/…
jdunk
5
Executar vagrant upem um shell com direitos de administrador é tudo o que é necessário. Como @jdunk apontou, esta opção de configuração já está definida por padrão no Vagrant, a partir desse commit que aconteceu quase um ano antes desta resposta ser postada. Dito isso, executar vagrant upem um shell com direitos de administrador resolveu meu problema.
Ajedi32
2
Não responde à pergunta. Não está funcionando em pastas sincronizadas.
Manel
Esta resposta está errada por dois motivos principais. 1. Refere-se a pastas compartilhadas VBox, não diretórios rsynced - duas coisas completamente diferentes. 2. Essa configuração já era um padrão de qualquer maneira no Vagrant 1.1, lançado 15 meses antes da pergunta do OP. Veja minha resposta abaixo para mais informações.
Jdunk
94

A resposta aceita não é boa. A pergunta descreve um problema com pastas sincronizadas , não com pastas compartilhadas . A solução proposta não teria efeito em uma pasta rsynced ( não compartilhada ). E mesmo que o OP usasse uma pasta compartilhada , a sugestão de resposta aceita é algo que já havia sido integrado ao vagrant a partir de 1.1, lançado 15 meses antes do OP postar a pergunta (sem falar que as pastas compartilhadas do VirtualBox são terrivelmente lentas ).


Eu encontrei o mesmo problema: no OS X, recebi o symlink has no referenterro rsync. Eu fui pessoalmente capaz de resolvê-lo adicionando argumentos rsync específicos ao meu vagrantfile:

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

Eu também abri este problema no github do vagrant para apontar algo que parece estar errado com seu valor padrão para rsync__args(especificamente, que um dos args padrão,, --copy-linksparece estar quebrando outro --archive, pelo menos no que diz respeito à cópia de links simbólicos quebrados )

jdunk
fonte
Boa chamada - obrigado @jdunk. Sim, de acordo com os documentos do Vagrant, a --copy-linksopção é definida por padrão. Esse era o meu problema. Removendo isso (usando sua resposta acima) - isso resolve o problema.
Phil Birnie,
1
Muito útil, obrigado. Embora eu desejasse uma alternativa do Windows.
Aleksandr Makov
4
Observe que, de acordo com os documentos do Vagrant, as pastas compartilhadas são o tipo padrão de pasta sincronizada para usuários do VirtualBox: "Se você estiver usando o provedor VirtualBox, as pastas compartilhadas do VirtualBox são o tipo de pasta sincronizada padrão." ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) A pergunta do OP também parece implicar que as pastas compartilhadas do VirtualBox são uma preocupação, então a resposta aceita tenta resolver pelo menos parte do problema (e realmente o fez resolver o problema para mim).
Ajedi32
Muito obrigado por salvar minha bunda, já procurei em todos os lugares na internet e finalmente alguém que entende esse problema!
Dovizu
1
Obrigado. Foi isso que resolveu o meu problema (o do título, e aquele para o qual cheguei aqui procurando uma solução, e que confusamente não é o que está sendo perguntado).
johncip
6

Tentei todas essas opções para resolver um erro de execução npm install.

Basta executar o vagrant em um prompt de administrador e carregar o vm ( vagrant reload) para resolver o problema.

Voltei e removi a SharedFoldersEnableSymlinksCreateconfiguração do Vagrantfile, e tudo ainda estava bem.

campo de jogo
fonte
npm updatenão estava funcionando na minha pasta compartilhada vagrant. Esta solução corrigiu por algum motivo.
Emre
1
Após mais pesquisas, descobriu-se que a criação de um link simbólico requer permissão de administrador no Windows por padrão. Para modificar as permissões, veja a resposta aqui: superuser.com/a/125981
gameweld
2

O tipo de pasta sincronizada padrão vboxsftem um problema de desempenho conhecido com grande número de arquivos / diretórios e não tem suporte para links simbólicos e links físicos (ver tíquete 818 - um bug de 7 anos ou mais). Evite usá-lo.

A pasta sincronizada do tipo rsync pode ser sua melhor escolha.

Você mencionou que ele travou, qual versão do rsync você está executando? Tente atualizá-lo para 3.1.0 via brew, eu sei que o OOTB é muito antigo (2.x), o que pode estar causando problemas.

Terry Wang
fonte
[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'
Musa Haidari
1
Fiquei feliz quando li esta resposta, pensando que resolveria meu problema, mas obtenho o mesmo que acima quando sudo mount -t rsync shared /var/wwwmount: unknown filesystem type 'rsync'
cometi
rsyncnunca é um tipo de sistema de arquivos, então você não será capaz de montá-lo.
Terry Wang
@samyo consulte vagrantup.com/docs/synced-folders/rsync.html que você precisa configurar no Vagrantfilee executar manualmente vagrant rsyncou vagrant rsync-auto. Caso contrário, ele só será sincronizado na inicialização e recarregado.
Terry Wang
1

Depois de mexer por uma hora e tentar algumas soluções diferentes ( vagrant-vbguestcorreção sugerida por Marvin), não consegui obter links simbólicos em pastas compartilhadas para trabalhar com o VirtualBox 4.8.10, Vagrant 1.5.1.

Descobri que uma solução mais simples é configurar uma pasta compartilhada separada e, em seguida, usar o Ruby File.readlinkpara ler o caminho subjacente:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
James O'Beirne
fonte
1
Eu não entendo. Você poderia explicar com um exemplo? Obrigado
Cassiano
0

Adicione a seguinte linha ao Vagrantfile:

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

Isso funcionou para mim SOMENTE depois de fazer o downgrade do Virtualbox 6.0.8 para 6.0.4 e do vagrant 2.2.4 para 2.2.1.

quando você abre o terminal (eu uso git bash no windows 10) com "Executar como Admin".

também tente mudar o git bash: no arquivo de projeto: $ vim .git / config mudar para links simbólicos = 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
fonte