Edytowałem plik Linux za pomocą programu Windows podczas korzystania z Podsystemu Windows dla systemu Linux, a teraz nie mam już do niego dostępu

12

Używam Bash na Ubuntu w systemie Windows lub innej dystrybucji Linuksa w podsystemie Windows dla systemu Linux i edytowałem plik Linux wewnątrz lxsskatalogu za pomocą edytora Windows.

Teraz za każdym razem, gdy ja lub jakiś program próbuję uzyskać do niego dostęp z Linuksa, pojawia się błąd „błąd wejścia / wyjścia” lub plik po prostu znika całkowicie, chociaż widzę, że jest on zdecydowanie dostępny w Eksploratorze plików.

cat abc
cat: abc: Input/output error

Dlaczego tak się stało? Co mogę zrobić, aby to naprawić? Jak mogę tego uniknąć w przyszłości?

Michael Homer
źródło

Odpowiedzi:

13

Dlaczego tak się stało?

Ponieważ konwencjonalne systemy plików Unix działają inaczej niż systemy plików Windows, WSL przechowuje dodatkowe informacje na temat właściwości plików specyficznych dla Linuksa w rozszerzonych atrybutach plików Windows używanych do ich reprezentowania. Zwykłe programy Windows nie wiedzą o tych atrybutach i nie zachowają ich podczas edycji pliku. Ważne informacje o pliku zostaną utracone, gdy to nastąpi.

Gdy WSL próbuje odczytać plik i nie może znaleźć oczekiwanych atrybutów, zgłaszany jest błąd, podobnie jak w przypadku uszkodzenia macierzystego systemu plików. Jeśli nigdy nie widzi atrybutów pliku, plik ten jest traktowany jako nieistniejący i nie pojawia się na listach plików.

Oficjalna rada WSL jest

W żadnym wypadku NIE NALEŻY tworzyć i / lub modyfikować plików systemu Linux za pomocą aplikacji, narzędzi, skryptów, konsol itp. Systemu Windows.

Tworzenie / zmiana plików systemu Linux z systemu Windows prawdopodobnie spowoduje uszkodzenie danych i / lub uszkodzenie środowiska Linux wymagającego odinstalowania i ponownego zainstalowania dystrybucji!

z tego powodu (ale większy i bardziej czerwony, z większą ilością podkreśleń). „Pliki Linux” oznaczają wszystko w twoim lxsskatalogu. Możesz modyfikować zwykłe pliki Windows z systemu Linux za pomocą /mnt/c/...systemu plików DrvFS , ale nie odwrotnie.

Jednak wydanie systemu Windows 10 z 1903 r. Wprowadza nowy mechanizm, który umożliwia bezpieczną edycję plików w systemie Windows, pod warunkiem, że wykonasz to we właściwy sposób. To nie pomaga rozwiązać problemu już uszkodzonych plików, ale można go uniknąć w przyszłości.

Co mogę zrobić, aby to naprawić?

Jeśli plik był już edytowany, a teraz nie możesz uzyskać do niego dostępu, nadal można odczytać zawartość z systemu Windows i przywrócić plik w ten sposób.

Aby to zrobić, musisz:

  1. Wróć do lokalizacji w AppData\Local\lxsskatalogu, w którym znajduje się plik, za pomocą Eksploratora plików i przenieś plik do innego miejsca na dysku, na przykład na pulpit.
  2. Następnie uruchom ponownie WSL, aby wyczyścić jego wewnętrzną pamięć podręczną, co możesz zrobić, zamykając wszystkie terminale i otwierając nowy. Jeśli masz uruchomione procesy serwera w tle, musisz je również zatrzymać.
  3. W systemie Linux ponownie przejdź do oryginalnej lokalizacji uszkodzonego pliku. Teraz nie pojawi się wcale, jeśli plik został usunięty z drogi. Uruchom, lsaby sprawdzić.
  4. Sprawdź plik, który wyprowadziłeś: uruchom

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

    aby zobaczyć oryginalną zawartość pliku.

  5. Jeśli do tej pory wszystko działało, możesz teraz skopiować ten plik z powrotem w miejsce, w którym się spodziewałeś:

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

    cpKomenda spowoduje WSL w celu przywrócenia niezbędnych ukryte atrybuty pliku.

Te instrukcje będą działać dla zwykłych plików danych, ale jeśli jest to ważny plik systemu operacyjnego, może być konieczna ponowna instalacja . W przypadku wielu niekrytycznych programów wystarczy usunięcie uszkodzonego pliku z systemu Windows i ponowna instalacja programu za pomocą menedżera pakietów. Nie będzie można usunąć pliku z systemu Linux, gdy zostanie on uszkodzony.

Jak mogę tego uniknąć w przyszłości?

Nigdy nie manipuluj plikami w lxsskatalogu z systemu Windows. Zamiast:

  • Jeśli masz plik, który ma dostęp z systemami Windows i Linux, należy go przechowywać poza ten lxsskatalog, nigdzie indziej w systemie Windows. Możesz otwierać pliki systemu Windows z Linuksa przy użyciu automatycznej współpracy DrvFS : /mnt/ckatalog zawiera wszystkie pliki z dysku C: i można je czytać i zapisywać z systemu Linux.

  • Począwszy od wydania Windows 1903 (marzec 2019), WSL zawiera specjalny serwer plików, który udostępnia twoje pliki wszystkim aplikacjom Windows. Jeśli uciekniesz

    explorer.exe .
    

    następnie otworzy się Eksplorator plików pokazujący bieżący katalog Linux - możesz kopiować pliki do tego okna lub z niego, lub edytować je w dowolnej aplikacji. Ścieżka do katalogu będzie podobna \\wsl$\Ubuntu\var\www: \\wsl$\część wysyła dostęp do pliku alternatywną, bezpieczną ścieżką.

    Jeśli możesz, będzie to najlepsza ścieżka do przodu (lub czasami punkt powyżej). W przypadku starszych wersji czytaj dalej.

  • Jeśli istnieje plik, który musisz znajdować się w określonym miejscu, na przykład plik konfiguracyjny, i chcesz go edytować w systemie Windows, możesz utworzyć dowiązanie symboliczne z systemu Linux do rzeczywistej lokalizacji pliku lub katalogu:

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

    Działa to tak długo, jak długo plik nie musi mieć żadnych konkretnych uprawnień ani atrybutów w systemie Linux (tak jak w przypadku pliku wykonywalnego lub klucza SSH).

  • Alternatywnie, a może lepiej, edytuj swoje pliki Linux za pomocą edytora Linux w terminalu. nano, vimi emacswszystkie są łatwo dostępne i działają dobrze w ramach WSL, chociaż wszystkie mają swoje dziwactwa.

  • Jeśli musisz edytować plik za pomocą programu Windows, nie masz wystarczająco nowej wersji systemu Windows i nie możesz zrobić z niego dowiązania symbolicznego, zrobić kopii w innym miejscu, aby edytować i skopiować go /mnt/cpóźniej, podobnie jak napraw powyżej lub użyj kontroli wersji, aby zsynchronizować zmiany w wielu lokalizacjach.

Z niektórych eksperymentów wydaje się, że zwykły Notatnik zachowuje niezbędne atrybuty, ale nie rozumie końcówek linii uniksowych, więc prawdopodobnie samemu uszkodzisz zawartość, a ja w żadnym wypadku nie polegałbym na tym zachowaniu. Ponieważ jest to jawnie nieobsługiwana i nieudokumentowana operacja, jest mało prawdopodobne, aby jakikolwiek edytor oparty na systemie Windows był wiarygodny.

Michael Homer
źródło