WSL (Windows Subsystem for Linux)でファイルが削除できなくなったとき(chkdskで修復)
WSL利用中にPCがダウンしたりして、ファイルシステムの管理情報が破損する場合がある。
ディレクトリごと削除しようとしても、削除できないファイルがあってrmコマンドが失敗する。
$ rm -rf test rm: cannot remove 'test/xxx': Directory not empty $ ls -alR test ls: reading directory 'test/xxx': Invalid argument
WSLのファイルシステムはlxfsで、WindowsのファイルシステムをLinux上で見えるようにエミュレートしているもの。
$ df -T Filesystem Type 1K-blocks Used Available Use% Mounted on rootfs lxfs 976760828 513985328 462775500 53% /
Windows側のNTFSのファイルシステムの管理情報が破損しているだけなので、Linux側ではなくWindows側での修復を行う。
Windows側の修復はchkdskコマンドで、WSLに割り当てているドライブを対象にチェックする。
なお、自分はDドライブにWSLを作成しているのでd:を対象にチェックした。標準のC:\Users配下だとこういうときにも面倒なので、Dドライブにしておいてよかった。
D:\>chkdsk d: /f ファイル システムの種類は NTFS です。 現在のドライブはロックできません。 ボリュームが別のプロセスによって使用されているため、Chkdsk を実行できません。Chkdsk を実行するにはこのボリュームのマウントを解除する必要 があります。 そのときは、このボリュームへのすべての開かれたハンドルは無効になります。 このボリュームを強制的にマウントを解除しますか? (Y/N) y ボリュームのマウントは解除されました。このボリュームへ開かれたすべてのハンドルは、現在無効です。 ボリューム ラベルは ボリューム です。 ステージ 1: 基本のファイル システム構造を検査しています ... ファイル 38B74 の壊れた属性一覧を切り捨てます。 ファイル 38B74 内の壊れた属性一覧エントリのうち、 タイプ コードが 80 であるエントリを削除しました。 壊れた属性レコード (0x80、"") を ファイル レコード セグメント 0x29539 から削除します。 : 壊れた属性レコード (0x80、"") を ファイル レコード セグメント 0x3C3BC から削除します。 380672 個のファイル レコードが処理されました。 ファイルの検査を完了しました。 孤立ファイル レコード セグメント 29539 を削除します。 : 孤立ファイル レコード セグメント 3C3CC を削除します。 1095 個の大きなファイル レコードが処理されました。 孤立ファイル レコード セグメント 3C3D0 を削除します。 0 個の問題のあるファイル レコードが処理されました。 ステージ 2: ファイル名リンケージを検査しています ... 4938 個の再解析レコードが処理されました。 433110 個のインデックス エントリが処理されました。 インデックスの検査を完了しました。 0 個のインデックスなしファイルがスキャンされました。 0 個のインデックスのないファイルが lost and found に回復されました。 4938 個の再解析レコードが処理されました。 ステージ 3: セキュリティ記述子を検査しています ... セキュリティ記述子の検査を完了しました。 データ属性をファイル 38B74 に挿入します。 26221 個のデータ ファイルが処理されました。 CHKDSK は Usn ジャーナルを確認しています... Usn ジャーナルの確認を完了しました。 CHKDSK はマスター ファイル テーブル (MFT) ビットマップに割り当て済みとして マークされている空き領域を検出しました。 CHKDSK はボリューム ビットマップに割り当て済みとしてマークされている空き領域を検出しました。 Windows でファイル システムが修正されました。 これ以上の操作は必要ありません。 976760831 KB : 全ディスク領域 513413896 KB : 145279 個のファイル 40672 KB : 26221 個のインデックス 0 KB : 不良セクター 476743 KB : システムで使用中 65536 KB : ログ ファイルが使用 462829520 KB : 使用可能領域 4096 バイト : アロケーション ユニット サイズ 244190207 個 : 全アロケーション ユニット 115707380 個 : 利用可能アロケーション ユニット