web-dev-qa-db-ja.com

Vagrantのシンボリックリンクと同期フォルダー

Vagrantを使用して、チームに共通の開発環境を提供します。ホストはまったく異なります。

  • OS X、Linux、Windowsを使用するものもあります。
  • VMwareを使用する人もいれば、VirtualBoxを使用する人もいます。

VMの内部では、Linuxを実行します。

これまでのところ、すべてが順調です。

今、私たちのアイデアは、各開発者が選択したIDEを使用できるようにするというものでした。したがって、ホストとVMの間でソースコードを共有する同期フォルダーを導入しました。これは基本的に同様に機能します…シンボリックリンクを除いて。

ソースコードの内部には、実際にはいくつかのシンボリックリンクがあります。これはVM内のLinux内では問題ではありませんが、ホストとしてのWindowsでは問題が発生します。 notできることは、シンボリックリンクを削除することだけです。したがって、これに対処する別の方法が必要です。

これまで、いくつかのオプションを試しました。

  • Vagrantの issue に記載されている回避策がありますが、残念ながらこれはVirtualBoxのみであり、VMwareを実行している人には役立ちません。これまでのところ、使用するプロバイダーによっては、Vagrantfileでコードを実行する方法が見つかりませんでした。
  • 標準の共有フォルダーを使用する代わりに、 rsync タイプを使用してみました。これはWindowsで動作しますが、OS Xでsymlink has no referent(シンボリックリンクごとに1つのエラー)を示すいくつかのエラーでクラッシュします。
  • NFS について考えましたが、これはWindowsをホストとして使用しない場合にのみ機能します。
  • SMB についても説明しましたが、これもWindowsでホストとしてのみ機能します。

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

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

92
Golo Roden

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

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

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

57
Marvin

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


これと同じ問題が発生しました。OSXでは、symlink has no referent 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を壊しているようです)。

91
jdunk

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

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

私は戻って、VagrantfileからSharedFoldersEnableSymlinksCreate構成を削除しましたが、それでも問題ありませんでした。

5
gameweld

デフォルトの同期フォルダタイプはvboxsfです。多数のファイル/ディレクトリで既知のパフォーマンスの問題があり、シンボリックリンクとハードリンクのサポートがありません(チケット 818 -7年以上前のバグを参照) )。使用しないでください。

rsyncタイプの同期フォルダーが最適な選択です。

あなたはそれがクラッシュしたと言いましたが、どのバージョンのrsyncを実行していますか? brewを使用して3.1.0に更新してみてください。OOTBが古すぎる(2.x)ため、問題が発生する可能性があります。

2
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
James O'Beirne

Vagrantfileに次の行を追加します。

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

これは私のために働いたONLY 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
0
Batchen Regev