Vagrant의 심볼릭 링크 및 동기화 된 폴더


99

Vagrant를 사용하여 팀에 공통 개발 환경을 제공하고 싶습니다. 호스트는 완전히 다릅니다.

  • 일부는 OS X, 일부 Linux 및 일부 Windows를 사용합니다.
  • 일부는 VMware를 사용하고 일부는 VirtualBox를 사용합니다.

VM 내부에서 Linux를 실행하려고합니다.

지금까지는 모든 것이 좋습니다.

이제 우리의 아이디어는 각 개발자가 자신이 선택한 IDE를 사용할 수 있어야한다는 것이 었습니다. 따라서 호스트와 VM간에 소스 코드를 공유하는 동기화 된 폴더를 도입했습니다. 이것은 기본적으로 잘 작동합니다 ... 심볼릭 링크를 제외하고.

소스 코드 내부에는 실제로 몇 개의 심볼릭 링크가 있는데, 이는 VM 내부의 Linux에서는 문제가되지 않지만 호스트로서 Windows에서는 문제가 발생합니다. 우리가 할 수 없는 유일한 것은 심볼릭 링크를 제거하는 것이므로이를 처리 할 다른 방법이 필요합니다.

지금까지 여러 가지 옵션을 시도했습니다.

  • Vagrant 문제 에 언급 된 해결 방법이 있습니다 . 불행히도 이것은 VirtualBox 전용이며 VMware를 실행하는 사용자에게 도움이되지 않습니다. 지금까지 사용 된 공급자에 따라 Vagrantfile 에서 코드를 실행하는 방법을 찾지 못했습니다 .
  • 표준 공유 폴더를 사용하는 대신 rsync 유형을 사용해 보았습니다 . 이것은 Windows에서 작동하지만 OS X에서 충돌하며 symlink has no referent(심볼릭 링크 당 하나 의 오류)를 알려주는 많은 오류가 발생합니다.
  • NFS 에 대해 생각 했지만 Windows를 호스트로 사용하지 않는 경우에만 작동합니다.
  • 우리는 또한 SMB 에 대해서도 알고 있지만 이것은 Windows에서만 호스트로 작동합니다.

공유 폴더 내에서 다중 플랫폼 호스트 및 심볼릭 링크에 문제가있는 지구상에서 우리가 유일하거나 처음이라고 상상할 수 없습니다.

심볼릭 링크를 유지하면서 다른 호스트 운영 체제를 계속 사용할 수 있도록이 문제를 어떻게 해결할 수 있습니까?



@SteveBennett, 그 문제 (현재 수락 된 답변 참조)는 OP가 질문을 게시하기 15 개월 전에 릴리스 된 Vagrant 1.1에서 해결되었습니다. 그리고 어쨌든 rsync 폴더가 아닌 VirtualBox 공유 폴더에 관한 것입니다. 아래 내 대답을 참조하십시오 (수락 된 대답이 잘못되었습니다).
jdunk

답변:


64

Virtualbox는 보안상의 이유로 공유 폴더에서 심볼릭 링크를 허용하지 않습니다. 심볼릭 링크를 활성화하려면 Vagrantfile의 vm provider config 블록에 다음 줄을 추가해야합니다.

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

또한 Windows에서 vagrant up은 관리자 권한이있는 셸에서 실행되어야합니다. 필요한 해결 방법이 없습니다.


9
나는 OP와이 질문을 보는 많은 사람들이 "공유"와 "동기화"라는 용어를 같은 의미로 사용하고 있다고 생각합니다. OP의 두 번째 글 머리 기호는 그가 공유 폴더를 사용하고 있었지만 작동하지 않았기 때문에 rsynced 폴더로 전환을 시도했습니다. IIRC, 여기에 제공된 솔루션은 어쨌든 내가 가지고 있던 문제를 해결했습니다.
Steve Bennett

2
@SteveBennett, 다시 동의 : 잠재적 인 혼란. 명확히해야 할 더 많은 이유. 상당히 오래된 버전의 방랑자를 사용하지 않는 한이 제안이 [오래부터 해결 된] 오래된 문제를 언급 할 때 문제를 해결했을 것이라고 상상하기 어렵습니다. IMO라고하더라도 공유 디렉토리에 대한 VBox의 비정상적인 파일 시스템 성능을 고려하면 거의 도움이되지 않았을 것입니다 (예 : "git status"에 몇 초가 소요됨). 아주 적은 수의 파일로 작은 프로젝트 만 공유 할 수 있습니다. mitchellh.com/...
jdunk

5
vagrant up관리자 권한으로 셸에서 실행 하기 만하면됩니다. @jdunk가 지적 했듯이이 구성 옵션은 이 답변이 게시되기 거의 1 년 전에 발생한 이 커밋 에서 Vagrant에서 기본적으로 이미 설정되어 있습니다. 즉, vagrant up관리자 권한으로 셸에서 실행 하면 문제가 해결되었습니다.
Ajedi32

2
질문에 응답하지 않습니다. 동기화 된 폴더에서 작동하지 않습니다.
Manel 2016

이 대답은 두 가지 주요 이유로 잘못되었습니다. 1. rsync 된 디렉토리가 아닌 VBox 공유 폴더를 의미합니다. 완전히 다른 두 가지입니다. 2.이 설정은 OP의 질문이 나오기 15 개월 전에 출시 된 Vagrant 1.1에서 이미 기본값이었습니다. 자세한 내용은 아래 내 대답을 참조하십시오.
jdunk 2017 년

94

