NTFSシステムファイルのトラブル解決方法

最終更新日

NTFSシステムファイルのトラブル

Windows NT 3.1以降は、NTFSでフォーマットされたパーティションを使用しています。NTFSシステムファイルに問題が発生すると、ファイルの読み書きやWindowsの動作に悪影響を及ぼします。

$で始まるファイル(フォルダー)と.(dot)ファイルが、NTFSシステムファイルです。エクスプローラでは表示できません。リソースモニターのディスク タブやチェックディスクのコマンド結果に表示されることがあります。

参照: NTFSシステムファイル 一覧 (NTFS 3.1)

NTFSシステムファイルだけの問題であれば、パーティションをフォーマットすれば解決するでしょう。フォーマットすると、システムファイルが初期化されます。ただし、volume(パーティション)内のファイルが消えます。

Data用パーティション(Non-System volume)の場合

  1. バックアップをとる。
  2. パーティションをフォーマットする。
  3. リストアする。(バックアップからファイルをコピー)

Windowsパーティション(System volume)の場合

  • 正常時のシステムイメージ バックアップから復元
  • それでもだめなら、Windowsのクリーンインストール (再セットアップ)

もちろん、NTFSシステムファイルの問題を解決する手段も用意されています。

  1. チェックディスクでNTFSシステムファイルを修復
    chkdsk /f

  2. 不良セクタ判定のやり直し
    chkdsk /b
  3. 不要になったセキュリティ記述子データの消去
    chkdsk /sdcleanup
  4. ファイルのメタデータの最適化
    fsutil file queryOptimizeMetadata
  5. MFTとMFT Zone

  6. $LogFileファイルサイズの変更
    chkdsk /L
  7. $Extend配下のファイルの操作

    1. $Extend配下の各ファイルについて
    2. $UsnJrnl

    3. $TxfLog

    4. その他のシステムファイルのリセットは、Live Linux環境で行う

チェックディスクでNTFSシステムファイルを修復
chkdsk /f

トラブル

  • NTFSシステムファイルの一般的なエラー
  • Windowsの原因不明なエラー・不調

解決方法

  1. コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動する。
  2. chkdsk /f <Drive Letter>:


    chkdsk /f C:

    動作: オフラインにて、NTFSシステムファイルのエラー修復、不良セクタのチェック

    対象: NTFS/FAT/FAT32/exFAT volume

  3. 「このボリュームを強制的にマウントを解除しますか? (Y/N)」と表示された場合 → y

    「次回のシステム再起動時に、このボリュームのチェックをスケジュールしますか (Y/N)?」と表示された場合 → y (要・PC再起動)

備考

オフラインで(Volumeをアンマウントしてから)行われます。Windowsパーティション等、他のプロセスが使用している場合はアンマウントできないため、次回PC再起動時の修復を予約します。

不良セクタが見つかった場合は、(ファイルシステムで)その部分を使わないように処理されます。

不良セクタが含まれるクラスタ情報を$BadClusファイルに書き込み、そのクラスタを$Bitmapファイルで「使用中」扱いにします。これにより、不良セクタ部分の使用が回避されます。(NTFSでは、セクタ単位ではなく、クラスタ単位で扱われます)

ただし、不良セクタが他の場所にも発生するかもしれません。もし不良セクタが見つかったら、ディスク上のデータのバックアップを最優先で行ってください。

おまけ

Windows不調時、とりあえず実行してみるコマンド 3点セット。
  • (Cドライブの) NTFSシステムファイルの修復

    chkdsk /f C:

  • Windowsコンポーネントストア(C:\Windows\WinSxS)の破損を修復。 [Windows8以降]

    Dism /Online /Cleanup-Image /RestoreHealth

  • Windowsシステムファイルの整合性をチェックし、(可能であれば)問題があるファイルを修復。

    sfc /scannow

Windows8以降は、chkdsk /f 以外の選択肢もある。

Windows8でchkdskコマンドオプションに /scan/spotfix 等が追加されました。

chkdsk /scanは、オンラインでスキャンし、オンラインで可能なものだけ修正します。オフラインでの修復が必要な時のみ、オフライン修復を要求されます。

chkdsk の刷新と新しい NTFS 正常性モデルの追加 - Building Windows 8
https://blogs.msdn.microsoft.com/b8_ja/2012/05/16/chkdsk-ntfs/

Chkdsk の動作について | Ask CORE
https://blogs.technet.microsoft.com/askcorejp/2017/12/25/about_chkdsk/

