Edité un archivo de Linux con un programa de Windows mientras usaba el Subsistema de Windows para Linux, y ahora ya no puedo acceder a él.

12

Estoy usando Bash en Ubuntu en Windows u otra distribución de Linux dentro del Subsistema de Windows para Linux y he editado un archivo de Linux dentro del lxssdirectorio con un editor de Windows.

Ahora, cuando un programa o yo intentamos acceder a él desde Linux, aparece un error "error de entrada / salida", o el archivo simplemente desaparece por completo, aunque puedo ver que definitivamente está allí en el Explorador de archivos.

cat abc
cat: abc: Input/output error

¿Por qué ha sucedido esto? ¿Que puedo hacer para arreglarlo? ¿Cómo puedo evitarlo en el futuro?

Michael Homer
fuente

Respuestas:

13

¿Por qué ha sucedido esto?

Debido a que los sistemas de archivos Unix convencionales funcionan de manera diferente a los sistemas de archivos de Windows, WSL almacena información adicional sobre las propiedades específicas de los archivos de Linux en los atributos extendidos de los archivos de Windows utilizados para representarlos. Los programas ordinarios de Windows no conocen estos atributos y no los preservarán cuando edite el archivo. La información importante sobre el archivo se pierde cuando eso sucede.

Cuando WSL intenta leer un archivo y no puede encontrar los atributos que espera, se informa un error, al igual que lo que sucedería si un sistema de archivos nativo estuviera dañado. Si nunca ve los atributos en un archivo en primer lugar, ese archivo simplemente se trata como inexistente y no aparecerá en las listas de archivos.

El consejo oficial de WSL es

NO, bajo NINGUNA circunstancia , cree y / o modifique archivos Linux usando aplicaciones, herramientas, scripts, consolas, etc. de Windows.

¡La creación / cambio de archivos de Linux desde Windows probablemente dará como resultado la corrupción de datos y / o daños en su entorno de Linux, lo que requerirá que desinstale y vuelva a instalar su distribución!

por este motivo (pero más grande, más rojo y con más subrayados). "Archivos de Linux" significa cualquier cosa dentro de su lxssdirectorio. Puede modificar archivos regulares de Windows desde Linux a través del /mnt/c/...sistema de archivos DrvFS , pero no al revés.

Sin embargo, la versión de Windows 10 1903 introduce un nuevo mecanismo que no permiten que los archivos pueden editar de forma segura desde Windows , siempre y cuando usted va sobre él de la manera correcta. Eso no ayuda a solucionar el problema de los archivos ya dañados, pero puede evitarlo en el futuro.

¿Que puedo hacer para arreglarlo?

Si ya ha editado un archivo y ahora no puede acceder a él, aún es posible leer el contenido de Windows y restaurar el archivo de esa manera.

Para hacer eso, necesitarás:

  1. Vuelva a la ubicación dentro del AppData\Local\lxssdirectorio en el que se encuentra el archivo usando el Explorador de archivos y mueva el archivo a otro lugar de su unidad, como su escritorio.
  2. Reinicie WSL después de eso para borrar su caché interna, lo que puede hacer simplemente cerrando todos sus terminales y abriendo uno nuevo. Si tiene procesos de servidor en segundo plano en ejecución, también deberá detenerlos.
  3. Dentro de Linux nuevamente, vaya a la ubicación original del archivo dañado. No se mostrará en absoluto ahora si ha movido con éxito el archivo fuera del camino. Corre lspara verificar.
  4. Verifique el archivo que se mudó: ejecutar

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

    para ver el contenido original del archivo.

  5. Si todo ha funcionado hasta ahora, ahora puede copiar ese archivo nuevamente en el lugar que esperaba:

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

    El cpcomando hará que WSL restaure los atributos ocultos necesarios en el archivo.

Estas instrucciones funcionarán para archivos de datos regulares, pero si se trata de un archivo importante del sistema operativo, es posible que deba reinstalarlo por completo . Para muchos programas no críticos, será suficiente eliminar el archivo dañado de Windows y reinstalar el programa usando el administrador de paquetes. No podrá eliminar el archivo desde Linux una vez que se haya dañado.

¿Cómo puedo evitar esto en el futuro?

Nunca manipule ningún archivo dentro del lxssdirectorio desde Windows. En lugar:

  • Si tiene un archivo al que desea acceder desde Windows y Linux, guárdelo fuera del lxssdirectorio, en cualquier otro lugar de su sistema Windows. Puede abrir archivos de Windows desde Linux utilizando la interoperabilidad automática DrvFS : el /mnt/cdirectorio contiene todos los archivos de su unidad C: y pueden leerse y escribirse desde Linux.

  • A partir de la versión de Windows 1903 (marzo de 2019), WSL incluye un servidor de archivos especial que hace que sus archivos estén disponibles para todas las aplicaciones de Windows. Si tu corres

    explorer.exe .
    

    luego se abrirá el Explorador de archivos que muestra el directorio actual de Linux: puede copiar archivos dentro o fuera de esa ventana, o editarlos con cualquier aplicación. La ruta del directorio será algo así como \\wsl$\Ubuntu\var\www: la \\wsl$\parte envía acceso al archivo a través de una ruta alternativa segura.

    Si puede, este será el mejor camino hacia adelante (o, a veces, el punto anterior). Para versiones anteriores, sigue leyendo.

  • Si necesita un archivo en un lugar específico, como un archivo de configuración, y desea editarlo desde Windows, puede hacer un enlace simbólico desde Linux a la ubicación real del archivo o directorio:

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

    Esto funcionará siempre que el archivo no necesite tener permisos o atributos específicos en Linux (como lo haría un ejecutable o una clave SSH).

  • Alternativamente, y tal vez mejor, edite sus archivos de Linux usando un editor de Linux dentro del terminal. nano, vimy emacstodos están disponibles y funcionan bien bajo WSL, aunque todos tienen sus peculiaridades.

  • Si debe editar un archivo con un programa de Windows, no tiene una versión de Windows suficientemente reciente, y no puede convertirlo en un enlace simbólico, hacer una copia en otro lugar para editarlo y volver a copiarlo /mnt/cdespués, al igual que el solucione lo anterior, o use el control de versiones para sincronizar sus ediciones en múltiples ubicaciones.

Según algunos experimentos, el Bloc de notas común parece preservar los atributos necesarios, pero no comprende las terminaciones de línea de Unix, por lo que es probable que corrompa el contenido usted mismo, y no confiaría en ese comportamiento en ningún caso. Debido a que esta es una operación explícitamente no respaldada e indocumentada, es poco probable que cualquier editor basado en Windows sea confiable.

Michael Homer
fuente