Я редагував файл Linux з програмою Windows під час використання підсистеми Windows для Linux, і тепер не можу отримати доступ до неї більше


12

Я використовую Bash on 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, що вимагатиме видалення та перевстановлення вашого дистрибутива!

з цієї причини (але більший і червоніший, і з більшою кількістю підкреслень). "Файли Linux" означають все, що знаходиться всередині вашого lxssкаталогу. Ви можете змінювати звичайні файли Windows зсередини Linux через /mnt/c/...файлову систему DrvFS , але не навпаки.

Однак випуск Windows 1903 року впроваджує новий механізм, який дозволяє безпечно редагувати файли з 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 .
    

    тоді відкриється Провідник файлів, показуючи поточну каталог 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 буде надійним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.