Windows8で追加されたCHKDSKコマンドオプション

  • /scan
  • /forceofflinefix
  • /perf
  • /spotfix
  • /sdcleanup
  • /offlinescanandfix

Windows10で追加されたCHKDSKコマンドオプション

  • /freeorphanedchains
  • /markclean

Win8、Win10で追加されたCHKDSKコマンドオプション

/scanを使う利点

メンテナンスでとりあえずチェックディスクをしてみる場合、chkdsk /fの代わりに、chkdsk /scanを実行してみましょう。

もしオフライン修復が必要なければ、ディスクのアンマウントあるいはWindowsの再起動をしないで済み、ハードウェアへ余計な負担が減ります。オフラインチェックディスクは必要な時だけ行えばいいのです。

まずは chkdsk /scan でオンラインスキャンとオンライン修復

  1. コマンドプロンプト[cmd.exe]を管理者として起動する。
  2. chkdsk /scan <Drive Letter>:


    chkdsk /scan C:

    これ以上の操作は必要ありません。」と表示されたら、ここで終了。

    オンラインで修復できないものがあった場合、"chkdsk /spotfix" または "chkdsk /f"を要求されることがあります。

「オフラインで修正する必要があります。」と表示された場合

  • "chkdsk /spotfix"を要求された時

    • chkdsk /spotfix <Drive Letter>:を実行する。
    • それでも直らなかったら、chkdsk /f <Drive Letter>:を実行する。
  • "chkdsk /fを要求された時

    chkdsk /f <Drive Letter>:を実行する。

/scan、/spotfix、/f、/OfflineScanAndFix の違い

chkdsk /scan
オンラインでスキャンし、オンラインで修復可能なものは修復する。
/forceofflinefixを追加すると、オンラインで修復できるものでも修復しないで、オフライン修復にまわす。
chkdsk /spotfixによるオフライン修復が必要なエラーは、$Corrupt *1に記録される。chkdsk /fによるオフライン修復が必要な場合は、$Corruptに記録しない。
対象 volume: NTFS
chkdsk /spotfix
$Corrupt *1に記録されたエラーの箇所を、オフラインで修復する。
事前にchkdsk /scanを行い、chkdsk /spotfixを要求された時だけ実行する。
対象 volume: NTFS
chkdsk /f、chkdsk /OfflineScanAndFix
オフラインでフルスキャンと修復を行う。
事前にchkdsk /scanを行う必要はないが、chkdsk /scanのコマンド結果でchkdsk /fを要求されることがある。
chkdsk /fchkdsk /OfflineScanAndFixの効果は同じらしい。(PowershellコマンドのRepair-Volume -OfflineScanAndFixが、chkdsk /fに相当)
対象 volume: NTFS/FAT/FAT32/exFAT

*1 $Corrupt

ログ名 $Corrupt: ボリューム内の(chkdsk /scanで)確認済みの破損
ログ名 $Verify: ボリューム内の未確認の破損

$Corruptに登録された破損レコードを照会するコマンド

fsutil repair enumerate <Drive Letter>: $Corrupt
($Corruptは省略可能)


fsutil repair enumerate C: $Corrupt
fsutil repair enumerate C:

$Verifyに登録された破損レコードを照会するコマンド

fsutil repair enumerate <Drive Letter>: $Verify


fsutil repair enumerate C: $Verify

fsutil repair enumerate コマンド結果

  • 何も登録されていない時

    破損レコードは見つかりませんでした。

  • chkdsk /spotfixで修復すべきものがある時

    fsutil repair enumerate コマンド結果

$Corruptと$Verifyは、$Extend\$RmMetadata\$Repairファイルのnamed streamです。

fsutil volume filelayout C:\$Extend\$RmMetadata\$Repair コマンド結果

fsutil volume filelayout C:\$Extend\$RmMetadata\$Repair コマンド結果

不良セクタ判定のやり直し
chkdsk /b

トラブル

  • ディスクのクローンをしたら、不良セクタ情報もコピーされた。

解決方法1

先に(CrystalDiskInfo等で)ディスクのS.M.A.R.T.情報を確認し、不良セクタがないことを確認しておいてください。

  1. コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動する。
  2. chkdsk /b <Drive Letter>:

    動作: $BadClusの不良クラスタ情報をクリアしてから、volume内の全クラスタを再スキャンします。$Bitmapも更新されます。(/rも暗黙的に指定される)

    対象: NTFS volume

  3. 「このボリュームを強制的にマウントを解除しますか? (Y/N)」と表示された場合 → y

    「次回のシステム再起動時に、このボリュームのチェックをスケジュールしますか (Y/N)?」と表示された場合 → y (要・PC再起動)

