ลิงก์สัญลักษณ์และโฟลเดอร์ที่ซิงค์ใน Vagrant


99

ฉันต้องการใช้ Vagrant เพื่อจัดเตรียมสภาพแวดล้อมการพัฒนาร่วมกันให้กับทีมของฉัน โฮสต์แตกต่างกันอย่างสิ้นเชิง:

  • บางคนใช้ OS X, Linux บางตัวและ Windows บางตัว
  • บางคนใช้ VMware บางคนใช้ VirtualBox

ภายใน VM เราต้องการเรียกใช้ Linux

จนถึงตอนนี้ทุกอย่างเรียบร้อยดี

ตอนนี้ความคิดของเราคือนักพัฒนาแต่ละคนจะสามารถใช้ IDE ที่ต้องการได้และด้วยเหตุนี้เราจึงได้แนะนำโฟลเดอร์ที่ซิงค์ซึ่งแชร์ซอร์สโค้ดระหว่างโฮสต์และ VM โดยพื้นฐานแล้วก็ใช้งานได้เช่นกัน ... ยกเว้นลิงก์สัญลักษณ์

ภายในซอร์สโค้ดของเราเรามีลิงก์สัญลักษณ์บางอย่างซึ่งไม่ใช่ปัญหาภายใน Linux ภายใน VM แต่บน Windows ในฐานะโฮสต์จะทำให้เกิดปัญหา สิ่งเดียวที่เราไม่สามารถทำได้คือกำจัดลิงก์สัญลักษณ์ดังนั้นเราจึงต้องการวิธีอื่นในการจัดการกับสิ่งนี้

จนถึงขณะนี้เราได้ลองใช้ตัวเลือกต่างๆมากมาย:

  • มีวิธีแก้ปัญหาที่กล่าวถึงในปัญหาของ Vagrant น่าเสียดายที่นี่เป็น VirtualBox เท่านั้นและไม่ได้ช่วยผู้ที่ใช้ VMware จนถึงตอนนี้เรายังไม่พบวิธีการเรียกใช้โค้ดในVagrantfileขึ้นอยู่กับผู้ให้บริการที่ใช้
  • แทนที่จะใช้โฟลเดอร์แชร์มาตรฐานตอนนี้เราได้ลองใช้ประเภทrsyncแล้ว สิ่งนี้ใช้ได้กับ Windows แต่เกิดข้อผิดพลาดบน OS X โดยมีข้อผิดพลาดหลายsymlink has no referentประการบอกเราว่า(หนึ่งข้อผิดพลาดต่อลิงก์สัญลักษณ์)
  • เราคิดเกี่ยวกับNFSแต่จะใช้ได้เฉพาะเมื่อคุณไม่ได้ใช้ Windows เป็นโฮสต์
  • แม้ว่าเราจะเกี่ยวกับSMBแต่สิ่งนี้ใช้ได้กับ Windows ในฐานะโฮสต์เท่านั้น

ฉันนึกไม่ออกว่าเราเป็นคนเดียวหรือคนแรกบนโลกนี้ที่ประสบปัญหากับโฮสต์หลายแพลตฟอร์มและลิงก์สัญลักษณ์ภายในโฟลเดอร์ที่แชร์

คุณจะแก้ปัญหานี้ได้อย่างไรเพื่อให้เราสามารถเก็บลิงก์สัญลักษณ์ไว้ แต่ยังคงใช้ระบบปฏิบัติการโฮสต์อื่น



@SteveBennett ปัญหานั้น (ซึ่งการอ้างอิงคำตอบที่ยอมรับในปัจจุบัน) ได้รับการแก้ไขแล้วใน Vagrant 1.1 ซึ่งเผยแพร่เมื่อ 15 เดือนก่อนที่ OP จะโพสต์คำถาม และมันเกี่ยวกับโฟลเดอร์ที่ใช้ร่วมกันของ VirtualBox ไม่ใช่โฟลเดอร์ rsync ดูคำตอบของฉันด้านล่าง (คำตอบที่ยอมรับนั้นผิด)
jdunk

คำตอบ:


66