받아 들여진 대답은 좋지 않습니다. 질문은 공유 폴더가 아니라 동기화 된 폴더 의 문제를 설명합니다 . 제안 된 솔루션은 rsynced ( 공유되지 않음 ) 폴더 에 영향을 미치지 않습니다 . 그리고 OP가 공유 폴더를 사용하고 있더라도 수락 된 답변의 제안은 OP가 질문을 게시하기 15 개월 전에 공개 된 1.1에서 이미 vagrant에 통합 된 것입니다 ( VirtualBox의 공유 폴더가 너무 느립니다 ).


이 같은 문제가 발생했습니다. OS X에서 symlink has no referentrsync 오류가 발생했습니다. 나는 개인적으로 특정 rsync 인수를 내에 추가하여 해결할 수있었습니다 vagrantfile.

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

나는 또한 vagrant의 github 에서이 문제열어서 기본값에 잘못된 것으로 보이는 것을 지적했습니다 rsync__args(특히 기본 인수 중 하나가 --copy-links다른 인수 를 깨는 것 같습니다 --archive. 적어도 깨진 심볼릭 링크 복사에 관한 한) ).


좋은 전화-감사합니다 @jdunk. 예, Vagrant 문서에 따르면이 --copy-links옵션은 기본적으로 설정되어 있습니다. 이것은 내 문제였습니다. 그것을 제거함으로써 (위의 답변을 사용하여)-그것을 처리합니다.
Phil Birnie 2015

1
매우 유용합니다. 감사합니다. Windows 대안을 원하지만.
Aleksandr Makov 2015 년

4
Vagrant 문서에 따르면 공유 폴더는 VirtualBox 사용자의 기본 동기화 폴더 유형입니다. "VirtualBox 공급자를 사용하는 경우 VirtualBox 공유 폴더가 기본 동기화 폴더 유형입니다." ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) OP의 질문은 VirtualBox 공유 폴더가 문제라는 것을 암시하는 것처럼 보이 므로 수락 된 답변은 문제의 적어도 일부를 해결하려고 시도합니다 (실제로는 나를 위해 문제를 해결하십시오).
Ajedi32 2015-08-25

제 엉덩이를 구 해주셔서 정말 감사합니다. 저는 인터넷의 모든 곳을 살펴 봤고 마침내이 문제를 이해하는 사람이되었습니다!
Dovizu 2015 년

1
감사합니다. 이것이 내 문제를 해결 한 것입니다 (제목에있는 문제와 해결책을 찾기 위해 여기에 도착했으며 혼란스럽게도 요청되지 않은 문제).
johncip 2016 년

7

실행중인 오류를 해결하기 위해이 모든 옵션을 시도했습니다 npm install.

관리자 프롬프트에서 vagrant를 실행하고 vm ( vagrant reload)을 로드하기 만하면 문제가 해결되었습니다.

돌아가서 SharedFoldersEnableSymlinksCreateVagrantfile 에서 구성을 제거했지만 모든 것이 여전히 정상이었습니다.


npm update내 방랑 공유 폴더에서 작동하지 않았습니다. 이 솔루션은 어떤 이유로 문제를 해결했습니다.
Emre

1
더 많은 연구 끝에 심볼릭 링크를 만들려면 기본적으로 창에서 관리자 권한이 필요합니다. 권한을 수정하려면 여기에서 답변을 참조하십시오. superuser.com/a/125981
gameweld

Windows 10 시스템에서 관리자로 Vagrant 및 명령 promt를 실행하면 npx create-react-app 'project_name'에서 저에게 효과적이었습니다.
sybozz

2

기본 동기화 폴더 유형입니다 vboxsf파일 / 디렉토리의 많은 수의 성능 문제를 알고, 그리고 심볼릭 링크와 하드 링크 (표 참조에 대한 지원이 부족했다 (818) - 7+ 세 버그). 그것을 사용하지 마십시오.

rsync 유형 동기화 폴더가 최선의 선택 일 수 있습니다.

충돌했다고 언급했는데 어떤 버전의 rsync를 실행 중입니까? brew를 통해 3.1.0으로 업데이트하려고하면 OOTB가 너무 오래되어 (2.x) 문제가 발생할 수 있다는 것을 알고 있습니다.


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

1
이 답변을 읽었을 때 기뻤습니다. 문제가 해결 될 것이라고 생각했지만 sudo mount -t rsync shared /var/www오류가 발생 하면 위와 동일하게 나타납니다mount: unknown filesystem type 'rsync'
samayo dec

rsync파일 시스템 유형이 아니므로 마운트 할 수 없습니다.
테리 왕

@samyo 참조 vagrantup.com/docs/synced-folders/rsync.html 당신이에 구성해야 Vagrantfile하고 수동으로 실행 vagrant rsync또는 vagrant rsync-auto. 그렇지 않으면 업 및 새로 고침시에만 동기화됩니다.
Terry Wang

1

한 시간 동안 소란을 피우고 몇 가지 다른 솔루션 ( vagrant-vbguest, Marvin이 제안한 수정 사항)을 시도한 후 VirtualBox 4.8.10, Vagrant 1.5.1에서 작동하도록 공유 폴더에 심볼릭 링크를 가져올 수 없었습니다.

더 간단한 해결책은 별도의 공유 폴더를 구성한 다음 Ruby를 사용 File.readlink하여 기본 경로를 읽는 것입니다.

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

1
이해가 안 돼요. 예를 들어 설명해 주시겠습니까? 감사합니다
Cassiano

0

Vagrantfile에 다음 행을 추가하십시오.

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

이것은 virtualbox 6.0.8을 6.0.4로, vagrant 2.2.4를 2.2.1로 다운 그레이드 한 후에 저에게 효과적이었습니다.

"관리자 권한으로 실행"으로 터미널을 열 때 (Windows 10에서 git bash 사용).

또한 git bash changing : in project file : $ vim .git / config change to 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.