Почему это случилось?
Поскольку обычные файловые системы Unix работают не так, как файловые системы Windows, WSL хранит дополнительную информацию о специфических для Linux свойствах файлов в расширенных атрибутах файлов Windows, используемых для их представления. Обычные программы Windows не знают об этих атрибутах и не сохранят их при редактировании файла. Важная информация о файле теряется, когда это происходит.
Когда WSL пытается прочитать файл и не может найти ожидаемые атрибуты, выдается сообщение об ошибке, как и в случае повреждения собственной файловой системы. Если он никогда не увидит атрибуты файла в первую очередь, этот файл будет считаться несуществующим и не будет отображаться в списках файлов.
Официальный совет WSL является
Ни при каких обстоятельствах НЕ создавайте и / или не изменяйте файлы Linux с помощью приложений, инструментов, скриптов, консолей и т. Д. Для Windows.
Создание / изменение файлов Linux из Windows, вероятно, приведет к повреждению данных и / или повреждению вашей среды Linux, что потребует от вас удаления и переустановки вашего дистрибутива!
по этой причине (но больше и краснее, и с большим количеством подчеркиваний). «Файлы Linux» означают что-либо внутри вашего lxss
каталога. Вы можете изменять обычные файлы Windows изнутри Linux через /mnt/c/...
файловую систему DrvFS , но не наоборот.
Тем не менее, выпуск Windows 10 1903 года представляет новый механизм, который позволяет безопасно редактировать файлы из Windows, если вы делаете это правильно. Это не поможет решить проблему уже поврежденных файлов, но в будущем этого можно избежать.
Что я могу сделать, чтобы это исправить?
Если вы уже отредактировали файл и теперь не можете получить к нему доступ, все равно можно прочитать содержимое самой Windows и таким образом восстановить файл.
Для этого вам необходимо:
- Вернитесь обратно в
AppData\Local\lxss
каталог, в котором находится файл, с помощью проводника и переместите файл в другое место на вашем диске, например на рабочем столе.
- После этого перезапустите 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 будет надежным.