Virtualbox ไม่อนุญาตให้ใช้ symlink บนโฟลเดอร์ที่แชร์ด้วยเหตุผลด้านความปลอดภัย ในการเปิดใช้ symlink จะต้องเพิ่มบรรทัดต่อไปนี้ในบล็อก config ผู้ให้บริการ vm ใน Vagrantfile:

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 สำหรับ dirs ที่ใช้ร่วมกัน (เช่น "git status" ที่ใช้เวลาหลายวินาที) แม้ว่าจะเป็นไปได้ว่าคุณกำลังแชร์โปรเจ็กต์เล็ก ๆ ที่มีไฟล์เพียงไม่กี่ไฟล์ก็ตาม mitchellh.com/…
jdunk

5
การรันvagrant upในเชลล์ที่มีสิทธิ์ผู้ดูแลระบบเป็นสิ่งที่จำเป็น ดังที่ @jdunk ชี้ให้เห็นว่าตัวเลือกการกำหนดค่านี้ถูกตั้งค่าเป็นค่าเริ่มต้นใน Vagrant แล้วเนื่องจากการกระทำนี้เกิดขึ้นเกือบหนึ่งปีก่อนที่คำตอบนี้จะถูกโพสต์ ที่กล่าวว่าการทำงานvagrant upในเชลล์ที่มีสิทธิ์ผู้ดูแลระบบช่วยแก้ปัญหาของฉันได้
Ajedi32

2
ไม่ตอบสนองต่อคำถาม ไม่ทำงานกับโฟลเดอร์ที่ซิงค์
Manel

คำตอบนี้ผิดจาก 2 สาเหตุหลัก 1. หมายถึงโฟลเดอร์ที่ใช้ร่วมกัน VBox ไม่ใช่ rsynced ไดเรกทอรี - สองสิ่งที่แตกต่างกันอย่างสิ้นเชิง 2. การตั้งค่านี้เป็นค่าเริ่มต้นอยู่แล้วใน Vagrant 1.1 ซึ่งเปิดตัว 15 เดือนก่อนคำถามของ OP ดูคำตอบของฉันด้านล่างสำหรับข้อมูลเพิ่มเติม
jdunk

94

คำตอบที่ยอมรับคือไม่ดี คำถามนี้อธิบายถึงปัญหาเกี่ยวกับโฟลเดอร์ที่ซิงค์ไม่ใช่ โฟลเดอร์ที่แชร์ โซลูชันที่นำเสนอจะไม่มีผลกับโฟลเดอร์ rsynced ( ไม่แชร์ ) และแม้ว่า OP จะใช้โฟลเดอร์ที่ใช้ร่วมกันข้อเสนอแนะของคำตอบที่ได้รับการยอมรับก็เป็นสิ่งที่รวมเข้ากับคนจรจัดแล้วเมื่อ 1.1 ซึ่งเผยแพร่เมื่อ 15 เดือนก่อนที่ OP จะโพสต์คำถาม (ไม่ต้องพูดถึงโฟลเดอร์ที่ใช้ร่วมกันของ VirtualBox นั้นช้ามาก )


ฉันพบปัญหาเดียวกันนี้: บน OS X ฉันได้รับsymlink has no referentข้อผิดพลาด rsync โดยส่วนตัวฉันสามารถแก้ไขได้โดยการเพิ่ม rsync args เฉพาะในvagrantfile:

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

ฉันยังเปิดปัญหานี้ใน github ของคนเร่ร่อนเพื่อชี้ให้เห็นบางสิ่งที่ดูเหมือนจะผิดกับค่าเริ่มต้นของพวกเขาสำหรับrsync__args(โดยเฉพาะอย่างยิ่งอาร์กิวเมนต์เริ่มต้นอัน--copy-linksหนึ่งดูเหมือนจะทำลายอีกอันหนึ่ง--archiveอย่างน้อยที่สุดเท่าที่เกี่ยวข้องกับการคัดลอก symlink ที่เสีย ).


โทรดี - ขอบคุณ @jdunk ใช่ตามเอกสารของ Vagrant --copy-linksตัวเลือกนี้ถูกตั้งค่าโดยค่าเริ่มต้น นี่คือปัญหาของฉัน โดยการลบสิ่งนั้นออก (ใช้คำตอบของคุณด้านบน) - นั่นจะดูแลมัน
Phil Birnie

1
มีประโยชน์มากขอบคุณ แม้ว่าฉันต้องการทางเลือก Windows
Aleksandr Makov