chkdsk /b の注意点

chkdsk /rの動作を含むため、ディスクに負担がかかります。

  • Volume容量が多いほど時間がかかる。(特にHDD。発熱にも注意)
  • 本当に不良セクタがvolume内にある場合は、余計にディスクの状態を悪化させる可能性がある。

外付けHDD(USB2.0)の100GB volumeで約40分でした。[USB 2.0のため、転送速度は最大でも30数MB/秒]

解決方法2

Volumeをフォーマットすれば、不良セクタ情報を初期化することができます。(過去のチェックディスクによる不良セクタ情報は、NTFSシステムファイルに記録されているため) ただし、volume内のデータも消えます。

備考

上記の方法で初期化や再判定できるのは、ファイルシステムによって検出された不良セクタ情報です。S.M.A.R.T.情報(ディスク搭載の機能によるもの)は変更されません。

不要になったセキュリティ記述子データの消去
chkdsk /sdcleanup

トラブル

  • $Secureの肥大化が原因で、新規ファイルを作成できない。
  • アクセス可能なはずなのにファイル(ファイル情報)にアクセスできない。

解決方法

  1. コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動する。
    • Windows8以降

      chkdsk /sdcleanup <Drive Letter>:


      chkdsk /sdcleanup C:

      動作: セキュリティ記述子データ(security descriptor data)のガベージコレクト、および、NTFSシステムファイルの修復 (/fも暗黙的に指定される)

      対象: NTFS volume

    • Windows7以前

      chkdsk /f <Drive Letter>:


      chkdsk /f C:

  2. 「このボリュームを強制的にマウントを解除しますか? (Y/N)」と表示された場合 → y

    「次回のシステム再起動時に、このボリュームのチェックをスケジュールしますか (Y/N)?」と表示された場合 → y (要・PC再起動)

備考

/sdcleanup: Windows8以降。
/fで代用可能。
(Windows8以降は、/sdcleanupでしっかりチェックするほうがよいでしょう)

参照

  • NTFS ボリューム上で新規ファイルが作成できない現象について
    https://blogs.technet.microsoft.com/askcorejp/2010/04/25/ntfs-1/

    $Secureファイルに格納されているセキュリティ記述子データ(security descriptor data)は不要になっても残ったままになるため、格納できる上限に達したことが問題の原因だそうです。

  • https://blogs.technet.microsoft.com/askcore/2009/10/16/the-four-stages-of-ntfs-file-growth/

    NTFSシステムファイルが肥大化・断片化する過程が説明されています。

ファイルのメタデータの最適化
fsutil file queryOptimizeMetadata

トラブル

  • 特定のファイル・フォルダーのメタデータが肥大化・断片化している。

解決方法

(Windows 10)

コマンドプロンプト[cmd.exe]を管理者として起動し、次のコマンドを実行します。

ファイルのメタデータの状態を照会
fsutil file queryOptimizeMetadata <File Path>


fsutil file queryOptimizeMetadata C:\$MFT

ファイルのメタデータの最適化
fsutil file OptimizeMetadata /a <File Path>


fsutil file OptimizeMetadata /a C:\$MFT

動作: ファイルのメタデータの最適化(圧縮)

対象: NTFS volume

/a : 最適化の前後にファイル メタデータを分析

<File Path>の例

C:\largefragmentedfile.txt
C:\$MFT
C:\$Secure:$SDS
C:\$Extend\$UsnJrnl:$J:$DATA
C:\$Extend\$RmMetadata\$TxfLog\$TxfLog.blf
C:\

備考

fsutil file OptimizeMetadata コマンドは、メタデータ(ファイルについての情報)を最適化します。ファイルの実体は最適化しません。また、このコマンドはWindows8.1以前には実装されていません。

MFTとMFT Zone

MFT(サイズ) ≠ MFT Zone(サイズ)

