ฉันแก้ไขไฟล์ Linux ด้วยโปรแกรม Windows ในขณะที่ใช้ระบบย่อย Windows สำหรับ Linux และตอนนี้ฉันไม่สามารถเข้าถึงได้อีกต่อไป


12

ฉันใช้Bash บน Ubuntu บน Windowsหรือการกระจาย Linux อื่นภายในระบบย่อย Windows สำหรับ Linuxและฉันแก้ไขไฟล์ Linux ภายในlxssไดเรกทอรีด้วยตัวแก้ไข Windows

ตอนนี้เมื่อใดก็ตามที่ฉันหรือโปรแกรมพยายามเข้าถึงมันจาก Linux ฉันได้รับข้อผิดพลาด "ข้อผิดพลาดอินพุต / เอาท์พุต" หรือไฟล์หายไปอย่างสมบูรณ์แม้ว่าฉันจะเห็นว่ามีอยู่ใน File Explorer แน่นอน

cat abc
cat: abc: Input/output error

ทำไมสิ่งนี้จึงเกิดขึ้น ฉันจะแก้ไขได้อย่างไร ฉันจะหลีกเลี่ยงได้ในอนาคตอย่างไร

คำตอบ:


13

ทำไมสิ่งนี้จึงเกิดขึ้น

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

เมื่อ WSL พยายามอ่านไฟล์และไม่สามารถหาคุณลักษณะที่คาดว่าจะเกิดข้อผิดพลาดจะรายงานเช่นเดียวกับสิ่งที่จะเกิดขึ้นหากระบบไฟล์ดั้งเดิมเสียหาย หากไม่เคยเห็นแอตทริบิวต์ของไฟล์ในตอนแรกไฟล์นั้นจะถือว่าเป็นไฟล์ที่ไม่มีอยู่จริงและจะไม่ปรากฏในรายชื่อไฟล์

คำแนะนำ WSL อย่างเป็นทางการคือ

ไม่ได้อยู่ภายใต้สถานการณ์ใด ๆ ที่สร้างและ / หรือแก้ไขไฟล์ Linux ใช้ปพลิเคชันของ Windows เครื่องมือสคริปต์คอนโซล ฯลฯ

การสร้าง / เปลี่ยนไฟล์ Linux จาก Windows อาจทำให้ข้อมูลเสียหายและ / หรือเกิดความเสียหายกับสภาพแวดล้อม Linux ของคุณซึ่งคุณต้องถอนการติดตั้งและติดตั้ง distro ใหม่!

ด้วยเหตุนี้ (แต่ใหญ่กว่าและแดงกว่าและมีการขีดเส้นใต้มากกว่า) "ไฟล์ Linux" หมายถึงทุกสิ่งในlxssไดเรกทอรีของคุณ คุณสามารถแก้ไขไฟล์ Windows ปกติจากภายใน Linux ผ่าน/mnt/c/...ระบบไฟล์ DrvFSแต่ไม่สามารถย้อนกลับได้

อย่างไรก็ตาม 1903 วินโดวส์ 10 การเปิดตัวแนะนำกลไกใหม่ที่ไม่อนุญาตให้ไฟล์ที่จะแก้ไขได้อย่างปลอดภัยจาก Windowsตราบเท่าที่คุณไปเกี่ยวกับเรื่องวิธีการที่เหมาะสม ไม่ได้ช่วยแก้ไขปัญหาไฟล์ที่เสียหายแล้ว แต่สามารถหลีกเลี่ยงได้ในอนาคต

ฉันจะแก้ไขได้อย่างไร

หากคุณแก้ไขไฟล์แล้วและตอนนี้คุณไม่สามารถเข้าถึงไฟล์ได้คุณยังสามารถอ่านเนื้อหาจาก Windows เองและเรียกคืนไฟล์ด้วยวิธีดังกล่าวได้

ในการทำเช่นนั้นคุณจะต้อง:

  1. นำทางกลับไปยังตำแหน่งภายในAppData\Local\lxssไดเรกทอรีที่ไฟล์นั้นใช้งาน File Explorer และย้ายไฟล์ออกไปที่อื่นบนไดรฟ์เช่นเดสก์ท็อปของคุณ
  2. รีสตาร์ท WSL หลังจากนั้นเพื่อล้างแคชภายในซึ่งคุณสามารถทำได้เพียงแค่ปิดเทอร์มินัลทั้งหมดของคุณและเปิดใหม่ หากคุณมีกระบวนการเซิร์ฟเวอร์เบื้องหลังทำงานอยู่คุณจะต้องหยุดกระบวนการเหล่านั้นด้วย
  3. ภายใน Linux อีกครั้งให้ไปที่ตำแหน่งเดิมของไฟล์ที่เสียหาย มันจะไม่ปรากฏขึ้นเลยหากคุณย้ายไฟล์ออกไปเรียบร้อยแล้ว เรียกใช้lsเพื่อตรวจสอบ
  4. ตรวจสอบไฟล์ที่คุณย้ายออกแล้ว: รัน

    cat /mnt/c/Users/.../Desktop/abc
    

    เพื่อดูเนื้อหาต้นฉบับของไฟล์

  5. หากทุกอย่างทำงานได้ดีคุณสามารถคัดลอกไฟล์นั้นกลับไปยังตำแหน่งที่คุณคาดว่าจะเป็น:

    cp /mnt/c/Users/.../Desktop/abc ~/alphabet/abc
    

    cpคำสั่งจะทำให้เกิด WSL ที่จะเรียกคืนคุณลักษณะที่ซ่อนอยู่ที่จำเป็นที่ไฟล์

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

