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 lxss
katalogu. 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:
- Wróć do lokalizacji w
AppData\Local\lxss
katalogu, w którym znajduje się plik, za pomocą Eksploratora plików i przenieś plik do innego miejsca na dysku, na przykład na pulpit.
- 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ć.
- W systemie Linux ponownie przejdź do oryginalnej lokalizacji uszkodzonego pliku. Teraz nie pojawi się wcale, jeśli plik został usunięty z drogi. Uruchom,
ls
aby sprawdzić.
Sprawdź plik, który wyprowadziłeś: uruchom
cat /mnt/c/Users/.../Desktop/abc
aby zobaczyć oryginalną zawartość pliku.
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
cp
Komenda 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 lxss
katalogu z systemu Windows. Zamiast:
Jeśli masz plik, który ma dostęp z systemami Windows i Linux, należy go przechowywać poza ten lxss
katalog, nigdzie indziej w systemie Windows. Możesz otwierać pliki systemu Windows z Linuksa przy użyciu automatycznej współpracy DrvFS : /mnt/c
katalog 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
, vim
i emacs
wszystkie 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/c
póź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.