Các liên kết tượng trưng và các thư mục được đồng bộ hóa trong Vagrant


99

Tôi muốn sử dụng Vagrant để cung cấp môi trường phát triển chung cho nhóm của mình. Các máy chủ hoàn toàn khác nhau:

  • Một số sử dụng OS X, một số Linux và một số Windows.
  • Một số sử dụng VMware, một số sử dụng VirtualBox.

Bên trong máy ảo, chúng tôi muốn chạy Linux.

Cho đến nay, mọi thứ vẫn ổn.

Bây giờ ý tưởng của chúng tôi là mỗi nhà phát triển sẽ có thể sử dụng IDE mà họ lựa chọn, và do đó chúng tôi đã giới thiệu một thư mục được đồng bộ hóa chia sẻ mã nguồn giữa máy chủ và máy ảo. Về cơ bản, điều này cũng hoạt động… ngoại trừ các liên kết tượng trưng.

Bên trong mã nguồn của chúng tôi, chúng tôi thực sự có một vài liên kết tượng trưng, ​​đây không phải là vấn đề trong Linux bên trong máy ảo, nhưng trên Windows với tư cách là máy chủ, điều này gây ra sự cố. Điều duy nhất mà chúng tôi không thể làm là loại bỏ các liên kết tượng trưng, ​​vì vậy chúng tôi cần một cách khác để giải quyết vấn đề này.

Cho đến nay, chúng tôi đã thử một số tùy chọn:

  • Có một cách giải quyết được đề cập trong một vấn đề của Vagrant, rất tiếc, đây chỉ là VirtualBox và không giúp ích cho những người chạy VMware. Cho đến nay, chúng tôi vẫn chưa tìm ra cách chạy mã trong Vagrantfile tùy thuộc vào nhà cung cấp được sử dụng.
  • Thay vì sử dụng thư mục chia sẻ tiêu chuẩn, giờ đây chúng tôi đã thử sử dụng kiểu rsync . Điều này hoạt động trên Windows, nhưng bị treo trên OS X với một số lỗi cho chúng tôi biết rằng symlink has no referent(một lỗi trên mỗi liên kết tượng trưng).
  • Chúng tôi đã nghĩ đến NFS , nhưng điều đó chỉ hoạt động nếu bạn không sử dụng Windows làm máy chủ.
  • Chúng tôi cũng mặc dù về SMB , nhưng điều này một lần nữa chỉ hoạt động trên Windows với tư cách là máy chủ.

Tôi không thể tưởng tượng rằng chúng tôi là người duy nhất hoặc những người đầu tiên trên hành tinh này gặp sự cố với máy chủ đa nền tảng và liên kết tượng trưng trong thư mục chia sẻ.

Bạn có thể giải quyết vấn đề này bằng cách nào để chúng ta có thể giữ các liên kết tượng trưng, ​​nhưng vẫn sử dụng các hệ điều hành máy chủ lưu trữ khác nhau?



@SteveBennett, vấn đề đó (mà các tham chiếu câu trả lời được chấp nhận hiện tại) đã được giải quyết trong Vagrant 1.1, được phát hành 15 tháng trước khi OP đăng câu hỏi. Và đó là về các thư mục chia sẻ VirtualBox, không phải thư mục rsync'd. Xem câu trả lời của tôi bên dưới (câu trả lời được chấp nhận là sai).
jdunk

Câu trả lời:


64

Virtualbox không cho phép liên kết tượng trưng trên các thư mục chia sẻ vì lý do bảo mật. Để bật liên kết tượng trưng, ​​dòng sau cần được thêm vào khối cấu hình nhà cung cấp vm trong Vagrantfile:

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

Ngoài ra, trên windows vagrant up cần được thực thi trong một trình bao có quyền quản trị. Không cần giải pháp thay thế.


9
Tôi nghi ngờ OP và nhiều người xem câu hỏi này đã sử dụng thuật ngữ "chia sẻ" và "đồng bộ hóa" thay thế cho nhau. Lưu ý gạch đầu dòng thứ hai của OP ám chỉ mạnh mẽ rằng anh ta đang sử dụng các thư mục chia sẻ, nhưng đã thử chuyển sang thư mục rsynced vì chúng không hoạt động. IIRC, giải pháp được cung cấp ở đây đã giải quyết được vấn đề tôi đang gặp phải, trong mọi trường hợp.
Steve Bennett