MFTサイズ
MFTサイズは、$MFTのサイズです。$MFTはNTFSシステムファイルの内の1つです。$MFT以外のNTFSシステムファイルのサイズは、MFTサイズに含まれません。
MFT($MFT)にはVolume内の全ファイル・フォルダー・メタデータのメタデータが記録されています。Volume内のファイル等の総数が増えれば、$MFTファイルに登録されるレコード数が増え、MFTサイズも増えます。
MFTサイズは減りません。(ファイルを削除すればそのメタデータのために使用されていたわずかな領域は解放されますが、MFTサイズが圧縮されることはありません)
MFT Zone
MFT用の排他的な予約領域(MFT Zone、MFT Zone Reservation)です。MFTを連続した領域に配置するために、MFT領域の隣に配置されます。MFTのサイズが大きくなったら、段々とMFT Zoneも使われます。
MFT Zoneを全部使っても足りなくなったら、他の空き領域も使い始めます。その場合、連続性は保証されず、飛び地になってしまう(断片化する)可能性があります。過度に断片化すると、パフォーマンスが低下します。

MFT Zoneの拡張

目的

  • MFTの断片化予防

現在のMFT Zone サイズを調べる。
fsutil behavior query mftzone

コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動し、コマンドを実行します。

fsutil behavior query mftzone

MFT Zone サイズの変更
fsutil behavior set mftzone

コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動し、コマンドを実行します。

fsutil behavior set mftzone <数字>


fsutil behavior set mftzone 2

コマンド実行後、次のレジストリキーに反映されます。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
NtfsMFTZoneReservation (REG_DWORD)

実際に適用されるのは、PC再起動後です。

mftzone設定の<数字>について

<数字>の範囲は、1–4 または 1–100。 Windowsバージョンによって、設定可能な数字と対応するサイズが異なります。

[1–4]

[1–100] …Windows8.1(?)以降 *2

1   (200 MB) デフォルト
2   (400 MB)
3   (600 MB)
4   (800 MB)

5   (1000 MB)
︙
100 (20000 MB)

上記サイズは、volumeが1.5GBより大きい場合。1.5GB以下のvolumeの場合は、200MBより小さい倍数が適用されます。

Windowsバージョンによってはデフォルト値が0になっていることがあります。サイズは1と同じです。

*2 最近のWindowsバージョンでは[1–100]です。(fsutil behavior setコマンドで調べることができます)

  • Windows7–Windows7 SP1: [1–4]
  • Windows8: 未確認
  • Windows8.1–Windows10: [1–100]
  • Windows Server: 未確認

参照

https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/fsutil-behavior

Windows NT 4.0 Service Pack 4以降
Windows 2000–Windows Vista
Windows 2003–Windows Server 2008

[1–4]

1   (Volumeの12.5%) デフォルト
2   (Volumeの25%)
3   (Volumeの37.5%)
4   (Volumeの50%)

参照

https://support.microsoft.com/ja-jp/help/174619/

同じコマンドを使用しても、Windows7以降とVista以前とでは全く違う結果になります。

fsutil behavior set mftzone 2
Windows7 以降の場合 MFT Zone: 400MB
Windows Vista以前の場合 MFT Zone: volumeの25%

fsutil behavior set mftzone 4
Windows7 以降の場合 MFT Zone: 800MB
Windows Vista以前の場合 MFT Zone: volumeの50%

fsutil behavior set mftzone 5
Windows8.1 以降の場合 MFT Zone: 1GB

現在のMFTサイズを調べる Windowsコマンド

MFTサイズの増え方を調べるのに使っています。

MFTサイズの調べ方

コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動、次のいずれかのコマンドを実行し、指定の項目(太字)を探してください。

  • defrag /a /v <Drive Letter>:

    MFT サイズ」(単位: MB)

    (Windows XP以降)

  • fsutil volume filelayout <Drive Letter>:\$MFT

    ストリーム$DATA」欄の「サイズ」(単位: Byte [Decimal])

    (Windows7以降)

  • fsutil fsinfo ntfsinfo <Drive Letter>:

    MFT の有効なデータ長」(MFT Valid Data Length) (単位: Byte [Hex])

    (Windows7以降)

1048576 (= 10242 = 1048576)で割ります。Hex(16進数)を表す0xが数字の先頭についていれば、Decimal(10進数)に変換されます。

  • Byte (Decimal) → MB (Decimal)

    set /a <Bytes(Decimal)>/1024/1024
    または、
    powershell <Bytes(Decimal)>/1024/1024

  • Byte (Hex) → MB (Decimal)

    set /a <Bytes(Hex)>/1024/1024
    または、
    powershell <Bytes(Hex)>/1024/1024

C:\$MFT サイズの推移 (私のメインPCの場合)

