Чому так сталося?
Оскільки звичайні файлові системи Unix працюють інакше, ніж файлові системи Windows, WSL зберігає додаткову інформацію про властивості файлів для Linux у розширені атрибути файлів Windows, які використовуються для їх представлення. Звичайні програми Windows не знають про ці атрибути і не зберігають їх під час редагування файлу. Важлива інформація про файл втрачається, коли це відбувається.
Коли WSL намагається прочитати файл, і він не може знайти атрибути, які він очікує, повідомляється про помилку, подібно до того, що сталося б, якщо рідна файлова система була пошкоджена. Якщо він ніколи не бачить атрибутів у файлі в першу чергу, цей файл просто трактується як неіснуючий і не відображатиметься у списках файлів.
Офіційний рада WSL є
НЕ ЗА будь-яких обставин не створюйте та / або змінюйте файли Linux за допомогою програм, інструментів, скриптів, консолей Windows та ін.
Створення / зміна файлів Linux з Windows, швидше за все, призведе до пошкодження даних та / або пошкодження середовища Linux, що вимагатиме видалення та перевстановлення вашого дистрибутива!
з цієї причини (але більший і червоніший, і з більшою кількістю підкреслень). "Файли Linux" означають все, що знаходиться всередині вашого lxss
каталогу. Ви можете змінювати звичайні файли Windows зсередини Linux через /mnt/c/...
файлову систему DrvFS , але не навпаки.
Однак випуск Windows 1903 року впроваджує новий механізм, який дозволяє безпечно редагувати файли з Windows , якщо ви рухаєтесь правильним шляхом. Це не допомагає виправити проблему вже зіпсованих файлів, але це може уникнути її в майбутньому.
Що я можу зробити, щоб виправити це?
Якщо ви вже відредагували файл і тепер не можете отримати доступ до нього, все одно можна прочитати вміст із самої Windows та відновити файл таким чином.
Для цього вам потрібно:
- Поверніться назад до місця в
AppData\Local\lxss
каталозі, у якому використовується файл File Explorer, і перемістіть файл кудись інше на диску, наприклад на робочий стіл.
- Після цього перезапустіть WSL, щоб очистити його внутрішній кеш, який ви можете зробити, просто закривши всі свої термінали та відкривши новий. Якщо у вас запущені фонові серверні процеси, вам також потрібно буде припинити їх.
- У Linux знову перейдіть до вихідного місця пошкодженого файлу. Зараз він взагалі не з’явиться, якщо ви успішно перемістили файл. Біжи,
ls
щоб перевірити.
Перевірте файл, який ви перемістили: запустіть
cat /mnt/c/Users/.../Desktop/abc
щоб побачити оригінальний вміст файлу.
Якщо все працювало дотепер, ви можете скопіювати цей файл назад у те місце, де ви очікували:
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 .
тоді відкриється Провідник файлів, показуючи поточну каталог Linux - ви можете скопіювати файли у це вікно або з нього або відредагувати їх у будь-якій програмі. Шлях до каталогу буде чимось на зразок \\wsl$\Ubuntu\var\www
: \\wsl$\
частина надсилає доступ до файлів через альтернативний, безпечний шлях.
Якщо ви зможете, це буде найкращий шлях вперед (або іноді крапка вище). Про старіші випуски читайте далі.
Якщо вам потрібен файл у певному місці, наприклад, файл конфігурації, і ви хочете відредагувати його з Windows, ви можете зробити символічне посилання зсередини Linux на реальне місцезнаходження файлу чи каталогу:
ln -s /mnt/c/.../abc ~/.config/xyz/abc
Це буде працювати до тих пір, поки файлу не потрібно мати певних дозволів або атрибутів в Linux (як виконуваний файл або ключ SSH).
Як варіант, а можливо, і краще, редагуйте файли Linux за допомогою редактора Linux в терміналі. nano
, vim
і emacs
всі вони доступні і добре працюють в рамках WSL, хоча всі вони мають свої примхи.
Якщо ви повинні відредагувати файл у програмі Windows, у вас немає достатньо недавньої версії Windows, і ви не можете зробити її посиланням. Створіть копію в іншому місці, щоб відредагувати та скопіювати її /mnt/c
згодом, як і виправити вище або скористатись контролем версій для синхронізації змін у кількох місцях.
З деякого експерименту звичайний Блокнот, схоже, зберігає необхідні атрибути, але він не розуміє закінчення рядків Unix, тому ви, ймовірно, самі зіпсуєте вміст, і я ні в якому разі не покладався б на цю поведінку. Оскільки це явно непідтримувана та незадокументована операція, навряд чи будь-який редактор на базі Windows буде надійним.