Ich habe eine Linux-Datei mit einem Windows-Programm bearbeitet, während ich das Windows-Subsystem für Linux verwendet habe, und jetzt kann ich nicht mehr darauf zugreifen


12

Ich verwende Bash unter Ubuntu unter Windows oder eine andere Linux-Distribution innerhalb des Windows-Subsystems für Linux und habe eine Linux-Datei im lxssVerzeichnis mit einem Windows-Editor bearbeitet .

Wenn ich oder ein Programm versuchen, unter Linux darauf zuzugreifen, wird der Fehler "Eingabe- / Ausgabefehler" angezeigt, oder die Datei verschwindet einfach vollständig, obwohl ich sehe, dass sie definitiv im Datei-Explorer vorhanden ist.

cat abc
cat: abc: Input/output error

Warum ist das passiert? Was kann ich tun, um das Problem zu beheben? Wie kann ich das in Zukunft vermeiden?

Antworten:


13

Warum ist das passiert?

Da herkömmliche Unix-Dateisysteme anders funktionieren als Windows-Dateisysteme, speichert WSL zusätzliche Informationen zu Linux-spezifischen Eigenschaften von Dateien in den erweiterten Attributen der Windows-Dateien, mit denen sie dargestellt werden. Normale Windows-Programme kennen diese Attribute nicht und behalten sie beim Bearbeiten der Datei nicht bei. In diesem Fall gehen wichtige Informationen über die Datei verloren.

Wenn die WSL versucht, eine Datei zu lesen, und die erwarteten Attribute nicht findet, wird ein Fehler gemeldet, genau wie bei einer Beschädigung eines nativen Dateisystems. Wenn die Attribute einer Datei überhaupt nicht angezeigt werden, wird diese Datei nur als nicht vorhanden behandelt und nicht in Dateilisten angezeigt.

Der offizielle WSL-Rat lautet

DO NOT, unter keinen Umständen , erstellen und / oder modifizieren Linux - Dateien mit Windows - Anwendungen, Tools, Scripts, Konsolen, usw.

Das Erstellen / Ändern von Linux-Dateien unter Windows führt wahrscheinlich zu Datenbeschädigungen und / oder Schäden an Ihrer Linux-Umgebung, sodass Sie Ihre Distribution deinstallieren und neu installieren müssen!

aus diesem Grund (aber größer und röter und mit mehr Unterstreichungen). "Linux-Dateien" bedeutet alles in Ihrem lxssVerzeichnis. Sie können reguläre Windows-Dateien unter Linux über das /mnt/c/...DrvFS-Dateisystem ändern , nicht jedoch umgekehrt.

Jedoch führt die 1903 von Windows 10 - Version einen neuen Mechanismus, den du Dateien sicher aus dem Windows bearbeitet werden lassen , solange Sie es dem richtigen Weg zu gehen. Das hilft nicht, das Problem bereits beschädigter Dateien zu beheben, kann es aber in Zukunft vermeiden.

Was kann ich tun, um das Problem zu beheben?

Wenn Sie eine Datei bereits bearbeitet haben und jetzt nicht darauf zugreifen können, ist es weiterhin möglich, den Inhalt von Windows selbst zu lesen und die Datei auf diese Weise wiederherzustellen.

Dazu müssen Sie:

  1. Navigieren Sie AppData\Local\lxssmit dem Datei-Explorer zurück zu dem Speicherort innerhalb des Verzeichnisses, in dem sich die Datei befindet, und verschieben Sie die Datei an einen anderen Ort auf Ihrem Laufwerk, z. B. auf Ihren Desktop.
  2. Starten Sie die WSL danach neu, um den internen Cache zu löschen. Schließen Sie dazu einfach alle Terminals und öffnen Sie ein neues. Wenn Hintergrundserverprozesse ausgeführt werden, müssen Sie diese ebenfalls stoppen.
  3. Wechseln Sie unter Linux erneut zum ursprünglichen Speicherort der beschädigten Datei. Es wird jetzt überhaupt nicht angezeigt, wenn Sie die Datei erfolgreich aus dem Weg geräumt haben. Ausführen ls, um zu überprüfen.
  4. Überprüfen Sie die Datei, die Sie verschoben haben: Ausführen

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

    um den ursprünglichen Inhalt der Datei zu sehen.

  5. Wenn bisher alles funktioniert hat, können Sie diese Datei jetzt wieder an den erwarteten Ort kopieren:

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

    Der cpBefehl veranlasst die WSL, die erforderlichen versteckten Attribute in der Datei wiederherzustellen.

