ระบบย่อย Windows Linux - การเข้าถึงไฟล์นอก Ubuntu


85

ทำไมเมื่อฉันสร้างไฟล์จากใน Windows ฉันจะไม่เห็นมันภายใต้ระบบย่อย Linux ใน Windows 10 (bash.exe)

ภาพหน้าจอควรอธิบาย

โฟลเดอร์: OMG ถูกสร้างขึ้นจากภายใน Windows Explorer Folder OMGBash ถูกสร้างจากระบบย่อยของ Linux bash.exe

เมื่อสร้างโฟลเดอร์หรือไฟล์นอก bash.exe ฉันไม่สามารถมองเห็นได้ไม่ว่าจะมีการอนุญาตหรือการเป็นเจ้าของ

เพื่อแสดงข้อมูลที่ฉันต้องใช้ Cygwin เพื่อแสดงการอนุญาตของไฟล์ฉันได้เปลี่ยนสิทธิ์เพื่อดูว่าโฟลเดอร์จะปรากฏขึ้นหรือไม่ (หน้าต่างคำสั่งสองหน้าต่างที่ด้านล่าง)

ภาพหน้าจอแสดงสิทธิ์ของโฟลเดอร์ bash.exe และ Cygwin:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันกำลังพยายามย้ายสคริปต์ Cygwin ทั้งหมดไปยังระบบย่อย Linux แต่ฉันไม่อยากสร้างไฟล์ใหม่ซ้ำอีกทั้งต้องคัดลอกแล้วใช้ bash ก่อนแล้วจึงทำการฟอร์แมตใหม่อีกครั้งโดยใช้ Dos2unix

พบสิ่งนี้ใน GitHub สำหรับระบบย่อย Linux:

การคัดลอกโดยตรงไปยังระบบย่อย Linux จาก Windows ไม่ได้รับการสนับสนุน มีไดเรกทอรีภายใต้ AppData อยู่ที่ไหนสักแห่ง (ฉันลืมที่) ที่มีไฟล์สำหรับระบบไฟล์ WSL แต่ถ้าคุณใส่ไฟล์ใหม่ที่นั่นหรือแก้ไขไฟล์ที่มีอยู่ที่นั่นการเปลี่ยนแปลงของคุณจะไม่ถูกต้องภายใน WSL

สิ่งที่ฉันคาดเดาได้ดีที่สุดคือ Linux ต้องเก็บข้อมูลเมตาที่ต่างกัน (และข้อมูลแคชเพิ่มเติมเป็นต้นเนื่องจากรูปแบบการกำหนดบัฟเฟอร์ของดิสก์นั้นแตกต่างกัน) เกี่ยวกับไฟล์ที่มากกว่า Windows และปัจจุบันนี้ถูกนำไปใช้โดยการจัดเก็บสำเนาต้นแบบของโครงสร้าง ของระบบไฟล์ Linux ในฐานข้อมูลบางประเภทและเพียงใช้ระบบไฟล์ Windows เป็น BLOB-store ที่สะดวกสำหรับฐานข้อมูลนั้น

หากคุณต้องการทำสิ่งนี้จริงๆวิธีแก้ปัญหาคือการเขียนสคริปต์ drag'n'drop .bat หรือ somesuch ที่ bash.exe -c "mv% 1 / home / $ USER /" (คุณจะต้องทำงานอย่างชาญฉลาดกับ sed และ tr เพื่อแปล% 1 เป็นเส้นทาง WSL ที่ถูกต้อง)

อีกวิธีหนึ่ง - คุณสามารถวางไฟล์ของคุณในไดเรกทอรี Windows และใน WSL ให้ทำ "cd ~; ln -s / mnt / c / path / to / my / files" เพื่อให้ปรากฏใน homedir WSL ของคุณหรือไม่


เป็นไปได้ไหมที่จะติดตั้ง windows HDD ภายใต้สภาพแวดล้อม Linux? ด้วยวิธีนี้ควรแสดงไฟล์ทั้งหมดแบบเรียลไทม์ ... (หรือแม้แต่ไดเรกทอรีของบ้าน Cygwin)
Hastur