毎月のWindows Update後は必ず増えます。

2019/07/30 240MB
2019/08/20 260MB (MFTレコード数 266239)
2019/09/11 276MB (MFTレコード数 283135)

(Windows10 1809 Home 64bit、2019年5月にクリーンインストール、ソフトウェア少な目、データファイルは別volume)

参照

https://superuser.com/questions/1185582/simplest-way-to-view-master-file-table-mft-size-in-windows-7

$LogFileファイルサイズの変更
chkdsk /L

トラブル

  • ファイル操作の多いvolumeで、$LogFileに十分な期間のログが記録されていない場合

    解決方法
    $LogFileサイズを大きくする。

  • (HDDの場合) $LogFileがひどく断片化しているが、$LogFileをデフラグできない。

    解決方法

    1. $LogFileサイズを小さくする。

      最小サイズ: 2048KB (Volumeのデフォルトサイズが65536KBの場合)

    2. デフラグ (空きスペースも統合)

      $LogFile自体をデフラグできなくても構わない。

    3. $LogFileを元のサイズに戻す。
    参照
    https://superuser.com/questions/800992/defrag-ntfs-logfile

$LogFileサイズの変更方法

コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動し、次のコマンドを実行します。

現在の $LogFile ファイルサイズの照会
chkdsk /L <Drive Letter>:


chkdsk /L C:

$LogFile ファイルサイズの変更
chkdsk /L:<数字 (KB)> <Drive Letter>:

例: Cドライブの$LogFileファイルサイズを128 MB (131072 KB)に変更

chkdsk /L:131072 C:

$LogFileについて

$LogFileの役割

$LogFileファイルには、ファイルのメタデータの変更が記録されます。1レコードごとに、logical sequence numberという番号が振られています。

クラッシュや停電によりファイルの不整合が発生した時は、$LogFile等の記録を元に自動的にロールバックされます。また、セキュリティ インシデント等による不正な変更があった場合、$LogFileの解析が必要になるかもしれません。

$LogFileのサイズ

$LogFileのファイルサイズは一定です。デフォルトサイズは65536KB(64MB)。Volumeサイズが極端に小さい場合は、それに合わせて$LogFileのデフォルトサイズも小さくなります。

古いレコードは新しいレコードで上書きされます。そのため、頻繁にファイル操作が行われる環境では、ログを保持できる期間が短くなります。

$Extend配下のファイルの操作

$Extend$Deleted
  ├ $ObjId
  ├ $Quota
  ├ $Reparse
  ├ $UsnJrnl$RmMetadata
       ├ $Repair
       ├ $Txf
       │  └ (ファイル名 数字20桁)
       └ $TxfLog$Tops$TxfLog.blf$TxfLogContainer00000000000000000001$TxfLogContainer00000000000000000002

$Extend配下のファイルの破損・断片化には、ファイルのリセット(削除→再作成による初期化)が効果的です。

Windows上からリセット可能なもの (上図の太字)

  • $UsnJrnlファイル
  • $TxfLogフォルダー配下の4ファイル

これらは読み書きの頻度が高く、破損・断片化しやすいものでもあります。

Volumeによっては、USN journalやTxf機能の無効化が可能です。

$Extend配下の各ファイルについて

  • $ObjId

    ファイルのObjectIDが登録されている。(ObjectIDはすべてのファイルに付与されるわけではない) Distributed Link Tracking(分散リンクトラッキング)に使用される。

    コマンド: fsutil ObjectID

  • $Quota

    Disk quota情報

    コマンド: fsutil quota

    GUIでQuota設定を確認: エクスプローラー → パーティションを右クリック → プロパティ → クォータ タブ → [クォータ設定の表示]

  • $Reparse

    Reparse point(再解析ポイント)情報 (Symbolic link / Junction / Hard link)

    コマンド: fsutil reparsePoint (fsutil hardlink も?)

  • $UsnJrnl

    USN Jounral (Volume内のファイルに加えられた変更のログ)

    コマンド: fsutil usn

  • $Repair

    NTFS volumeの自動修復関連

    コマンド: fsutil repair

  • $Txf、$TxfLog

    NTFS トランザクションとそれを利用するアプリケーションに使用される。

    コマンド: fsutil resource 、fsutil transaction

関連する機能の管理は、fsutil コマンドで行うことができます。

Fsutil | Microsoft Docs
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/fsutil

注意: 一部、古いWindowsでは使えないコマンドがあります。

