Editei um arquivo Linux com um programa Windows enquanto usava o Windows Subsystem para Linux e agora não consigo mais acessá-lo

12

Estou usando o Bash no Ubuntu no Windows ou outra distribuição Linux no Windows Subsystem para Linux e editei um arquivo Linux dentro do lxssdiretório com um editor do Windows.

Agora, sempre que eu ou um programa tenta acessá-lo no Linux, recebo o erro "erro de entrada / saída", ou o arquivo desaparece completamente, mesmo que eu possa ver que ele definitivamente existe no File Explorer.

cat abc
cat: abc: Input/output error

Por que isso aconteceu? O que posso fazer para corrigi-lo? Como posso evitá-lo no futuro?

Michael Homer
fonte

Respostas:

13

Por que isso aconteceu?

Como os sistemas de arquivos Unix convencionais funcionam de maneira diferente dos sistemas de arquivos do Windows, a WSL armazena informações extras sobre propriedades de arquivos específicas do Linux nos atributos estendidos dos arquivos do Windows usados ​​para representá-los. Os programas comuns do Windows não conhecem esses atributos e não os preservam quando você edita o arquivo. Informações importantes sobre o arquivo são perdidas quando isso acontece.

Quando o WSL tenta ler um arquivo e não consegue encontrar os atributos que espera, um erro é relatado, exatamente como o que aconteceria se um sistema de arquivos nativo fosse corrompido. Se ele nunca vir os atributos em um arquivo, esse arquivo será tratado como inexistente e não será exibido nas listagens de arquivos.

O conselho oficial da WSL é

NÃO, em nenhuma circunstância , crie e / ou modifique arquivos Linux usando aplicativos, ferramentas, scripts, consoles, etc.

Criar / alterar arquivos Linux do Windows provavelmente resultará em corrupção de dados e / ou danificará o ambiente Linux, exigindo que você desinstale e reinstale sua distribuição!

por esse motivo (mas maior, mais vermelho e com mais sublinhados). "Arquivos Linux" significa qualquer coisa dentro do seu lxssdiretório. Você pode modificar arquivos regulares do Windows a partir do Linux através do /mnt/c/...sistema de arquivos DrvFS , mas não o contrário.

No entanto, a versão 1903 do Windows 10 introduz um novo mecanismo que permite que os arquivos sejam editados com segurança no Windows , desde que você faça o procedimento da maneira correta. Isso não ajuda a corrigir o problema de arquivos já corrompidos, mas pode evitá-lo no futuro.

O que posso fazer para corrigi-lo?

Se você já editou um arquivo e agora não pode acessá-lo, ainda é possível ler o conteúdo do próprio Windows e restaurar o arquivo dessa maneira.

Para fazer isso, você precisará:

  1. Navegue de volta para o local dentro do AppData\Local\lxssdiretório em que o arquivo está usando o File Explorer e mova o arquivo para outro local da unidade, como a área de trabalho.
  2. Reinicie o WSL depois disso para limpar seu cache interno, o que você pode fazer fechando todos os seus terminais e abrindo um novo. Se você tiver processos de servidor em segundo plano em execução, também precisará interrompê-los.
  3. No Linux novamente, vá para o local original do arquivo corrompido. Agora não será exibido se você tiver movido o arquivo com êxito. Corra lspara verificar.
  4. Verifique o arquivo que você mudou: execute

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

    para ver o conteúdo original do arquivo.

  5. Se tudo funcionou até agora, você pode copiar esse arquivo de volta para o local que esperava:

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

    O cpcomando fará com que o WSL restaure os atributos ocultos necessários no arquivo.

Essas instruções funcionarão para arquivos de dados regulares, mas se for um arquivo importante do sistema operacional, talvez seja necessário reinstalar completamente . Para muitos programas não críticos, excluir o arquivo corrompido do Windows e reinstalar o programa usando o gerenciador de pacotes será suficiente. Você não poderá excluir o arquivo de dentro do Linux depois que ele estiver corrompido.

Como posso evitar isso no futuro?

Nunca manipule nenhum arquivo dentro do lxssdiretório do Windows. Em vez de:

  • Se você tiver um arquivo que deseja acessar no Windows e Linux, armazene-o fora do lxssdiretório, em qualquer outro lugar do sistema Windows. Você pode abrir arquivos do Windows no Linux usando a interoperabilidade automática do DrvFS : o /mnt/cdiretório contém todos os arquivos da sua unidade C: e eles podem ser lidos e gravados no Linux.

  • A partir da versão 1903 do Windows (março de 2019), o WSL inclui um servidor de arquivos especial que disponibiliza seus arquivos para todos os aplicativos Windows. Se você correr

    explorer.exe .
    

    o File Explorer será aberto mostrando o diretório atual do Linux - você pode copiar arquivos dentro ou fora dessa janela ou editá-los com qualquer aplicativo. O caminho do diretório será algo como \\wsl$\Ubuntu\var\www: a \\wsl$\parte envia acesso ao arquivo através de um caminho alternativo e seguro.

    Se você puder, esse será o melhor caminho a seguir (ou, às vezes, o ponto acima). Para versões mais antigas, continue lendo.

  • Se houver um arquivo em um local específico, como um arquivo de configuração, e você quiser editá-lo no Windows, é possível criar um link simbólico do Linux para o local real do arquivo ou diretório:

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

    Isso funcionará desde que o arquivo não precise ter permissões ou atributos específicos no Linux (como um executável ou uma chave SSH).

  • Como alternativa, e talvez melhor, edite seus arquivos Linux usando um editor Linux dentro do terminal. nano, vimE emacsestão prontamente disponíveis e trabalhar bem sob WSL, embora todos eles têm suas peculiaridades.

  • Se você precisar editar um arquivo com um programa do Windows, não possui uma versão recente do Windows e não pode torná-lo um link simbólico, faça uma cópia em outro lugar para editar e copiá-lo /mnt/cposteriormente, assim como o corrija acima ou use o controle de versão para sincronizar suas edições em vários locais.

De alguma experimentação, o Bloco de Notas comum parece preservar os atributos necessários, mas ele não entende as terminações de linha do Unix, portanto você provavelmente corromperá o conteúdo, e eu não confiaria nesse comportamento em nenhum caso. Como essa é uma operação explicitamente não suportada e não documentada, é improvável que qualquer editor baseado no Windows seja confiável.

Michael Homer
fonte