3
เป็นแนวคิดที่ดี แต่น่าเสียดายที่ไฟล์นั้นไม่สามารถมองเห็นได้ วิธีรอบมันคือการคัดลอกไฟล์จาก Windows Directory ไปยังลินุกซ์ระบบย่อยของไดเรกทอรีผ่าน Bash.exe การทำเช่นนี้จำเป็นต้องมีcp -r --no-preserve=all การปล่อยสิทธิ์ก่อนหน้านี้ อย่างไรก็ตามหากคุณต้องการเปลี่ยนแปลงอย่างหนักคุณไม่สามารถใช้แอพพลิเคชั่น windows เพื่อแก้ไขไฟล์ใน LinuxSubSystem ได้คุณต้องแก้ไขไฟล์ในไดเรกทอรีของ windows แล้วคัดลอกมา ตอนนี้ฉันรู้ว่ามันใช้งานได้ แต่ฉันอยู่ภายใต้การแสดงผลระบบย่อย Linux เป็นพื้นเมือง / รวมเข้ากับ windows มากกว่าระบบปฏิบัติการที่แยก
เดฟแฮมิลตัน

คุณสามารถติดตามความคืบหน้าของปัญหานี้ (การจัดการไฟล์ระหว่าง Windows และ WLS) ได้ที่github.com/Microsoft/BashOnWindows/issues/1051
Gaia

หากคุณติดตั้ง distro จากร้านค้าของ Windows %LocalAppData%\Packages\<some-long-name-of-distro>\LocalState\rootfsระบบแฟ้มจะอยู่ที่
เอียนเคมพ์

คำตอบ:


95

ฉันไม่แน่ใจว่าฉันทำผิดคำถามของคุณหรือไม่ แต่อูบุนตู bash ของคุณ (หน้าต่างด้านบนขวา) ควรจะสามารถเข้าถึงดิสก์ที่ใช้ Windows ของคุณ/mntได้ ตัวอย่างเช่นบนเครื่องของฉัน/mnt/c/Users/Scott/Desktopคือเดสก์ท็อป Windows ของฉันและฉันสามารถอ่าน / เขียนไฟล์จาก vi เป็นเวลานาน ฉันไม่เชื่อว่าสิ่งที่ตรงกันข้ามจะเป็นจริงเพียงแค่ นั่นคือฉันไม่คิดว่าคุณสามารถสำรวจสู่โลกทุบตีของคุณได้จาก Windows explorer

สิ่งที่ฉันทำในฐานะนักพัฒนาคือการโฮสต์โครงการบน d: และชี้เครื่องมือที่ใช้ linux ไปยัง/mnt/d/projects/someproject/โฟลเดอร์นั้น

ตรวจสอบให้แน่ใจว่าคุณอัพเดต Windows build ของคุณเป็นระยะเนื่องจากดูเหมือนว่าจะมีการแก้ไขปัญหามากมายสำหรับแต่ละบิลด์โดยเฉพาะรอบ sym-links และการข้ามเขตแดน FS ระหว่าง Linux / Windows


1
คุณถูกต้องฉันคิดว่าฉันกระโดดปืนเล็กน้อย ในขณะที่ Bash สามารถเข้าถึงไฟล์ windows ได้ Windows ไม่สามารถคัดลอกไฟล์ลงในไดเรกทอรี Linux Sub System (มันสามารถคัดลอกได้ แต่ Bash ไม่สามารถมองเห็นมันได้เนื่องจากเป็นการสงวนสิทธิ์การใช้ไฟล์) เมื่อฉันถูกทุบตีติดตั้งฉันแม้ว่าสิ่งที่มีเหตุผลที่สุดคือการย้ายโครงการของฉันจากสภาพแวดล้อม Linux หนึ่งไปยังอีก (พยายามทิ้ง Cwygin) มันเป็นสิ่งที่เริ่มต้นฉันลงเส้นทางของอาการปวดหัว ฉันได้กำหนดค่า Bashrc ของฉันตอนนี้ให้มีไดเรกทอรีเริ่มต้นของสภาพแวดล้อม Linux ก่อนหน้านี้ของฉันและทำงานจากที่นั่น ขอขอบคุณสำหรับการตอบสนองของคุณ.
เดฟแฮมิลตัน

รอคุณจะรับ / mnt / d เพื่อแสดงได้อย่างไร เช่นเมื่อฉันเชื่อมต่อโทรศัพท์ผ่าน MTP มันจะปรากฏขึ้นภายใต้เส้นทางเช่น "PC \ PhoneName นี้" แต่ไม่มีตัวอักษรของไดรฟ์ที่เกี่ยวข้อง
Michael