$UsnJrnl

$UsnJrnl
USN journal (USN change journal)
= Update Sequence Number Journal
Volume内のファイルにどのような変更を行ったかが記録されている。1レコードごとにUSNという番号が振られている。

$UsnJrnl内容 サンプル

$UsnJrnl内容 サンプル

$UsnJrnlの内容をファイルに出力するコマンド

fsutil usn readJournal <Drive Letter>: > <出力先ファイルパス>.txt

[CSV形式]
fsutil usn readJournal <Drive Letter>: csv > <出力先ファイルパス>.csv

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/fsutil-usn より

  • $UsnJrnlの削除中
    無効ではない。アクティブでもない。
  • $UsnJrnlが無効の間($UsnJrnlの削除後、再作成前)
    すべてのジャーナル操作はエラーを返す。
  • $UsnJrnlを使用するもの

    • インデックスサービス
    • File Replication Service (FRS)
    • Remote Installation Services (RIS)
    • リモートストレージ

    これらが動作中の環境では、$UsnJrnlの削除や無効化をすると悪影響が出る場合がある。

注記: Windowsのファイル履歴(File History。Windows8以降)も$UsnJrnlを利用している模様。

USNジャーナル解析の追求
Japan Security Analyst Conference 2018
株式会社サイバーディフェンス研究所 山崎 輝 氏
https://www.jpcert.or.jp/present/2018/JSAC2018_03_yamazaki.pdf

PDFファイル内を「USNジャーナルのサイズ」で検索してください。

$UsnJrnlファイルのリセット
fsutil usn deleteJournal and createJournal

対象: Windows XP以降

UsnJrnlファイルのリセットで直る可能性のあるトラブル

  • $UsnJrnlの断片化によって、デフラグができない。
  • Windowsのスタートボタンの反応等、全ての動作が遅い。

UsnJrnlファイルをリセットする方法

  1. コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動する。
  2. USN journalの状態を照会

    fsutil usn queryJournal <Drive Letter>:


    fsutil usn queryJournal C:

  3. USN journalを削除する。

    fsutil usn deleteJournal /d <Drive Letter>:


    fsutil usn deleteJournal /d C:

  4. 数十秒後、USN journalを照会。

    fsutil usn queryJournal <Drive Letter>:

    USN Journalのデータが表示されていれば、自動的に再作成されている。

  5. [USN Journalが自動的に再作成されない場合のみ]

    USN journalを自分で作成する。

    fsutil usn createJournal m=<max size> a=<Allocation Delta> <Drive Letter>:

    m: Maximum Size (最大サイズ)
    a: Allocation Delta (割り当て差分)
    (手順2で表示された数字を参照)


    fsutil usn createJournal m=0x2000000 a=0x800000 C:

    Windows XP~10の場合は、m=0x2000000 a=0x800000 であることが多い。

    Windows10では、mとaは省略可能。(現在のボリューム サイズに基づいて既定のサイズが設定される)

ファイル数が多いVolumeは、削除に数分かかるかもしれません。deleteJournalコマンドは、$UsnJrnlファイルの削除と、$MFTの全レコードに含まれるUSN属性を0にしているみたいです。

エラー表示について

エラー: ボリューム変更ジャーナルを削除しています。

$UsnJrnl 削除中。

エラー: ボリューム変更ジャーナルは、アクティブではありません。

$UsnJrnl 削除済。USN journal無効。

$UsnJrnlファイルのサイズ変更
fsutil usn createjournal

対象: Windows XP以降

$UsnJrnlファイルサイズを大きくする。
  1. コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動する。
  2. CドライブのUSN journalの状態を照会。

    fsutil usn queryJournal <Drive Letter>:

  3. USN journalを作成コマンドを使用し、サイズを変更する。

    fsutil usn createJournal m=<max size> a=<Allocation Delta> <Drive Letter>:

    m(最大サイズ)を、手順2で確認した数字より大きくする。

  4. USN journalの状態を照会。

    fsutil usn queryJournal <Drive Letter>:

    最大サイズと割り当て差分の数字を確認する。

$UsnJrnlファイルサイズを小さくする。

