Linux用のWindowsサブシステムを使用しているときに、WindowsプログラムでLinuxファイルを編集しましたが、アクセスできなくなりました


12

Windows上のUbuntuまたはLinuxのWindowsサブシステム内の別のLinuxディストリビューションでBashを使用していて、lxssディレクトリ内のLinuxファイルをWindowsエディターで編集しました。

これで、私またはプログラムがLinuxからアクセスしようとすると、「入力/出力エラー」エラーが発生するか、ファイルエクスプローラーに確実に表示されているにもかかわらず、ファイルが完全に消えてしまいます。

cat abc
cat: abc: Input/output error

なぜこれが起こったのですか?どうすれば修正できますか?どうすれば将来的に回避できますか?

回答:


13

なぜこれが起こったのですか?

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

WSLがファイルを読み取ろうとしたときに、予期した属性が見つからなかった場合、ネイティブファイルシステムが破損した場合と同様に、エラーが報告されます。そもそもファイルの属性が表示されない場合、そのファイルは存在しないものとして扱われ、ファイルリストには表示されません。

WSL公式アドバイス

、NOT DO どのような状況の下で、Windowsアプリケーション、ツール、スクリプト、コンソールなどを使用して、Linuxのファイルを作成および/または変更

WindowsからLinuxファイルを作成/変更すると、データが破損したり、Linux環境が損傷したりして、ディストリビューションをアンインストールして再インストールする必要があります。

このため(ただし、より大きく、より赤くなり、より多くの下線が引かれます)。「Linuxファイル」とは、lxssディレクトリ内のあらゆるものを意味します。Linuxの内部から/mnt/c/...DrvFSファイルシステムを介して通常のWindowsファイルを変更できますが、その逆はできません。

ただし、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の両方からアクセスしたいファイルがある場合は、Windowsシステム上の他の場所のディレクトリのに保存lxssします。自動DrvFS相互運用性を使用して、LinuxからWindowsファイルを開くことができます。/mnt/cディレクトリには、C:ドライブからのすべてのファイルが含まれ、Linuxから読み取りおよび書き込みできます。

  • 1903 Windowsリリース(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ファイルを編集することをお勧めします。nanovimemacs彼らはすべて自分の癖を持っているものの、うまくWSLの下ですべて容易に入手可能であり、作業されています。

  • Windowsプログラムでファイルを編集する必要がある場合、最近の十分なバージョンのWindowsがなく、シンボリックリンクにすることはできません。他の場所にコピーを作成し、編集して/mnt/c後で元に戻すことができます。上記で修正するか、バージョン管理を使用して複数の場所で編集を同期します。

いくつかの実験から、通常のメモ帳は必要な属性を保持しているように見えますが、Unixの行末を理解していないため、自分で内容を破損する可能性が高く、どのような場合でもその動作に依存しません。これは明示的にサポートされておらず、文書化されていない操作であるため、Windowsベースのエディターが信頼できるとは考えられません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.