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

10

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

Agora, sempre que eu ou um programa tentamos acessá-lo do Linux, eu recebo um erro "input / output error", ou o arquivo simplesmente desaparece completamente, embora eu possa ver que está definitivamente lá no File Explorer.

cat abc
cat: abc: Input/output error

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

    
por Michael Homer 02.12.2016 / 21:51

1 resposta

10

Por que isso aconteceu?

Como os sistemas de arquivos Unix convencionais funcionam de maneira diferente dos sistemas de arquivos do Windows, as lojas da WSL informações extras sobre propriedades específicas de arquivos 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 preservarão quando você editar 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 esperados, um erro é relatado, da mesma forma como aconteceria se um sistema de arquivos nativo estivesse corrompido. Se ele nunca vê os atributos em um arquivo, esse arquivo é tratado como inexistente e não aparece nas listagens de arquivos.

O conselho oficial da WSL é

DO NOT, under ANY circumstances, create and/or modify Linux files using Windows apps, tools, scripts, consoles, etc.

Creating/changing Linux files from Windows will likely result in data corruption and/or damage your Linux environment requiring you to uninstall & reinstall your distro!

por este motivo (mas maior, e mais vermelho, e com mais sublinhados). "Arquivos Linux" significa qualquer coisa dentro do seu diretório lxss . Você pode modificar arquivos regulares do Windows de dentro do Linux por meio do /mnt/c/... DrvFS sistema de arquivos , mas não o inverso.

O que posso fazer para corrigir isso?

Se você já editou um arquivo e agora não consegue 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 no diretório AppData\Local\lxss no qual o arquivo está usando o Gerenciador de arquivos e mova o arquivo para outro local da sua unidade, como sua área de trabalho.
  2. Reinicie o WSL depois disso para limpar o cache interno, o que você pode fazer apenas fechando todos os seus terminais e abrindo um novo. Se você tiver processos em segundo plano do servidor em execução, também precisará pará-los.
  3. No Linux novamente, acesse o local original do arquivo corrompido. Ele não será exibido agora se você tiver removido o arquivo com sucesso. Execute ls para verificar.
  4. Verifique o arquivo do qual você saiu: execute

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

    para ver o conteúdo original do arquivo.

  5. Se tudo funcionou até agora, agora você pode copiar o arquivo de volta para o lugar esperado:

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

    O comando cp 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 de ter sido corrompido.

Como posso evitar isso no futuro?

Nunca manipule arquivos no diretório lxss do Windows. Em vez disso:

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

  • Se houver um arquivo que você precisa estar em um lugar específico, como um arquivo de configuração, e desejar editá-lo no Windows, você pode criar um link simbólico de dentro 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 nenhuma permissão ou atributo específico no Linux (como faria um executável ou uma chave SSH).

  • Como alternativa, e talvez melhor, edite seus arquivos do Linux usando um editor do Linux dentro do terminal. nano , vim e emacs estão prontamente disponíveis e funcionam bem na WSL, embora todos tenham suas peculiaridades.

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

A partir de algumas experiências, o Bloco de Notas comum parece preservar os atributos necessários, mas não compreende as terminações de linha do Unix, portanto é provável que você corrompa o conteúdo por conta própria, 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.

    
por 02.12.2016 / 21:51