ファイル システム制限により I/O 処理が失敗する事象について

Last Update: feedback 共有

本記事はマイクロソフト社員によって公開されております。

こんにちは、Windows サポートチームです。
本日はファイル システム制限により I/O 処理が失敗する事象について紹介させていただきます。

事象

新しいファイルの作成や既存ファイルへの書き込みを行った際に、以下のメッセージが表示され、当該操作や I/O 処理が失敗する場合があります。

// メッセージ内容

ファイル システム制限のため、要求された操作を完了できませんでした。

この問題の多くは、ATTRIBUTE LIST と呼ばれるファイル システムの管理領域が要因になります。
※ ATTRIBUTE LIST の詳細については後述いたします。

弊社では以下のような環境でお問合せをいただくことが多い状況です。

<Case1:ファイルサーバと利用しているボリュームに多くのセキュリティ設定をされている環境>

この環境では多くのセキュリティ設定がされているため、ファイル システムのセキュリティ設定を管理している $Secure の ATTRIBUTE LIST が上限値に達するケースです。

<Case2:1 ファイルのサイズが大きくなるファイルを利用している環境>

ファイルサイズが大きくなると、それに合わせてファイルの管理領域が拡張されます。これに伴い、ATTRIBUTE LIST も肥大化し、ATTRIBUTE LIST が上限値に達するケースです。

弊社へのお問合せにおいては、SQL Server のデータベースファイルがこのパターンとしてお問合せいただくことが多いです。
(データべースファイルが自動拡張に設定されている場合。)

原因

これは ATTRIBUTE LIST と呼ばれるファイル システムの管理領域の上限値を超えてしまったことを示すメッセージになります。ATTRIBUTE_LIST はファイルのデータがディスク上のどの位置に格納されているかなどの情報を保存しております。ファイルのデータ サイズが大きかったり、断片化が発生している場合に、ファイルの管理情報の拡張が繰り返され、この ATTRIBUTE_LIST の値が増加していきます。

詳細な ATTRIBUTE LIST の挙動につきましては、以下の公開情報を参照ください。

The Four Stages of NTFS File Growth
https://docs.microsoft.com/en-us/archive/blogs/askcore/the-four-stages-of-ntfs-file-growth

NTFS ファイルシステムでは各種ファイルを 1 KB のファイル レコードとして保存し、その中にファイル名 ($FILE_NAME) や実データ ($DATA) などの属性情報を格納します。
(上記公開情報の Stage 1)

ファイルのデータ サイズが肥大化し、この 1 KB のレコードに格納できない場合には、肥大化したデータ属性情報をファイル レコードとは別の領域へ格納し、マッピング情報のみ対象ファイル レコード内に保持します。
(上記公開情報の Stage 2)

また、さらにデータ サイズが肥大化して、このマッピング情報も1 KB の ファイル レコード内に保持できない場合には、子ファイル レコードとしてそれらの情報が保存され、ファイル レコードには子ファイル レコードを 管理するための属性 (ATTRIBUTE_LIST) 情報が追加されます。
(上記公開情報の Stage 3 および 4)

従いまして、データの増加や断片化によって子ファイル レコードが増加するのに比例して、ATRIBUTE_LIST 属性も増加することになり、この属性のサイズが上限値 (256KB) に達すると、データの書き込みが出来ない状態になります。

ATTRIBUTE_LIST のサイズについては以下の方法で確認が可能です。

<Windows Server 2012 R2 以前>

Windows Server 2012 R2 以前におきましては、明確に ATTRIBUTE_LIST のサイズを確認する方法はありません。代わりに以下の資料採取を行うことによって、ATTRIBUTE_LIST の数を確認することで、上限値のサイズに近いかどうかの判断をすることが可能です。

// 公開情報
ファイルシステムの制限に達してしまった事象の調査
https://jpwinsup.github.io/mslog/storage/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0/filesystem-limitation.html

<Windows Server 2016 以降>

fsutil コマンドを利用することによって、ATRIBUTE_LIST のサイズを確認することが可能です。

// $Secure の ATRIBUTE_LIST (属性リスト) のサイズを確認する場合