ฉันจะหลีกเลี่ยงสิ่งนี้ในอนาคตได้อย่างไร

ห้ามใช้ไฟล์ใด ๆ ในlxssไดเรกทอรีจาก Windows แทน:

  • หากคุณมีไฟล์ที่คุณต้องการที่จะเข้าถึงได้จากทั้ง Windows และ Linux เก็บไว้นอกlxssไดเรกทอรีทุกที่อื่นในระบบ Windows ของคุณ คุณสามารถเปิดไฟล์ Windows จาก Linux โดยใช้การทำงานร่วมกันอัตโนมัติของ DrvFS : /mnt/cไดเรกทอรีนี้มีไฟล์ทั้งหมดจากไดรฟ์ C: และสามารถอ่านและเขียนได้จาก Linux

  • เริ่มต้นในรุ่น Windows 1903 (มีนาคม 2019) WSL มีไฟล์เซิร์ฟเวอร์พิเศษที่ทำให้ไฟล์ของคุณพร้อมใช้งานสำหรับแอปพลิเคชัน Windows ทั้งหมด ถ้าคุณวิ่ง

    explorer.exe .
    

    จากนั้น File Explorer จะเปิดขึ้นเพื่อแสดงไดเรกทอรี Linux ปัจจุบัน - คุณสามารถคัดลอกไฟล์เข้าหรือออกจากหน้าต่างนั้นหรือแก้ไขด้วยแอปพลิเคชันใดก็ได้ เส้นทางไดเรกทอรีจะเป็นเช่น\\wsl$\Ubuntu\var\www: \\wsl$\ส่วนที่ส่งการเข้าถึงไฟล์ผ่านทางเลือกที่ปลอดภัยเส้นทาง

    หากคุณสามารถทำได้สิ่งนี้จะเป็นเส้นทางที่ดีที่สุดไปข้างหน้า (หรือบางครั้งก็เป็นจุดด้านบน) สำหรับรุ่นเก่าอ่านต่อ

  • หากมีไฟล์ที่คุณต้องอยู่ในสถานที่เฉพาะเช่นไฟล์กำหนดค่าและคุณต้องการแก้ไขจาก Windows คุณสามารถสร้างลิงก์สัญลักษณ์จากภายใน Linux ไปยังไฟล์หรือตำแหน่งจริงของไดเรกทอรี:

    ln -s /mnt/c/.../abc ~/.config/xyz/abc
    

    สิ่งนี้จะทำงานได้ตราบใดที่ไฟล์ไม่จำเป็นต้องมีสิทธิ์เฉพาะหรือคุณลักษณะใด ๆ ในลินุกซ์ (เป็นไฟล์ปฏิบัติการหรือคีย์ SSH)

  • อีกวิธีหนึ่งและอาจจะดีกว่าแก้ไขไฟล์ Linux ของคุณโดยใช้โปรแกรมแก้ไข Linux ภายใน terminal nano, vimและemacsทั้งหมดพร้อมใช้งานและทำงานได้ดีภายใต้ WSL แม้ว่าพวกเขาทั้งหมดจะมีนิสัยใจคอของพวกเขา

  • หากคุณต้องแก้ไขไฟล์ด้วยโปรแกรม Windows คุณไม่มี Windows เวอร์ชันล่าสุดและคุณไม่สามารถสร้าง symlink ทำสำเนาที่อื่นเพื่อแก้ไขและคัดลอกกลับมาได้ใน/mnt/cภายหลังเช่นเดียวกับ แก้ไขด้านบนหรือใช้การควบคุมเวอร์ชันเพื่อซิงโครไนซ์การแก้ไขของคุณในหลาย ๆ ที่

จากการทดลองบางอย่าง Notepad ธรรมดาดูเหมือนจะรักษาคุณสมบัติที่จำเป็น แต่มันไม่เข้าใจการจบบรรทัดของ Unix ดังนั้นคุณน่าจะทำให้เนื้อหาเสียหายด้วยตัวคุณเองและฉันจะไม่พึ่งพาพฤติกรรมนั้นในทุกกรณี เนื่องจากนี่เป็นการดำเนินการที่ไม่ได้รับการสนับสนุนและไม่มีเอกสารอย่างชัดเจนจึงไม่น่าเป็นไปได้ที่เครื่องมือที่ใช้ Windows จะเชื่อถือได้

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