Saya mengedit file Linux dengan program Windows saat menggunakan Subsistem Windows untuk Linux, dan sekarang saya tidak dapat mengaksesnya lagi

12

Saya menggunakan Bash di Ubuntu pada Windows atau distribusi Linux lain dalam Windows Subsystem untuk Linux dan saya telah mengedit file Linux di dalam lxssdirektori dengan editor Windows.

Sekarang setiap kali saya atau suatu program mencoba mengaksesnya dari Linux, saya mendapatkan kesalahan "kesalahan input / output", atau file tersebut hilang sama sekali meskipun saya dapat melihatnya sudah pasti ada di File Explorer.

cat abc
cat: abc: Input/output error

Mengapa ini terjadi? Apa yang bisa saya lakukan untuk memperbaikinya? Bagaimana saya bisa menghindarinya di masa depan?

Michael Homer
sumber

Jawaban:

13

Mengapa ini terjadi?

Karena sistem file Unix konvensional bekerja secara berbeda dari sistem file Windows, WSL menyimpan informasi tambahan tentang properti file khusus Linux dalam atribut yang diperluas dari file Windows yang digunakan untuk mewakili mereka. Program Windows biasa tidak tahu tentang atribut ini dan tidak akan melindunginya ketika Anda mengedit file. Informasi penting tentang file hilang ketika itu terjadi.

Ketika WSL mencoba membaca file, dan tidak dapat menemukan atribut yang diharapkan, kesalahan dilaporkan, seperti apa yang akan terjadi jika sistem file asli rusak. Jika tidak pernah melihat atribut pada file di tempat pertama, file itu hanya diperlakukan sebagai tidak ada dan tidak akan muncul dalam daftar file.

The saran WSL resmi adalah

JANGAN, dalam keadaan APAPUN , buat dan / atau modifikasi file Linux menggunakan aplikasi, alat, skrip, konsol Windows, dll.

Membuat / mengubah file Linux dari Windows kemungkinan akan mengakibatkan korupsi data dan / atau merusak lingkungan Linux Anda mengharuskan Anda untuk menghapus & menginstal ulang distro Anda!

untuk alasan ini (tetapi lebih besar, dan lebih merah, dan dengan lebih banyak garis bawah). "File Linux" berarti apa pun di dalam lxssdirektori Anda . Anda dapat memodifikasi file Windows biasa dari dalam Linux melalui /mnt/c/...sistem file DrvFS , tetapi tidak sebaliknya.

Namun, 1903 Windows 10 rilis memperkenalkan mekanisme baru yang tidak memungkinkan file yang akan diedit dengan aman dari Windows selama Anda pergi tentang itu dengan cara yang benar. Itu tidak membantu untuk memperbaiki masalah file yang sudah rusak, tetapi dapat menghindarinya di masa mendatang.

Apa yang bisa saya lakukan untuk memperbaikinya?

Jika Anda sudah mengedit file dan sekarang Anda tidak dapat mengaksesnya, masih mungkin untuk membaca konten dari Windows itu sendiri dan mengembalikan file seperti itu.

Untuk melakukan itu, Anda harus:

  1. Arahkan kembali ke lokasi di dalam AppData\Local\lxssdirektori di mana file tersebut menggunakan File Explorer dan pindahkan file tersebut ke tempat lain di drive Anda, seperti desktop Anda.
  2. Restart WSL setelah itu untuk menghapus cache internal, yang dapat Anda lakukan hanya dengan menutup semua terminal Anda dan membuka yang baru. Jika Anda menjalankan proses server latar belakang, Anda juga harus menghentikannya.
  3. Di dalam Linux lagi, pergi ke lokasi asli dari file yang rusak. Itu tidak akan muncul sama sekali sekarang jika Anda berhasil memindahkan file keluar dari jalan. Jalankan lsuntuk memeriksa.
  4. Periksa file yang Anda pindah: jalankan

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

    untuk melihat konten asli file.

  5. Jika semuanya berjalan sejauh ini, Anda sekarang dapat menyalin file itu kembali ke tempat yang Anda harapkan:

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

    The cpperintah akan menyebabkan WSL untuk mengembalikan atribut tersembunyi yang diperlukan pada file tersebut.

Instruksi ini akan berfungsi untuk file data biasa, tetapi jika ini adalah file sistem operasi yang penting, Anda mungkin perlu menginstal ulang seluruhnya . Untuk banyak program yang tidak penting, menghapus file yang rusak dari Windows dan menginstal ulang program menggunakan manajer paket sudah cukup. Anda tidak akan dapat menghapus file dari dalam Linux setelah rusak.

Bagaimana saya bisa menghindari ini di masa depan?

Jangan pernah memanipulasi file apa pun dalam lxssdirektori dari Windows. Sebagai gantinya:

  • Jika Anda memiliki file yang ingin Anda akses dari Windows dan Linux, menyimpannya di luar yang lxssdirektori, di tempat lain pada sistem Windows Anda. Anda dapat membuka file Windows dari Linux menggunakan interoperabilitas DrvFS otomatis : /mnt/cdirektori berisi semua file dari drive C: Anda, dan mereka dapat dibaca dan ditulis dari Linux.

  • Dimulai pada rilis Windows 1903 (Maret 2019), WSL menyertakan server file khusus yang membuat file Anda tersedia untuk semua aplikasi Windows. Jika Anda berlari

    explorer.exe .
    

    kemudian File Explorer akan terbuka menampilkan direktori Linux saat ini - Anda dapat menyalin file masuk atau keluar dari jendela itu, atau mengeditnya dengan aplikasi apa pun. Path direktori akan seperti \\wsl$\Ubuntu\var\www: \\wsl$\bagian mengirimkan akses file melalui jalur alternatif, aman,.

    Jika Anda bisa, ini akan menjadi jalur terbaik ke depan (atau terkadang titik di atas). Untuk rilis yang lebih lama, baca terus.

  • Jika ada file yang Anda butuhkan di tempat tertentu, seperti file konfigurasi, dan Anda ingin mengeditnya dari Windows, Anda dapat membuat tautan simbolis dari dalam Linux ke lokasi sebenarnya file atau direktori:

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

    Ini akan berfungsi selama file tidak perlu memiliki izin atau atribut khusus di Linux (seperti yang dapat dieksekusi atau kunci SSH).

  • Atau, dan mungkin lebih baik, edit file Linux Anda menggunakan editor Linux di dalam terminal. nano,, vimdan emacssemuanya sudah tersedia dan bekerja dengan baik di bawah WSL, meskipun mereka semua memiliki kebiasaan mereka.

  • Jika Anda harus mengedit file dengan program Windows, Anda tidak memiliki versi Windows yang cukup baru, dan Anda tidak dapat membuatnya menjadi symlink, membuat salinan di tempat lain untuk mengedit dan menyalinnya kembali dari /mnt/csetelah itu, sama seperti perbaiki di atas, atau gunakan kontrol versi untuk menyinkronkan suntingan Anda di beberapa lokasi.

Dari beberapa percobaan, Notepad biasa tampaknya mempertahankan atribut yang diperlukan, tetapi Notepad tidak memahami akhiran baris Unix sehingga Anda cenderung merusak konten sendiri, dan saya tidak akan bergantung pada perilaku itu dalam hal apa pun. Karena ini adalah operasi yang secara eksplisit tidak didukung dan tidak berdokumen, tidak mungkin editor berbasis Windows mana pun dapat diandalkan.

Michael Homer
sumber