Symlinks ทำงานได้ถ้าคุณไม่มีเครื่องหมายสแลช นอกจากนี้คุณต้องมีไฟล์ที่ด้าน Windows ของระบบไฟล์เพื่อทำสิ่งต่าง ๆ เช่นเรียกใช้โครงการ Django ในพื้นที่และเข้าถึงไฟล์เหล่านั้นในเบราว์เซอร์
Zags

แต่ไฟล์ linux ไม่อัปเดตเมื่อฉันแก้ไขไฟล์ windows?!?!
BugWhisperer

20

@ scottt732 ตอบอย่างสวยงาม

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

ตัวอย่างเช่นหากคุณกำลังทำงานในโครงการd:/projects/web-projectคุณสามารถสร้าง symlink ที่ตำแหน่ง/var/www/web-projectและไฟล์ทั้งหมดที่คุณเปลี่ยนใน windows จะสามารถเข้าถึงได้ใน Linux Bash

สำหรับสิ่งนี้คุณจะใช้lnคำสั่งเช่นนี้

ln -s  /mnt/d/projects/web-project  /var/www/web-project

ในบรรทัดข้างต้น/mnt/dหมายถึงการเป็นไดรฟ์ d ของคุณบน windows ตั้งค่าโฮสต์เสมือน Apache ของคุณเป็นพา ธ นี้และคุณพร้อมที่จะไป


ไม่ได้ซิงค์จริง ๆ ... เว้นแต่ฉันจะต้องรีสตาร์ทเซิร์ฟเวอร์ทุกครั้งหรือไม่
BugWhisperer

@ ต้องเป็นลิงก์สัญลักษณ์ดังนั้นคุณไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์สำหรับสิ่งนี้ จริงๆแล้วนี่ไม่ใช่การซิงค์มันแค่ชี้ไปที่โฟลเดอร์ / เส้นทางนั้น
Riz

1
ฉันพบปัญหา มันเป็นเพราะไฟล์ CSS มีเส้นประในชื่อเช่น, css-file.css. ผมได้โพสต์เกี่ยวกับปัญหานี้ที่นี่
BugWhisperer

9

เราขอแนะนำให้คุณไม่ได้คัดลอก / สร้าง / ปรับปรุงแฟ้ม Linux ใช้ปพลิเคชันของ

ให้เก็บไฟล์ไว้ในระบบไฟล์ Windows (เช่นc:\dev\project) ที่คุณต้องการแก้ไขไฟล์โดยใช้เครื่องมือ Windows และ / หรือสร้าง / ทดสอบ / รันโดยใช้เครื่องมือ Linux / รันไทม์ / แพลตฟอร์ม (เช่นผ่าน/mnt/c/dev/project)

ในสถานการณ์เฉพาะของคุณถ้าคุณต้องการคัดลอกไฟล์ Cygwin ของคุณลงใน Bash จากนั้นเปิด Bash และคัดลอกไฟล์จากโฟลเดอร์ Cygwin ของคุณบน C: ลงใน~/แบบนี้cp /mnt/c/Users/dave/Documents/Cygwin/* ~/:)

HTH


1

ฉันต้องการทำงานกับ PyCharm / eclipse บน Windows 10 ในขณะที่ใช้งาน / ทดสอบฉันต้องการสภาพแวดล้อม Linux;

ฉันมีปัญหาในการตรวจสอบจากคอมไพล์ในระบบย่อยของ Linux และการแก้ไขด้วยไฟล์ PyCharm ไม่เห็นทันทีและมีปัญหา

devcode=/DevCode

if [ ! -L $devcode ]; then
     ln -s /mnt/c/DevCode /DevCode 
fi

ฉันมีข้างต้นใน. bashrc ของฉันในพื้นที่ Ubuntu มันทำงานได้อย่างราบรื่น ฉันสามารถแก้ไข Windows และเรียกใช้ / ทดสอบใน Ubuntu ได้โดยไม่มีปัญหาใด ๆ


0

ฉันมีความต้องการคล้ายกันในการคัดลอกไฟล์ระหว่าง WSL และ win10 ฉันลงเอยด้วยการเปิดใช้งาน sshd บนการติดตั้ง Ubuntu เพื่อให้ฉันสามารถ ssh ลงใน Linux ได้จาก win10 จากนั้นฉันใช้ winscp เพื่อคัดลอกไฟล์ไปมา ไม่ดีที่สุด แต่ฉันไม่คัดลอกไฟล์บ่อยนัก ฉันพยายามค้นหาโพสต์ที่ฉันเปิดใช้งาน sshd แต่ไม่พบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.