etsuxのブログ

自分がハマったことなどを記録しています。

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 個     : 利用可能アロケーション ユニット