1
2
3
4
5
6
7
8
9
10
11
12
C:\WINDOWS\system32>fsutil file queryoptimizemetadata c:\$Secure:$SDS
ファイル メタデータの最適化 : なし
属性リスト サイズ : 464 (0x1d0) ☆
使用されているファイル メタデータ領域 : 1704 (0x6a8)
割り当てられたファイル メタデータ領域 : 6144 (0x1800)
ファイル メタデータ領域の使用率 : 27%
ファイル レコード数 : 6
常駐属性の数 : 6
非常駐属性の数 : 4
属性の合計数 : 10
アクティブなファイル メタデータ最適化の合計 : 0
保留中のファイル メタデータ最適化の合計 : 0

// 通常のファイルの ATRIBUTE_LIST (属性リスト) のサイズを確認する場合

1
2
3
4
5
6
7
8
9
10
11
12
C:\WINDOWS\system32>fsutil file queryoptimizemetadata C:\test.txt
ファイル メタデータの最適化 : なし
属性リスト サイズ : 0 (0) ☆
使用されているファイル メタデータ領域 : 736 (0x2e0)
割り当てられたファイル メタデータ領域 : 1024 (0x400)
ファイル メタデータ領域の使用率 : 71%
ファイル レコード数 : 1
常駐属性の数 : 6
非常駐属性の数 : 0
属性の合計数 : 6
アクティブなファイル メタデータ最適化の合計 : 0
保留中のファイル メタデータ最適化の合計 : 0

対処策

ATTRIBUTE_LIST の枯渇が生じた場合に最も効果的な対処策は、”/L” オプションを利用したボリュームの再フォーマットになります。再フォーマットを行ったボリューム上にデータをファイル レベルでコピーすることで、データが再配置されるため、ATTRIBUTE_LIST が枯渇している状況を解消することが可能です。

また、”/L” オプションを付与したフォーマットを実施することで、当該ボリュームのファイル レコードのサイズが、既定の 1 KB から 4KB へ変更されます。そのため、属性情報やマッピング情報が格納できる領域が 4 倍 (4 KB) へ拡張され、結果として、ATTRIBUTE_LIST が 256 KB の上限に達するリスクを緩和することが可能となります。

以下に手順をご案内いたしますので、ご確認いただきますようお願いいたします。

-—————-
- 手順
-—————-
1.事象の発生ドライブの代替となるドライブを用意します。

2.管理者権限のコマンド プロンプトから、用意した代替ドライブを “L” オプション付きでフォーマットします。

// 実行コマンド

1
Format <代替ドライブ> /FS:NTFS /L

// 実行例

1
Format G: /FS:NTFS /L

3.事象の発生ドライブ上のファイルを代替ドライブにファイル レベルでコピーします。

// Robocopy を利用する場合のサンプル コマンド

1
robocopy <事象の発生ドライブ> <代替ドライブ> /E /B /COPYALL /DCOPY:DAT /MIR /R:5 /W:10 /NP /V /XF "pagefile.sys" /XD "System Volume Information" "`$RECYCLE.BIN" "$RECYCLE.BIN" /LOG:<ログの出力先>

// 実行例

1
robocopy F:\ G:\ /E /B /COPYALL /DCOPY:DAT /MIR /R:5 /W:10 /NP /V /XF "pagefile.sys" /XD "System Volume Information" "`$RECYCLE.BIN" "$RECYCLE.BIN" /LOG:C:\Temp\RoboCopy.txt

※ 上記サンプルでは、F ドライブ内の各ファイル/フォルダーを、アクセス権や属性情報を含めて G ドライブにコピーしております。
     (コピーができないゴミ箱や pagefile などは除外しております。)

     Robocopy の各オプションの詳細は、下記の弊社公開情報に記載がございますので、必要に応じてご参照ください。

     - 弊社公開情報
     Title : robocopy
     URL : https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/robocopy

4.データの移行が完了後、必要に応じて、ファイル共有の再設定を行います。

※ ファイル共有設定は Robocopy で移行が行えないため、別途再設定が必要となります。

以上で作業は完了となります。

なお、代替となるドライブを用意せずに、事象の発生ドライブ内のデータを別の領域に一時的に退避し、フォーマット後に退避したデータから復旧、および、ファイル共有の再設定を行う方法でも問題ございません。
-———

いかがでしたでしょうか。本投稿が少しでも皆様のお役に立てば幸いです。
本情報の内容(添付文書、リンク先などを含む)は、作成日時でのものであり、予告なく変更される場合があります。