J'ai modifié un fichier Linux avec un programme Windows en utilisant le sous-système Windows pour Linux, et maintenant je ne peux plus y accéder


12

J'utilise Bash sur Ubuntu sur Windows ou une autre distribution Linux dans le sous-système Windows pour Linux et j'ai édité un fichier Linux dans le lxssrépertoire avec un éditeur Windows.

Maintenant, chaque fois que moi ou un programme essayons d'y accéder depuis Linux, j'obtiens une erreur "erreur d'entrée / sortie", ou le fichier disparaît complètement même si je peux voir qu'il est définitivement là dans l'Explorateur de fichiers.

cat abc
cat: abc: Input/output error

Pourquoi est-ce arrivé? Que puis-je faire pour le réparer? Comment puis-je l'éviter à l'avenir?

Réponses:


13

Pourquoi est-ce arrivé?

Étant donné que les systèmes de fichiers Unix conventionnels fonctionnent différemment des systèmes de fichiers Windows, WSL stocke des informations supplémentaires sur les propriétés des fichiers spécifiques à Linux dans les attributs étendus des fichiers Windows utilisés pour les représenter. Les programmes Windows ordinaires ne connaissent pas ces attributs et ne les conservent pas lorsque vous modifiez le fichier. Des informations importantes sur le fichier sont perdues lorsque cela se produit.

Lorsque WSL essaie de lire un fichier et qu'il ne trouve pas les attributs qu'il attend, une erreur est signalée, tout comme ce qui se passerait si un système de fichiers natif était corrompu. S'il ne voit jamais les attributs d'un fichier en premier lieu, ce fichier est simplement traité comme inexistant et n'apparaîtra pas dans les listes de fichiers.

Le conseil officiel du WSL est

NE PAS, EN AUCUN CAS , créer et / ou modifier des fichiers Linux à l'aide d'applications, d'outils, de scripts, de consoles Windows, etc.

La création / modification de fichiers Linux à partir de Windows entraînera probablement une corruption des données et / ou endommagera votre environnement Linux, vous obligeant à désinstaller et réinstaller votre distribution!

pour cette raison (mais plus grand, plus rouge et avec plus de soulignements). "Fichiers Linux" signifie tout ce qui se trouve dans votre lxssrépertoire. Vous pouvez modifier les fichiers Windows standard depuis Linux via le /mnt/c/...système de fichiers DrvFS , mais pas l'inverse.

Cependant, la version 1903 de Windows 10 introduit un nouveau mécanisme qui permet de modifier les fichiers en toute sécurité à partir de Windows tant que vous y parvenez. Cela n'aide pas à résoudre le problème des fichiers déjà corrompus, mais cela peut l'éviter à l'avenir.

Que puis-je faire pour le réparer?

Si vous avez déjà modifié un fichier et que vous ne pouvez plus y accéder, il est toujours possible de lire le contenu de Windows lui-même et de restaurer le fichier de cette façon.

Pour ce faire, vous devrez:

  1. Revenez à l'emplacement du AppData\Local\lxssrépertoire dans lequel se trouve le fichier à l'aide de l'Explorateur de fichiers et déplacez-le vers un autre emplacement sur votre lecteur, comme votre bureau.
  2. Redémarrez WSL après cela pour vider son cache interne, ce que vous pouvez faire simplement en fermant tous vos terminaux et en ouvrant un nouveau. Si des processus de serveur d'arrière-plan sont en cours d'exécution, vous devrez également les arrêter.
  3. Sous Linux à nouveau, accédez à l'emplacement d'origine du fichier corrompu. Il n'apparaîtra plus du tout si vous avez réussi à déplacer le fichier. Courez lspour vérifier.
  4. Vérifiez le fichier que vous avez déplacé: exécutez

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

    pour voir le contenu original du fichier.

  5. Si tout a fonctionné jusqu'à présent, vous pouvez maintenant copier ce fichier à l'endroit où vous vous attendiez:

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

    La cpcommande entraînera WSL pour restaurer les attributs cachés nécessaires sur le fichier.

Ces instructions fonctionneront pour les fichiers de données ordinaires, mais s'il s'agit d'un fichier de système d'exploitation important, vous devrez peut-être réinstaller entièrement . Pour de nombreux programmes non critiques, la suppression du fichier corrompu de Windows et la réinstallation du programme à l'aide du gestionnaire de packages seront suffisantes. Vous ne pourrez pas supprimer le fichier sous Linux une fois qu'il a été corrompu.

Comment puis-je éviter cela à l'avenir?

Ne manipulez jamais aucun fichier du lxssrépertoire à partir de Windows. Au lieu:

  • Si vous avez un fichier auquel vous souhaitez accéder depuis Windows et Linux, stockez-le en dehors du lxssrépertoire, n'importe où ailleurs sur votre système Windows. Vous pouvez ouvrir des fichiers Windows à partir de Linux en utilisant l' interopérabilité DrvFS automatique : le /mnt/crépertoire contient tous les fichiers de votre lecteur C: et ils peuvent être lus et écrits à partir de Linux.

  • À partir de la version 1903 de Windows (mars 2019), WSL inclut un serveur de fichiers spécial qui rend vos fichiers disponibles pour toutes les applications Windows. Si vous courez

    explorer.exe .
    

    puis l'Explorateur de fichiers s'ouvrira montrant le répertoire Linux actuel - vous pouvez copier des fichiers dans ou hors de cette fenêtre, ou les éditer avec n'importe quelle application. Le chemin du répertoire sera quelque chose comme \\wsl$\Ubuntu\var\www: la \\wsl$\partie envoie l'accès au fichier via un chemin alternatif sûr.

    Si vous en êtes capable, ce sera la meilleure voie à suivre (ou parfois le point ci-dessus). Pour les versions plus anciennes, lisez la suite.

  • S'il y a un fichier dont vous avez besoin à un endroit spécifique, comme un fichier de configuration, et que vous souhaitez le modifier à partir de Windows, vous pouvez créer un lien symbolique depuis Linux vers l'emplacement réel du fichier ou du répertoire:

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

    Cela fonctionnera tant que le fichier n'a pas besoin d'avoir d'autorisations ou d'attributs spécifiques sous Linux (comme le ferait un exécutable ou une clé SSH).

  • Alternativement, et peut-être mieux, modifiez vos fichiers Linux à l'aide d'un éditeur Linux dans le terminal. nano,, vimet emacssont tous facilement disponibles et fonctionnent bien sous WSL, bien qu'ils aient tous leurs bizarreries.

  • Si vous devez modifier un fichier avec un programme Windows, vous n'avez pas une version Windows récente et vous ne pouvez pas en faire un lien symbolique, faire une copie ailleurs pour le modifier et le recopier à partir de la /mnt/csuite, tout comme le corriger ci-dessus, ou utiliser le contrôle de version pour synchroniser vos modifications sur plusieurs emplacements.

D'après certaines expérimentations, le bloc-notes ordinaire semble conserver les attributs nécessaires, mais il ne comprend pas les fins de ligne Unix, vous risquez donc de corrompre le contenu vous-même, et je ne compterais pas sur ce comportement dans tous les cas. Comme il s'agit d'une opération explicitement non prise en charge et non documentée, il est peu probable qu'un éditeur Windows soit fiable.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.