Bash on Windows上のファイルをうっかりWindows側でいじってしまったときの対処

Windows10 になってから Linux サブシステムが搭載され、Windows 上で Bash on Ubuntu が動かせるようになりました。Windows 上で仮想環境ではない生の Linux 環境と Bash シェルが使えるようになってとっても嬉しいですね。
この Bash on Ubuntu on Windows を利用する上での注意点として Linux サブシステム上のファイルを Windows 側のアプリからいじってはいけない というものがあります。Linux 側のファイルのメタデータ情報は NTFS の拡張属性に保存していますが、Windows 側のアプリケーションでこのファイルを操作すると拡張属性に入っている情報を消してしまう可能性があるためです。
ですが、先日実際にそれをやらかしてしまい、ファイルシステムがおかしくなってしまって焦りました。何とか復帰できたので備忘録的にまとめておきました。

まず Bash on Ubuntu 上でファイルを作ってみます。 f:id:aoe-tk:20170921235906p:plain

このファイルをうっかり Windows 側のツールで開いて修正、保存しちゃいます。 f:id:aoe-tk:20170921235924p:plain f:id:aoe-tk:20170921235943p:plain

これをもう一度 Bash 側で見てみます。 f:id:aoe-tk:20170922000003p:plain

あれ、タイムスタンプもファイルサイズも変わっていない (ファイルが消えてしまう場合もあります) 。 Ubuntu 上の Vim で開いてみると Windows 側で追加した文字列が反映されていません。 f:id:aoe-tk:20170922000123p:plain

しかも書き換えようとしても保存に失敗します! f:id:aoe-tk:20170922000142p:plain

じゃあファイルを消して作り直そうと思ったら、ファイルを消したはずなのに「入力/出力エラーです」と出て、消したはずのファイルを作ることもできません! f:id:aoe-tk:20170922000206p:plain

実際にこの現象が起きたときはかなり焦りました。以下に対処方を示していきますね。

Windows の Explorer でファイルの状態を確認します。ただし、Linux サブシステムのファイルは「保護されたオペレーティングシステムファイル」に当たるため、デフォルトでは Explorer から見えないようになっています。Explorer の設定を変更し、「保護されたオペレーティングシステムファイルを表示しない」のチェックを外します。 f:id:aoe-tk:20170922000234p:plain

Linux サブシステムのファイルシステム%LOCALAPPDATA%\lxss 以下にあります。 f:id:aoe-tk:20170922000249p:plain

Explorer で問題となったファイルのあるパスを確認すると、消したはずのファイルが残っていることが分かります。これを Explorer 上で削除します。 f:id:aoe-tk:20170922000304p:plain

これで再び Ubuntu 上でファイルを作成できるようになります。やれやれ。 f:id:aoe-tk:20170922000334p:plain

復旧したら Explorer の設定は元に戻しておきましょう。またうっかり触ってしまわないように。

とまあこんな感じで直すことができました。このように色々おかしなことになるので、Windows 側のアプリから Linux サブシステム上のファイルをいじってしまわないように注意しましょう (逆は問題ありません) 。もうちょっと何とかならないかなあ。