2
@SteveBennett, đã đồng ý lại: tiềm ẩn sự nhầm lẫn. Tất cả các lý do hơn để làm rõ. Thật khó để tưởng tượng gợi ý này sẽ giải quyết được vấn đề của bạn khi nó đề cập đến một vấn đề cũ [đã được giải quyết từ lâu] như vậy, trừ khi bạn đang sử dụng phiên bản vagrant cũ đáng kể. Và ngay cả khi điều đó xảy ra, IMO sẽ giúp ích rất ít khi xem xét hiệu suất hệ thống tệp siêu phàm của VBox cho các dirs được chia sẻ (ví dụ: "trạng thái git" mất vài giây), mặc dù có thể bạn chỉ đang chia sẻ một dự án nhỏ với rất ít tệp. mitchellh.com/…
jdunk

5
Chạy vagrant uptrong một trình bao với quyền quản trị là tất cả những gì được yêu cầu. Như @jdunk đã chỉ ra, tùy chọn cấu hình này đã được đặt theo mặc định trong Vagrant, kể từ lần cam kết này xảy ra gần một năm trước khi câu trả lời này được đăng. Điều đó nói rằng, chạy vagrant uptrong một trình bao với quyền quản trị đã giải quyết được vấn đề của tôi.
Ajedi32

2
Không trả lời câu hỏi. Nó không hoạt động trên các thư mục được đồng bộ hóa.
Manel

Câu trả lời này sai vì 2 lý do chính. 1. Nó đề cập đến các thư mục chia sẻ VBox, không phải thư mục rsynced - hai thứ hoàn toàn khác nhau. 2. Dù sao cài đặt này đã là mặc định trong Vagrant 1.1, được phát hành 15 tháng trước câu hỏi của OP. Xem câu trả lời của tôi bên dưới để biết thêm thông tin.
jdunk

94

Câu trả lời được chấp nhận là không tốt. Câu hỏi mô tả sự cố với các thư mục được đồng bộ hóa , không phải các thư mục được chia sẻ . Giải pháp được đề xuất sẽ không ảnh hưởng đến thư mục rsynced ( không được chia sẻ ). Và ngay cả khi OP đang sử dụng thư mục chia sẻ , gợi ý của câu trả lời được chấp nhận là thứ đã được tích hợp vào vagrant kể từ 1.1, được phát hành 15 tháng trước khi OP đăng câu hỏi (chưa kể các thư mục chia sẻ của VirtualBox rất chậm ).


Tôi gặp phải vấn đề tương tự: trên OS X, tôi gặp symlink has no referentlỗi rsync. Cá nhân tôi đã có thể giải quyết nó bằng cách thêm các args rsync cụ thể vào vagrantfile:

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

Tôi cũng đã mở vấn đề này trên github của vagrant để chỉ ra điều gì đó dường như không đúng với giá trị mặc định của chúng rsync__args(cụ thể là một trong các args mặc định --copy-links, dường như đang phá vỡ một args khác, --archiveít nhất là về việc sao chép các liên kết tượng trưng bị hỏng. ).


Cuộc gọi tốt - cảm ơn @jdunk. Có, theo tài liệu Vagrant, --copy-linkstùy chọn được đặt theo mặc định. Đây là vấn đề của tôi. Bằng cách loại bỏ điều đó (sử dụng câu trả lời của bạn ở trên) - điều đó sẽ giải quyết.
Phil Birnie

1
Rất hữu ích, cảm ơn. Mặc dù tôi muốn thay thế Windows.
Aleksandr Makov

4
Lưu ý rằng theo tài liệu Vagrant, Thư mục được chia sẻ là loại thư mục được đồng bộ hóa mặc định cho người dùng VirtualBox: "Nếu bạn đang sử dụng nhà cung cấp VirtualBox, thì các thư mục chia sẻ VirtualBox là loại thư mục được đồng bộ hóa mặc định." ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) Câu hỏi của OP dường như ngụ ý rằng các thư mục chia sẻ VirtualBox là một mối quan tâm, vì vậy câu trả lời được chấp nhận cố gắng giải quyết ít nhất một phần của vấn đề (và thực sự đã khắc phục sự cố cho tôi).
Ajedi32