Diese Anweisungen funktionieren für reguläre Datendateien. Wenn es sich jedoch um eine wichtige Betriebssystemdatei handelt, müssen Sie sie möglicherweise vollständig neu installieren . Bei vielen unkritischen Programmen ist es ausreichend, die beschädigte Datei aus Windows zu löschen und das Programm mithilfe des Paketmanagers neu zu installieren. Sie können die Datei nicht mehr unter Linux löschen, wenn sie beschädigt ist.

Wie kann ich das in Zukunft vermeiden?

Bearbeiten Sie niemals Dateien im lxssVerzeichnis unter Windows. Stattdessen:

  • Wenn Sie eine Datei haben, auf die Sie sowohl unter Windows als auch unter Linux zugreifen möchten, speichern Sie sie außerhalb des lxssVerzeichnisses an einer anderen Stelle auf Ihrem Windows-System. Sie können Windows-Dateien unter Linux mithilfe der automatischen DrvFS-Interoperabilität öffnen : Das /mnt/cVerzeichnis enthält alle Dateien von Ihrem Laufwerk C: und kann unter Linux gelesen und geschrieben werden.

  • Ab der Windows-Version 1903 (März 2019) enthält WSL einen speziellen Dateiserver, der Ihre Dateien allen Windows-Anwendungen zur Verfügung stellt. Wenn du läufst

    explorer.exe .
    

    Anschließend wird der Datei-Explorer mit dem aktuellen Linux-Verzeichnis geöffnet. Sie können Dateien in dieses Fenster oder aus diesem Fenster kopieren oder mit einer beliebigen Anwendung bearbeiten. Der Verzeichnispfad sieht ungefähr so aus \\wsl$\Ubuntu\var\www: Der \\wsl$\Teil sendet den Dateizugriff über einen alternativen, sicheren Pfad.

    Wenn Sie in der Lage sind, ist dies der beste Weg vorwärts (oder manchmal der obige Punkt). Lesen Sie für ältere Versionen weiter.

  • Wenn sich eine Datei an einem bestimmten Ort befindet, z. B. in einer Konfigurationsdatei, und Sie sie unter Windows bearbeiten möchten, können Sie innerhalb von Linux eine symbolische Verknüpfung zum tatsächlichen Speicherort der Datei oder des Verzeichnisses herstellen:

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

    Dies funktioniert so lange, wie die Datei unter Linux keine bestimmten Berechtigungen oder Attribute haben muss (wie es eine ausführbare Datei oder ein SSH-Schlüssel tun würde).

  • Alternativ und vielleicht besser können Sie Ihre Linux-Dateien mit einem Linux-Editor im Terminal bearbeiten. nano, vimUnd emacssind alle leicht zugänglich und arbeiten gut unter WSL, wenn sie alle ihre Macken haben.

  • Wenn Sie eine Datei mit einem Windows-Programm bearbeiten müssen, verfügen Sie nicht über eine ausreichend aktuelle Windows-Version und können sie nicht als Symlink erstellen. Erstellen Sie eine Kopie an einer anderen Stelle, um sie zu bearbeiten, und kopieren Sie sie /mnt/canschließend erneut, genau wie die Beheben Sie das Problem oben oder verwenden Sie die Versionskontrolle, um Ihre Änderungen an mehreren Standorten zu synchronisieren.

Nach einigen Experimenten scheint der normale Editor die erforderlichen Attribute beizubehalten, versteht jedoch die Unix-Zeilenenden nicht, sodass Sie den Inhalt wahrscheinlich selbst beschädigen, und ich würde mich auf keinen Fall auf dieses Verhalten verlassen. Da dies ein explizit nicht unterstützter und nicht dokumentierter Vorgang ist, ist es unwahrscheinlich, dass ein Windows-basierter Editor zuverlässig ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.