Tautan simbolis dan folder yang disinkronkan di Vagrant

99

Saya ingin menggunakan Vagrant untuk menyediakan lingkungan pengembangan umum bagi tim saya. Tuan rumah benar-benar berbeda:

  • Beberapa menggunakan OS X, beberapa Linux, dan beberapa Windows.
  • Beberapa menggunakan VMware, beberapa menggunakan VirtualBox.

Di dalam VM kami ingin menjalankan Linux.

Sejauh ini semuanya baik-baik saja.

Sekarang ide kami adalah bahwa setiap pengembang akan dapat menggunakan IDE pilihan mereka, dan karenanya kami telah memperkenalkan folder tersinkronisasi yang membagikan kode sumber antara host dan VM. Ini pada dasarnya, bekerja dengan baik… kecuali untuk tautan simbolik.

Di dalam kode sumber kami, kami sebenarnya memiliki beberapa tautan simbolis, yang tidak menjadi masalah di dalam Linux di dalam VM, tetapi pada Windows sebagai host, hal ini menyebabkan masalah. Satu-satunya hal yang tidak dapat kita lakukan adalah menghilangkan tautan simbolis, jadi kita memerlukan cara lain untuk mengatasinya.

Sejauh ini, kami telah mencoba sejumlah opsi:

  • Ada solusi yang disebutkan dalam masalah Vagrant, sayangnya ini hanya untuk VirtualBox dan tidak membantu mereka yang menjalankan VMware. Sejauh ini, kami belum menemukan cara menjalankan kode di Vagrantfile bergantung pada penyedia yang digunakan.
  • Alih-alih menggunakan folder bersama standar, kami sekarang mencoba menggunakan tipe rsync . Ini berfungsi pada Windows, tetapi crash pada OS X dengan sejumlah kesalahan yang memberi tahu kita bahwa symlink has no referent(satu kesalahan per tautan simbolik).
  • Kami memikirkan tentang NFS , tetapi itu hanya berfungsi jika Anda tidak menggunakan Windows sebagai host.
  • Kami juga memikirkan tentang SMB , tetapi ini lagi-lagi hanya berfungsi di Windows sebagai host.

Saya tidak dapat membayangkan bahwa kita adalah satu-satunya atau orang pertama di planet ini yang mengalami masalah dengan host multi-platform dan tautan simbolis dalam folder bersama.

Bagaimana Anda dapat mengatasi masalah ini, sehingga kami dapat menyimpan tautan simbolik, tetapi masih menggunakan sistem operasi host yang berbeda?

Golo Roden
sumber
@SteveBennett, masalah itu (yang referensi jawaban yang diterima saat ini) diselesaikan di Vagrant 1.1, yang dirilis 15 bulan sebelum OP memposting pertanyaan. Dan ini tentang folder bersama VirtualBox, bukan folder rsync. Lihat jawaban saya di bawah (jawaban yang diterima salah).
sampah

Jawaban:

64

Virtualbox tidak mengizinkan symlink pada folder bersama untuk alasan keamanan. Untuk mengaktifkan symlink, baris berikut perlu ditambahkan ke blok konfigurasi penyedia vm di Vagrantfile:

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

Selain itu, di windows vagrant up perlu dijalankan di shell dengan hak admin. Tidak ada solusi yang diperlukan.

Marvin
sumber
9
Saya menduga OP dan banyak orang yang melihat pertanyaan ini menggunakan istilah "bersama" dan "disinkronkan" secara bergantian. Perhatikan poin poin kedua OP yang sangat menyiratkan bahwa dia menggunakan folder bersama, tetapi mencoba beralih ke folder rsynced karena tidak berfungsi. IIRC, solusi yang disediakan di sini memecahkan masalah yang saya alami, bagaimanapun juga.
Steve Bennett
2
@SteveBennett, menyetujui: potensi kebingungan. Semua lebih banyak alasan untuk mengklarifikasi. Sulit membayangkan saran ini akan menyelesaikan masalah Anda jika merujuk pada masalah lama [yang sudah lama terselesaikan], kecuali Anda menggunakan versi gelandangan yang sangat lama. Dan bahkan jika ya, IMO akan sangat sedikit membantu mengingat kinerja sistem file VBox yang buruk untuk direktori bersama (misalnya "status git" membutuhkan beberapa detik), meskipun mungkin Anda hanya berbagi proyek kecil dengan sangat sedikit file. mitchellh.com/…
jdunk
5
Menjalankan vagrant upshell dengan hak admin adalah semua yang diperlukan. Seperti yang ditunjukkan @jdunk, opsi konfigurasi ini sudah disetel secara default di Vagrant, sejak pengubahan ini terjadi hampir setahun sebelum jawaban ini diposting. Karena itu, menjalankan vagrant upshell dengan hak admin memang menyelesaikan masalah saya.
Ajedi32
2
Tidak menanggapi pertanyaan itu. Ini tidak berfungsi pada folder yang disinkronkan.
Manel
Jawaban ini salah karena 2 alasan utama. 1. Ini mengacu pada folder bersama VBox, bukan direktori rsynced - dua hal yang sama sekali berbeda. 2. Setting ini sudah menjadi default di Vagrant 1.1, dirilis 15 bulan sebelum pertanyaan OP. Lihat jawaban saya di bawah untuk info lebih lanjut.
sampah
94

Jawaban yang diterima tidak bagus. Pertanyaannya menjelaskan masalah dengan folder yang disinkronkan , bukan folder bersama . Solusi yang diusulkan tidak akan berpengaruh pada folder rsynced ( tidak dibagi ). Dan bahkan jika OP menggunakan folder bersama , saran jawaban yang diterima adalah sesuatu yang telah diintegrasikan ke gelandangan sejak 1.1, dirilis 15 bulan sebelum OP memposting pertanyaan (belum lagi folder bersama VirtualBox sangat lambat ).


