Perché è successo?
Poiché i filesystem Unix convenzionali funzionano in modo diverso rispetto ai filesystem di Windows, WSL memorizza ulteriori informazioni sulle proprietà dei file specifiche di Linux negli attributi estesi dei file di Windows utilizzati per rappresentarli. I normali programmi Windows non conoscono questi attributi e non li preserveranno quando si modifica il file. Informazioni importanti sul file vengono perse quando ciò accade.
Quando WSL tenta di leggere un file e non riesce a trovare gli attributi che si aspetta, viene segnalato un errore, proprio come quello che accadrebbe se un filesystem nativo fosse corrotto. Se in primo luogo non vede mai gli attributi su un file, quel file viene trattato come inesistente e non verrà mostrato negli elenchi dei file.
Il consiglio ufficiale WSL è
NON, in QUALSIASI circostanza , creare e / o modificare file Linux usando app, strumenti, script, console di Windows, ecc.
La creazione / modifica di file Linux da Windows comporterà probabilmente la corruzione dei dati e / o il danneggiamento dell'ambiente Linux che richiede la disinstallazione e la reinstallazione della distribuzione!
per questo motivo (ma più grande, più rosso e con più sottolineature). "File Linux" indica qualsiasi cosa all'interno della tua lxss
directory. Puoi modificare i normali file Windows da Linux tramite il /mnt/c/...
filesystem DrvFS , ma non viceversa.
Tuttavia, il Windows 10 versione 1903 introduce un nuovo meccanismo che non permette i file da modificare in modo sicuro da Windows fino a quando si va su di esso nel modo giusto. Ciò non aiuta a risolvere il problema dei file già danneggiati, ma può evitarlo in futuro.
Cosa posso fare per risolverlo?
Se hai già modificato un file e ora non puoi accedervi, è ancora possibile leggere i contenuti da Windows stesso e ripristinare il file in quel modo.
Per farlo, dovrai:
- Torna alla posizione all'interno della
AppData\Local\lxss
directory in cui si trova il file utilizzando Esplora file e sposta il file in un'altra posizione sul disco rigido, come il desktop.
- Riavvia WSL successivamente per cancellare la sua cache interna, cosa che puoi fare semplicemente chiudendo tutti i tuoi terminali e aprendone uno nuovo. Se sono in esecuzione processi del server in background, sarà necessario arrestarli.
- Di nuovo in Linux, vai nella posizione originale del file danneggiato. Ora non verrà più visualizzato se il file è stato rimosso correttamente. Corri
ls
per controllare.
Controlla il file che hai spostato: esegui
cat /mnt/c/Users/.../Desktop/abc
per vedere il contenuto originale del file.
Se tutto ha funzionato finora, ora puoi copiare quel file nel punto in cui ti aspettavi che fosse:
cp /mnt/c/Users/.../Desktop/abc ~/alphabet/abc
Il cp
comando farà in modo che WSL ripristini gli attributi nascosti necessari sul file.
Queste istruzioni funzioneranno per i normali file di dati, ma se si tratta di un file di sistema operativo importante, potrebbe essere necessario reinstallare completamente . Per molti programmi non critici, sarà sufficiente eliminare il file danneggiato da Windows e reinstallare il programma utilizzando il gestore pacchetti. Non sarai in grado di eliminare il file da Linux una volta che è stato danneggiato.
Come posso evitarlo in futuro?
Non manipolare mai alcun file all'interno della lxss
directory da Windows. Anziché:
Se si dispone di un file a cui si desidera accedere sia da Windows che da Linux, archiviarlo all'esterno della lxss
directory, in qualsiasi altro punto del proprio sistema Windows. Puoi aprire i file Windows da Linux usando l' interoperabilità DrvFS automatica : la /mnt/c
directory contiene tutti i file dal tuo disco C: e possono essere letti e scritti da Linux.
A partire dalla versione 1903 di Windows (marzo 2019), WSL include un file server speciale che rende i file disponibili per tutte le applicazioni Windows. Se corri
explorer.exe .
quindi File Explorer si aprirà mostrando l'attuale directory di Linux: puoi copiare i file dentro o fuori da quella finestra o modificarli con qualsiasi applicazione. Il percorso della directory sarà simile al seguente \\wsl$\Ubuntu\var\www
: la \\wsl$\
parte invia l'accesso ai file tramite un percorso alternativo, sicuro.
Se sei in grado, questo sarà il miglior percorso in avanti (o talvolta il punto sopra). Per versioni precedenti, continua a leggere.
Se c'è un file che devi trovare in un posto specifico, come un file di configurazione, e vuoi modificarlo da Windows, puoi creare un collegamento simbolico dall'interno di Linux alla posizione reale del file o della directory:
ln -s /mnt/c/.../abc ~/.config/xyz/abc
Funzionerà a condizione che il file non abbia bisogno di autorizzazioni o attributi specifici in Linux (come farebbe un eseguibile o una chiave SSH).
In alternativa, e forse meglio, modifica i tuoi file Linux usando un editor Linux all'interno del terminale. nano
, vim
e emacs
sono tutti prontamente disponibili e funzionano bene con WSL, anche se tutti hanno le loro stranezze.
Se devi modificare un file con un programma Windows, non hai una versione Windows abbastanza recente e non puoi renderlo un collegamento simbolico, crearne una copia altrove per modificarlo e copiarlo da lì in /mnt/c
poi, proprio come il correggere sopra o utilizzare il controllo versione per sincronizzare le modifiche in più posizioni.
Da un po 'di sperimentazione, il normale Blocco note sembra preservare gli attributi necessari, ma non capisce le terminazioni di linea Unix, quindi è probabile che tu possa corrompere i contenuti da solo, e non farei affidamento su quel comportamento in ogni caso. Poiché si tratta di un'operazione esplicitamente non supportata e non documentata, è improbabile che qualsiasi editor basato su Windows sia affidabile.