なぜこれが起こるのですか?

なぜこれが起こるのですか?

私はそれを使用していますWindowsのUbuntuでBashまたは他のLinuxディストリビューションLinux用WindowsサブシステムlxssWindowsエディタを使用してディレクトリのLinuxファイルを編集しました。

これで、私またはプログラムがLinuxでそのファイルにアクセスしようとするたびに、「入力/出力エラー」エラーが発生したり、ファイルエクスプローラにそのファイルが確実に存在することがわかりますが、ファイルは完全に消えます。

cat abc
cat: abc: Input/output error

なぜこれが起こるのですか?問題を解決するにはどうすればよいですか?今後どのようにこのようなことを避けることができますか?

ベストアンサー1

なぜこれが起こるのですか?

既存のUnixファイルシステムはWindowsファイルシステムとは異なる動作をするため、WSL拡張属性にLinux固有のファイル属性に関する追加情報を保存します。これを示すために使用されるWindowsファイルの数。通常のWindowsプログラムはこれらのプロパティを認識せず、ファイルを編集してもそのプロパティを保持しません。これが発生すると、ファイルに関する重要な情報が失われます。

WSLがファイルを読み取ろうとしたが必要な属性が見つからない場合は、デフォルトのファイルシステムが破損した場合と同様にエラーが報告されます。最初にファイルのプロパティが表示されない場合、そのファイルは存在しないかのように処理され、ファイルのリストには表示されません。

これWSL公式アドバイスはい

欲しくない、とにかく、Windowsアプリケーション、ツール、スクリプト、コンソールなどを使用してLinuxファイルを作成および/または変更します。

WindowsでLinuxファイルを作成/変更すると、データの破損やLinux環境が破損する可能性があるため、ディストリビューションを削除して再インストールする必要があります。

これは理由です(ただし、より大きく、より赤く、下線が多い)。 「Linuxファイル」とは、lxssディレクトリ内のすべてを意味します。次のコマンドを使用して、Linux内で一般的なWindowsファイルを変更できます。/mnt/c/...DrvFSファイルシステムしかし、その逆ではありません。

ただし、1903 バージョンの Windows 10 には新しいメカニズムが導入されました。するWindowsでファイルを安全に編集できるようにする正しい方法で行う限り。これは破損したファイルの問題を解決するのに役立ちませんが、今後このような状況を防ぐことができます。

問題を解決するにはどうすればよいですか?

ファイルを編集したが今はアクセスできない場合でも、Windows自体から内容を読み取ってその方法でファイルを回復できます。

これを行うには、次のものが必要です。

  1. AppData\Local\lxssファイルエクスプローラを使用してディレクトリのファイルの場所に戻り、デスクトップなどのドライブの他の場所にファイルを移動します。
  2. 内部キャッシュを消去するには後でWSLを再起動し、それを行うにはすべての端末を閉じて新しい端末を開きます。バックグラウンドサーバープロセスが実行されている場合は、そのプロセスも停止する必要があります。
  3. Linuxでは、破損したファイルの元の場所に戻ります。ファイルを正常に移動した場合は、まったく表示されません。実行してls確認してください。
  4. 移動したファイルの確認:実行

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

    ファイルの元の内容を表示します。

  5. これまですべてが順調に進んだ場合は、ファイルを目的の場所にコピーすることができます。

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

    このcpコマンドを使用すると、WSLはファイルから必要な隠し属性を復元します。

このガイドラインは通常のデータファイルに適用されますが、重要なオペレーティングシステムファイルの場合は、完全に再インストールする必要があります。。重要でないプログラムの多くは、Windowsから破損したファイルを削除し、パッケージマネージャを使用してプログラムを再インストールするだけで十分です。ファイルが破損すると、Linux内から削除できません。

今後どのようにこのようなことを避けることができますか?

lxssWindowsでは、このディレクトリのファイルを操作しないでください。代わりに:

  • WindowsおよびLinuxでファイルにアクセスするには、そのファイルを保存してください。外部ディレクトリlxssまたはWindowsシステムの他の場所。次のコマンドを使用して、LinuxでWindowsファイルを開くことができます。自動DrvFS相互運用性:この/mnt/cディレクトリにはC:ドライブ上のすべてのファイルが含まれており、Linuxで読み書きできます。

  • Windowsバージョン1903以降(2019年3月)、WSLファイルを使用できるようにする特別なファイルサーバーが含まれていますすべてのWindowsアプリケーションに適用されます。走れば

    explorer.exe .
    

    これでファイルエクスプローラが開き、現在のLinuxディレクトリが表示されます。このウィンドウでファイルをコピーしたり、アプリケーションを使用して編集したりできます。ディレクトリパスは次のとおりです\\wsl$\Ubuntu\var\www。この\\wsl$\セクションでは、代替セキュリティパスを介してファイルアクセスを送信します。

    あなたに能力があればこれが今後進む最善の方法だろう(または時には上記の内容の一部)。以前のバージョンの場合は、読んでください。

  • 特定の場所(設定ファイルなど)にファイルを保存する必要があり、Windowsで編集したい場合は、Linux内でファイルまたはディレクトリの実際の場所へのシンボリックリンクを作成できます。

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

    ファイルがLinuxに特定の権限または属性(実行可能ファイルやSSHキーなど)を要求しない限り、この方法を使用できます。

  • あるいは、より良い方法は、ターミナルでLinuxエディタを使用してLinuxファイルを編集することです。、、、およびすべて独自の機能がありますが、すべて簡単に使用でき、WSLでうまく機能しますnanovimemacs

  • Windowsプログラムを使用してファイルを編集する必要があり、Windowsの最新バージョンがなく、シンボリックリンクに設定できない場合は、別の場所にコピーを作成して編集してから再コピーすると/mnt/c問題が解決します。上記の問題を解決するか、バージョン管理を使用して複数の場所で編集内容を同期します。

いくつかの実験では、通常のメモ帳は必要な属性を保持しますが、Unix行の終わりを理解していないため、ユーザーが直接作業を損なう可能性があるため、どのような場合でもこの動作に依存しない可能性があります。これは明示的にサポートされていない文書化されていない操作なので、Windowsベースのエディタは信頼できません。

おすすめ記事