サイズを縮小するには、いったん$UsnJrnlを削除する必要があります。

  1. コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動する。
  2. CドライブのUSN journalの状態を照会。

    fsutil usn queryJournal <Drive Letter>:

  3. USN journalを削除する。

    fsutil usn deleteJournal /d <Drive Letter>:

  4. すぐにUSN journalを作成する。(自動的に再作成されないうちに)

    fsutil usn createJournal m=<max size> a=<Allocation Delta> <Drive Letter>:

    m(最大サイズ)を、手順2で確認した数字より小さくする。

  5. USN journalの状態を照会。

    fsutil usn queryJournal <Drive Letter>:

    最大サイズと割り当て差分の数字を確認する。

USN journalの無効化
fsutil usn deleteJournal

対象: Windows XP以降

USN journalを無効化できる条件

  • System volumeではない。
  • そのvolumeの$UsnJrnlを使用するアプリケーションが存在しない。

無効化すると、環境によっては問題や不都合が生じるかもしれません。ご自分で判断してください。

USN journalを無効化する方法

$UsnJrnlを削除し、再作成しないでおきます。

自動的に$UsnJrnlが再作成される場合は、Windows用パーティションであったり、何らかのアプリケーションが$UsnJrnlを使っています。その場合、無効化はできません。

  1. コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動する。
  2. USN journalを削除する。

    fsutil usn deleteJournal /d <Drive Letter>:

  3. USN journalの状態を照会。

    fsutil usn queryJournal <Drive Letter>:

    エラー: ボリューム変更ジャーナルは、アクティブではありません。」と表示されれば、USN journalが無効になっている。

USN journalを有効に戻す方法

$UsnJrnlを作成します。

  1. コマンドプロンプト[cmd.exe]を(Vista以降は管理者として)起動する。
  2. USN journalを作成する。

    fsutil usn createJournal m=<max size> a=<Allocation Delta> <Drive Letter>:

  3. USN journalの状態を照会。

    fsutil usn queryJournal <Drive Letter>:

    情報が表示されることを確認する。

$TxfLog

$TxfLogはトランザクションログです。トランザクションリソースマネージャーに管理されています。

$TxfLogのリセット
fsutil resource setAutoReset true

対象: Windows Vista以降

$TxfLogのリセットで直る可能性のあるトラブル

  • $TxfLogの断片化によって、デフラグができない。
  • 「ハードウェアの安全な取り外し」ができない。
  • Windows Updateに失敗する。(エラーコード 0x8007000B 等)
  • BSOD(ブルースクリーン) 0x0000C1F5 で、Windowsを起動できない。
  • 警告ログ Event ID 134、136、137 (ntfs) 「トランザクション リソース マネージャーでエラーが発生」が記録され続ける。

$TxfLogのリセット方法

高速スタートアップ(Windows8以降)を有効にしている場合は、無効にしておいてください。

  1. コマンドプロンプト[cmd.exe]を管理者として起動する。
  2. $TxfLogリセットの予約 (次回のPC再起動時にリセットされる)

    fsutil resource setAutoReset true <Drive Letter>:\


    fsutil resource setAutoReset true C:\

  3. PCを再起動する。

    [外付けディスクの場合]
    アンマウント(ハードウェアの安全な取り外し)が可能な状態ならば、アンマウントしてから再接続するだけでもよい。

fsutil resource setAutoReset コマンドエラー

エラー: 指定されたディレクトリにはリソース マネージャーが含まれていません。
エラー: 指定されたファイルが見つかりません。
<Drive Letter>:の後の\(バックスラッシュ、日本語フォントでは円マーク)が抜けています。

○ fsutil resource setAutoReset true C:\

× fsutil resource setAutoReset true C:

エラー: この要求はサポートされていません。
そのVolumeのTxfが無効のため、リソースマネージャーが動作していません。(デフォルトは有効)

Txfの有効/無効を確認するコマンド

fsutil behavior query DisableTxf <Drive Letter>:

$TxfLogのリセットを取り消す。
fsutil resource setAutoReset false
  1. コマンドプロンプト[cmd.exe]を管理者として起動する。
  2. $TxfLogリセット予約を取り消す。

    fsutil resource setAutoReset false <Drive Letter>:\


    fsutil resource setAutoReset false C:\

  3. トランザクションリソースマネージャー情報の表示

    fsutil resource info <Drive Letter>:\


    fsutil resource info C:\

    コマンド結果の最終行に「注意: この RM は、次回の起動時にそのメタデータをリセットします。」が表示されていないことを確認する。表示されている場合は、$TxfLogリセットの予約が解けていない。

fsutil resource setAutoReset true 実行後もトランザクション エラー ログが記録される場合

