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ます(シンボリックリンクごとに1つのエラー)。
  • NFSについて考えましたが、これはWindowsをホストとして使用しない場合にのみ機能します。
  • SMBについても考えましたが、これもホストとしてのWindowsでのみ機能します。

共有フォルダー内でマルチプラットフォームホストとシンボリックリンクの問題が発生するのは、私たちがこの惑星で唯一または最初の人だとは思えません。

この問題をどのように解決すれば、シンボリックリンクを維持しながら、別のホストオペレーティングシステムを使用できますか?



@SteveBennett、その問題(現在受け入れられている回答参照)は、OPが質問を投稿する15か月前にリリースされたVagrant 1.1で解決されました。とにかく、それはVirtualBox共有フォルダーに関するものであり、rsyncされたフォルダーではありません。以下の私の答えを参照してください(受け入れられた答えは間違っています)。
jdunk 2015年

回答:


64

Virtualboxでは、セキュリティ上の理由から、共有フォルダーへのシンボリックリンクは許可されていません。シンボリックリンクを有効にするには、次の行をVagrantfileのvmプロバイダー構成ブロックに追加する必要があります。

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

さらに、Windowsでは、管理者権限を持つシェルでvagrant upを実行する必要があります。回避策は必要ありません。


9
私はOPを疑っていて、この質問を見ている多くの人々が「共有」と「同期」という用語を同じ意味で使用していたと思います。OPの2番目の箇条書きに注目してください。これは、共有フォルダーを使用していることを強く示唆していますが、rsyncedフォルダーが機能しなかったため、rsyncedフォルダーに切り替えようとしました。IIRC、ここで提供されるソリューションは、いずれにしても私が抱えていた問題を解決しました。
スティーブベネット

2
@SteveBennett、合意済み:混乱の可能性。明確にする理由はなおさらです。かなり古いバージョンのVagrantを使用していなかった場合を除き、この提案がそのような古い[解決されて以来の]問題に言及している場合、この提案が問題を解決するとは想像に難いです。そして、たとえそうであったとしても、IMOは、共有ディレクトリに対するVBoxのひどいファイルシステムのパフォーマンス(たとえば、「git status」に数秒かかる)を考慮するとほとんど役に立ちませんでしたが、非常に少数のファイルで小さなプロジェクトのみを共有していた可能性があります。 mitchellh.com/...
jdunk

5
vagrant up必要なのは、管理者権限を持つシェルで実行することだけです。@jdunkが指摘したように、この回答は投稿されたほぼ1年前に発生したこのコミットの時点で、この構成オプションはデフォルトでVagrantにすでに設定されています。とvagrant upはいえ、管理者権限を持つシェルで実行しても問題は解決しました。
Ajedi32 2015

2
質問には回答しません。同期されたフォルダでは機能しません。
Manel

この答えは2つの主な理由で間違っています。1.これは、rsyncされたディレクトリではなく、VBox共有フォルダーを指します-2つのまったく異なるもの。2.この設定は、いずれにしても、Vagrant 1.1ではデフォルトであり、OPの質問の15か月前にリリースされました。詳細については、以下の私の回答を参照してください。
jdunk 2017年

94

受け入れられた答えは良くありません。質問は、共有フォルダーではなく同期フォルダーの問題について説明しています。提案されたソリューションは、rsynced(共有されていない)フォルダーに影響しません。そして、OPが共有フォルダーを使用していたとしても、受け入れられた回答の提案は、OPが質問を投稿する15か月前にリリースされた、1.1の時点ですでにvagrantに統合されているものです(言うまでもなく、VirtualBoxの共有フォルダーは非常に遅いです)。


これと同じ問題がsymlink has no referent発生しました。OSX では、rsyncエラーが発生しました。私は自分に特定のrsync引数を追加することで個人的に解決できましたvagrantfile

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

また、この問題をvagrantのgithubで開いて、デフォルト値が間違っているように見える何かを指摘しましたrsync__args(具体的には、デフォルトの引数の1つが、少なくとも、壊れたシンボリックリンクのコピーに関する限り、--copy-links別のものを壊しているようです)--archive)。


良い電話-@jdunkに感謝します。はい、Vagrant docsによると、この--copy-linksオプションはデフォルトで設定されています。これが私の問題でした。(上記の回答を使用して)それを削除することにより、それが処理されます。
Phil Birnie、2015

1
とても便利です。私はWindowsの代替を望みますが。
Aleksandr Makov

4
Vagrantのドキュメントによると、共有フォルダーはVirtualBoxユーザーのデフォルトの同期フォルダータイプです。「VirtualBoxプロバイダーを使用している場合、VirtualBox共有フォルダーはデフォルトの同期フォルダータイプです。」(docs.vagrantup.com/v2/synced-folders/virtualbox.html)OPの質問は、VirtualBox共有フォルダーが問題であることも示唆しているようです。そのため、受け入れられた回答は問題の少なくとも一部に対処しようとします(そして実際に私のために問題を修正してください)。
Ajedi32 2015

私のお尻を保存してくれてありがとう、私はインターネットのいたるところを見てきました、そして最後にこの問題を理解している人です!
Dovizu

1
ありがとうございました。これが私の問題を解決したものです(タイトルの1つと、解決策を探してここに到着したもので、混乱しているのは、求められているものではありません)。
johncip 2016年

6

実行中のエラーを解決するために、これらすべてのオプションを試しましたnpm install

管理プロンプトでvagrantを実行し、vm(vagrant reload)をロードするだけで問題が解決しました。

私は戻っSharedFoldersEnableSymlinksCreateてVagrantfileから設定を削除しましたが、すべて問題ありませんでした。


npm update私のvagrant共有フォルダで機能していませんでした。このソリューションは、何らかの理由でそれを修正しました。
Emre、2017

1
さらに調査した結果、シンボリックリンクを作成するには、デフォルトでWindowsの管理者権限が必要であることが判明しました。権限を変更するには、こちらの回答を参照してください: superuser.com/a/125981
gameweld

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

rsyncはファイルシステムタイプではないため、マウントできません。
Terry Wang

@samyoを参照してくださいvagrantup.com/docs/synced-folders/rsync.htmlあなたが設定する必要がありVagrantfile、手動で実行しますvagrant rsyncvagrant rsync-auto。それ以外の場合は、起動時と再読み込み時にのみ同期されます。
Terry Wang

1

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変更も試してください:プロジェクトファイル:$ 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.