Cảm ơn bạn rất nhiều vì đã cứu cái mông của tôi, tôi đã tìm khắp mọi nơi trên internet và cuối cùng cũng có người hiểu vấn đề này!
Dovizu

1
Cảm ơn bạn. Đây là những gì đã giải quyết vấn đề của tôi (vấn đề trong tiêu đề và vấn đề mà tôi đến đây để tìm kiếm giải pháp, và điều gây nhầm lẫn không phải là vấn đề đang được hỏi).
johncip

6

Tôi đã thử tất cả các tùy chọn này để giải quyết lỗi đang chạy npm install.

Chỉ cần chạy vagrant trong lời nhắc quản trị và tải vm ( vagrant reload), đã giải quyết được sự cố.

Tôi đã quay lại và xóa SharedFoldersEnableSymlinksCreatecấu hình khỏi Vagrantfile, và mọi thứ vẫn ổn.


npm updatekhông hoạt động trong thư mục chia sẻ lang thang của tôi. Giải pháp này đã sửa nó vì một số lý do.
Emre

1
Sau khi nghiên cứu thêm, hóa ra việc tạo một liên kết tượng trưng yêu cầu quyền quản trị viên trong windows theo mặc định. Để sửa đổi quyền, xem câu trả lời ở đây: superuser.com/a/125981
gameweld

2

Loại thư mục được đồng bộ hóa mặc định vboxsfđã biết có vấn đề về hiệu suất với số lượng lớn tệp / thư mục và thiếu hỗ trợ cho các liên kết tượng trưng và liên kết cứng (xem vé 818 - một lỗi hơn 7 năm tuổi). Tránh sử dụng nó.

Thư mục được đồng bộ hóa kiểu rsync có thể là lựa chọn tốt nhất của bạn.

Bạn đã đề cập rằng nó bị lỗi, bạn đang chạy phiên bản rsync nào? Cố gắng cập nhật nó lên 3.1.0 thông qua bia, tôi biết OOTB đã quá cũ (2.x), có thể gây ra sự cố.


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

1
Tôi vui mừng khi tôi đọc câu trả lời này, nghĩ nó sẽ giải quyết vấn đề của tôi nhưng tôi nhận được tương tự như trên khi tôi làm sudo mount -t rsync shared /var/wwwsai việcmount: unknown filesystem type 'rsync'
samayo

rsynckhông bao giờ là một loại hệ thống tệp nên bạn sẽ không thể gắn kết nó.
Terry Wang

@samyo tham khảo vagrantup.com/docs/synced-folders/rsync.html bạn cần định cấu hình trong Vagrantfilevà chạy thủ công vagrant rsynchoặc vagrant rsync-auto. Nếu không, nó sẽ chỉ được đồng bộ hóa khi tải lên và tải lại.
Terry Wang

1

Sau khi vagrant-vbguestloay hoay trong khoảng một giờ và thử một vài giải pháp khác nhau ( , cách khắc phục được đề xuất của Marvin), tôi không thể nhận được các liên kết tượng trưng trong các thư mục chia sẻ để hoạt động với VirtualBox 4.8.10, Vagrant 1.5.1.

Tôi thấy rằng một giải pháp đơn giản hơn là định cấu hình một thư mục chia sẻ riêng biệt và sau đó sử dụng Ruby File.readlinkđể đọc trong đường dẫn cơ bản:

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

1
Tôi không hiểu. Bạn có thể giải thích bằng một ví dụ? Cảm ơn
Cassiano

0

Thêm dòng sau vào Vagrantfile:

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

Điều này CHỈ hoạt động đối với tôi sau khi tôi hạ cấp virtualbox 6.0.8 xuống 6.0.4 và vagrant 2.2.4 xuống 2.2.1.

khi bạn mở terminal (tôi sử dụng git bash trên windows 10) với "Run as Admin".

cũng thử thay đổi git bash: trong tệp dự án: $ vim .git / config thay đổi thành 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.