4
โปรดทราบว่าตามเอกสาร Vagrant โฟลเดอร์ที่ใช้ร่วมกันเป็นประเภทเริ่มต้นของโฟลเดอร์ที่ซิงค์สำหรับผู้ใช้ VirtualBox: "หากคุณใช้ผู้ให้บริการ VirtualBox โฟลเดอร์ที่ใช้ร่วมกัน VirtualBox จะเป็นประเภทโฟลเดอร์ที่ซิงค์เริ่มต้น" ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) คำถามของ OP ดูเหมือนจะบอกเป็นนัยว่าโฟลเดอร์ที่ใช้ร่วมกันของ VirtualBox เป็นปัญหาดังนั้นคำตอบที่ยอมรับจึงพยายามแก้ไขปัญหาอย่างน้อยส่วนหนึ่ง (และแน่นอน แก้ไขปัญหาให้ฉัน)
Ajedi32

ขอบคุณมากที่ช่วยชีวิตฉันฉันดูทุกที่บนอินเทอร์เน็ตและในที่สุดก็มีคนที่เข้าใจปัญหานี้!
Dovizu

1
ขอบคุณ. นี่คือสิ่งที่แก้ปัญหาของฉันได้ (อันที่อยู่ในชื่อเรื่องและอันที่ฉันมาถึงที่นี่เพื่อหาวิธีแก้ปัญหาและสิ่งที่สับสนไม่ใช่สิ่งที่ถูกถาม)
johncip

7

ฉันลองใช้ตัวเลือกเหล่านี้ทั้งหมดเพื่อแก้ไขข้อผิดพลาดที่กำลังทำงานnpm installอยู่

เพียงแค่เรียกใช้ vagrant ในพรอมต์ผู้ดูแลระบบและโหลด vm ( vagrant reload) ก็สามารถแก้ปัญหาได้

ฉันกลับไปและลบการSharedFoldersEnableSymlinksCreateกำหนดค่าออกจาก Vagrantfile และทุกอย่างก็ยังปกติดี


npm updateไม่ทำงานในโฟลเดอร์แชร์คนจรจัดของฉัน วิธีนี้แก้ไขได้ด้วยเหตุผลบางประการ
Emre

1
หลังจากการวิจัยเพิ่มเติมปรากฎว่าการสร้างลิงก์สัญลักษณ์ต้องได้รับอนุญาตจากผู้ดูแลระบบใน windows โดยค่าเริ่มต้น หากต้องการแก้ไขการอนุญาตโปรดดูคำตอบที่นี่: superuser.com/a/125981
gameweld

การเรียกใช้ Vagrant และ command promt ในฐานะผู้ดูแลระบบในเครื่อง Window 10 ทำงานให้ฉันบน npx create-react-app 'project_name'
sybozz

2

ประเภทโฟลเดอร์ที่ซิงค์เริ่มต้นเป็นที่vboxsfทราบกันดีว่ามีปัญหาด้านประสิทธิภาพกับไฟล์ / ไดเร็กทอรีจำนวนมากและขาดการรองรับลิงก์สัญลักษณ์และฮาร์ดลิงก์ (ดูทิกเก็ต 818 - บั๊กอายุ 7 ปีขึ้นไป) หลีกเลี่ยงการใช้มัน

โฟลเดอร์ที่ซิงค์ประเภท rsync อาจเป็นทางเลือกที่ดีที่สุดของคุณ

คุณบอกว่ามันขัดข้องคุณใช้ rsync รุ่นอะไรอยู่ ลองอัปเดตเป็น 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 rsyncหรือvagrant rsync-auto. มิฉะนั้นจะซิงค์เมื่ออัปโหลดและโหลดซ้ำเท่านั้น
Terry Wang

1

หลังจากงอแงเป็นเวลาหนึ่งชั่วโมงและลองใช้วิธีแก้ไขปัญหาต่างๆ (วิธีvagrant-vbguestแก้ไขที่แนะนำของมาร์วิน) ฉันไม่สามารถรับ symlink ในโฟลเดอร์ที่แชร์เพื่อทำงานกับ 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 และ 2.2.4 เพื่อคนจรจัด 2.2.1

เมื่อคุณเปิดเทอร์มินัล (ฉันใช้ git bash บน windows 10) กับ "Run as Admin"

ลองใน git bash เปลี่ยน: ในไฟล์โครงการ: $ vim .git / config เปลี่ยนเป็น 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.