Saya mengalami masalah yang sama: di OS X, saya mendapat symlink has no referenterror rsync. Saya secara pribadi dapat menyelesaikannya dengan menambahkan argumen rsync tertentu ke filevagrantfile :

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

Saya juga membuka masalah ini di github gelandangan untuk menunjukkan sesuatu yang tampaknya salah dengan nilai defaultnya rsync__args(khususnya, salah satu argumen default --copy-links,, tampaknya melanggar yang lain,, --archivesetidaknya sejauh menyalin symlink yang rusak terkait ).

sampah
sumber
Panggilan yang bagus - terima kasih @jdunk. Ya, menurut dokumen Vagrant, --copy-linksopsi ini ditetapkan secara default. Ini adalah masalahku. Dengan menghapusnya (menggunakan jawaban Anda di atas) - itu sudah beres.
Phil Birnie
1
Sangat berguna, terima kasih. Meskipun saya ingin alternatif Windows.
Aleksandr Makov
4
Perhatikan bahwa menurut dokumen Vagrant, folder Bersama adalah tipe default folder yang disinkronkan untuk pengguna VirtualBox: "Jika Anda menggunakan penyedia VirtualBox, folder bersama VirtualBox adalah jenis folder tersinkronisasi default." ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) Pertanyaan OP juga tampaknya menyiratkan bahwa folder bersama VirtualBox menjadi perhatian, jadi jawaban yang diterima berusaha untuk mengatasi setidaknya sebagian dari masalah (dan memang perbaiki masalah untuk saya).
Ajedi32
Terima kasih banyak telah menyelamatkan pantat saya, saya telah mencari di mana-mana di internet dan akhirnya seseorang yang mengerti masalah ini!
Dovizu
1
Terima kasih. Inilah yang memecahkan masalah saya (yang ada di judul, dan yang saya tiba di sini untuk mencari solusinya, dan yang membingungkan bukanlah yang ditanya).
johncip
7

Saya mencoba semua opsi ini untuk mengatasi kesalahan yang sedang berjalan npm install.

Cukup menjalankan vagrant di prompt admin dan memuat vm ( vagrant reload), menyelesaikan masalah.

Saya kembali dan menghapus SharedFoldersEnableSymlinksCreatekonfigurasi dari Vagrantfile, dan semuanya masih baik-baik saja.

gameweld
sumber
npm updatetidak bekerja di folder bersama gelandangan saya. Solusi ini memperbaikinya karena beberapa alasan.
Emre
1
Setelah penelitian lebih lanjut, ternyata membuat tautan simbolik membutuhkan izin admin di windows secara default. Untuk mengubah izin, lihat jawabannya di sini: superuser.com/a/125981
gameweld
Menjalankan Vagrant dan command prompt sebagai Administrator di mesin Window 10 bekerja untuk saya di npx create-react-app 'project_name'.
sybozz
2

Jenis folder tersinkronisasi default vboxsfmemiliki masalah kinerja yang diketahui dengan sejumlah besar file / direktori, dan tidak memiliki dukungan untuk tautan simbolis dan tautan keras (lihat tiket 818 - bug berusia 7+ tahun). Hindari menggunakannya.

folder tersinkron tipe rsync mungkin pilihan terbaik Anda.

Anda menyebutkan bahwa itu macet, versi rsync apa yang Anda jalankan? Coba perbarui ke 3.1.0 melalui brew, saya tahu OOTB terlalu tua (2.x), yang dapat menyebabkan masalah.

Terry Wang
sumber
[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'
Musa Haidari
1
Saya senang ketika saya membaca jawaban ini, berpikir itu akan menyelesaikan masalah saya tetapi saya mendapatkan yang sama seperti di atas ketika saya melakukan sudo mount -t rsync shared /var/wwwkesalahanmount: unknown filesystem type 'rsync'
samayo
rsyncbukanlah jenis sistem file sehingga Anda tidak dapat memasangnya.
Terry Wang
@samyo merujuk ke vagrantup.com/docs/synced-folders/rsync.html yang perlu Anda konfigurasikan di Vagrantfiledan secara manual menjalankan vagrant rsyncatau vagrant rsync-auto. Jika tidak, itu hanya akan disinkronkan saat dimuat dan dimuat ulang.
Terry Wang
1

Setelah repot selama satu jam dan mencoba beberapa solusi berbeda (vagrant-vbguest , perbaikan yang disarankan Marvin), saya tidak bisa mendapatkan symlink di folder bersama untuk bekerja dengan VirtualBox 4.8.10, Vagrant 1.5.1.

Saya menemukan bahwa solusi yang lebih sederhana adalah mengonfigurasi folder bersama yang terpisah dan kemudian menggunakan Ruby File.readlinkuntuk membaca di jalur yang mendasarinya:

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"
James O'Beirne
sumber
1
Saya tidak mengerti. Bisakah Anda menjelaskan dengan sebuah contoh? Terima kasih
Cassiano
0

Tambahkan baris berikut ke Vagrantfile:

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

Ini bekerja untuk saya HANYA setelah saya menurunkan virtualbox 6.0.8 menjadi 6.0.4 dan gelandangan 2.2.4 ke 2.2.1.

ketika Anda membuka terminal (saya menggunakan git bash di windows 10) dengan "Run as Admin".

coba juga di git bash mengubah: dalam file proyek: $ vim .git / config ubah menjadi 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
sumber