変更ジャーナルの作成、変更、削除

管理者は、変更履歴を作成、削除、再作成できます。 管理者は、現在の更新シーケンス番号 (USN) の値が、USN_JOURNAL_DATA構造体の MaxUsn メンバーによって示される最大 USN 値に近づくと、ジャーナルを削除する必要があります。 管理者は、ディスク領域を再利用するために変更ジャーナルを削除して再作成することもできます。 これと他のすべてのプログラム以外の変更ジャーナル操作を実行するには、システム管理者特権が必要です。 つまり、Administrators グループのメンバーである必要があります。

指定したボリュームの変更ジャーナルをプログラムで作成または変更するには、 FSCTL_CREATE_USN_JOURNAL 制御コードを使用します。

新しい変更ジャーナルを作成したり、既存の変更ジャーナルを変更したりすると、NTFS ファイル・システムはその変更ジャーナルの情報を CREATE_USN_JOURNAL_DATA 構造の情報から設定します。 この情報は、FSCTL_CREATE_USN_JOURNAL 入力として受け取ります。 CREATE_USN_JOURNAL_DATA には、 MaximumSizeAllocationDelta のメンバーが含まれます。

MaximumSize は、変更ジャーナルのターゲットの最大サイズ (バイト単位) です。 変更ジャーナルはこの値より大きくなる可能性がありますが、NTFS ファイル システムのチェックポイントでは、NTFS ファイル システムによってジャーナルが検査され、サイズが MaximumSize の値と AllocationDelta の値を超えたときにトリミングされます。 (NTFS ファイル システム チェックポイントでは、オペレーティング システムは NTFS ファイル システムのログ ファイルにレコードを書き込みます。これにより、NTFS ファイル システムはエラーから回復するために必要な処理を判断できます)。

AllocationDelta は、メモリが割り当てまたは割り当て解除されるたびに、最後に追加され、変更ジャーナルの先頭から削除されたバイト数です。 つまり、割り当てと割り当ての解除は、このサイズの単位で行われます。 クラスター サイズの整数倍数は、このメンバーにとって妥当な値です。

管理者が既存の変更ジャーナルを変更して MaximumSize 値を大きくした場合 (たとえば、ボリュームの再インデックスが頻繁に行われている場合など)、変更ジャーナルは新しい最大サイズを超えるまで新しいエントリを受け取るだけです。

変更履歴を削除するには、 FSCTL_DELETE_USN_JOURNAL コントロール コードを使用します。 この操作を使用すると、ボリューム上のすべてのファイルを順を見て、各ファイルの USN が 0 にリセットされます。 その後、操作によって既存の変更履歴が削除されます。 この操作は、システムの再起動が完了するまで持続します。 このプロセス中に変更ジャーナルを読み取り、作成、または変更しようとすると、エラー コード ERROR_JOURNAL_DELETE_IN_PROGRESSで失敗します。

FSCTL_DELETE_USN_JOURNALコントロール コードを使用して、他のプロセスによって開始された削除が進行中かどうかを判断することもできます。 たとえば、アプリケーションの起動時に、削除が進行中かどうかを判断できます。 ジャーナルの削除はシステムの再起動間で保持されるため、システムの再起動時に開始されたサービスとアプリケーションは、継続的な削除のためにチェックする必要があります。

変更履歴は、起動時に必ずしも作成されるとは限りません。 変更履歴を作成するには、管理者が明示的に行うか、変更履歴を必要とする別のサービスを開始できます。