再起動1回目直後は、Event ID 136 (ntfs) 警告ログが記録されます。それは「fsutil resource setAutoReset true」コマンドが実行され、$TxfLogフォルダー配下のファイルが削除された影響です。通常、その直後にファイルが新規作成されます。

2回目の再起動で表示されなくなっていれば、問題ありません。

それ以降もEvent ID 134、136、137 (ntfs)の警告ログが記録される場合

  1. オフラインチェックディスク(chkdsk /f)を実行する。
  2. それでも直らない時は、Linux Liveメディアでブート → $RmMetadataフォルダー(または$Extendフォルダー内全部)を削除 → オフラインチェックディスク
fsutil resource setAutoReset コマンドを使用できるOS
  • Windows Vista以降
  • Windows Server 2008 R2以降
  • WinPE 10.0
  • Windows10 インストールメディア

Windows Serverのインストールメディアについては未確認。

実際にリセットされるのは、volumeの再マウント時であることに留意してください。

fsutil resource setAutoReset true でリセットされるファイル
  • $Extend\$RmMetadata\$TxfLog\$Tops
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf
  • $Extend\$RmMetadata\$TxfLog\$TxfLogContainer00000000000000000001
  • $Extend\$RmMetadata\$TxfLog\$TxfLogContainer00000000000000000002

その他、$Extend\$RmMetadata\$TxfLogフォルダーの更新日が変更されます。

トランザクション エラーはvolumeサイズが10MB未満の場合にも発生

https://social.msdn.microsoft.com/Forums/officeapps/ja-JP/68a77c80-63d2-49e8-820b-d8846ac69bdf/1245212505125311248812398ntfs12456125211254065288id1376528912395

Event ID 137 (ntfs)が記録されたけれど、NTFS Volumeサイズを8MB→10MBに増やしたら直ったそうです。(なお、NTFS Volumeの最小サイズは8MB)

原因

https://social.msdn.microsoft.com/Forums/en-US/4ad62c76-3e70-46b3-b2bd-e8754f7e4079/how-to-romove-transaction-data-of-txf-in-the-folder-extend-65311

Once the volume size is down to 10 MB TxF won't create the log at all and ceases to function.

10MB未満の場合はTxfLogが作成されず、Txfが機能しなくなる、とのことです。

他の$TxfLog修復方法
Windows7のインストールメディアでブート

試したことがないため効果は不明ですが、紹介しておきます。

How to work around Stop Error 0x0000C1F5 on a Windows Vista-based computer
https://support.microsoft.com/en-us/help/970101/

修復方法は、Windows7 (beta以降)のインストールメディアでブートするだけ。(Windows8以降のインストールメディアは?)

自己修復コードが含まれており、ブートするだけで破損した「$Txf RM Log」ファイルを修復できるそうです。

Txfの無効化
fsutil behavior set DisableTxf <Drive Letter>: 1

注意: Txfを使用している環境では、無効化すると問題が発生する可能性があります。

Microsoftの資料*3には、WindowsパーティションのTxf無効化はお勧めしないと書かれています。

*3 https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/fsutil-behavior

[追記]

NTFS volumeでは、Txfはデフォルトで有効です。

Windows10では、パーティションをNTFS形式でフォーマットする際に、formatコマンドに/Txf:disabled オプションを付けて実行すると、最初からTxfを無効にしておくことができます。(Windows8.1以前には/Txf オプションがありません)

Txfを無効化する。

  1. コマンドプロンプト[cmd.exe]を管理者として起動する。
  2. Txfの無効化

    fsutil behavior set DisableTxf <Drive Letter>: 1


    fsutil behavior set DisableTxf C: 1

VolumeのTxf機能は無効化されますが、$RmMetadata配下のフォルダー・ファイルは消去されません。

Txfを有効に戻す。

  1. コマンドプロンプト[cmd.exe]を管理者として起動する。
  2. Txfの有効化

    fsutil behavior set DisableTxf <Drive Letter>: 0


    fsutil behavior set DisableTxf C: 0

その他のシステムファイルのリセットは、Live Linux環境で行う

(正常時のバックアップがあれば、まずそちらを復元してみることをお勧めします)

Linuxから$Extendの中身を削除することができます。削除した後は、Windows(WinPE等も可)でチェックディスク(chkdsk /f、Windows8以降はchkdsk /scanでもok)をしましょう。(Linuxのntfsfixコマンドでは不十分です)

詳細は次回にて。

関連記事