fsutilコマンドを使うと、数GBや数TBといったサイズの巨大なファイルを非常に簡単に、素早く作成できる。こうして作成したファイルを使うと、ディスク上の領域を強制的に確保したり、ディスクやネットワークの性能測定などに利用したりできる。

 

巨大なファイルを使ってディスクやネットワークの速度を測定する

 ディスクやネットワークなどの性能(速度)がどのくらい出ているかを手っ取り早く調べるには、ある程度大きなデータファイルを用意しておいて、その読み書き速度や送受信速度を調べると簡単だ。厳密なベンチマークツールがなくても、ファイルをコピーさせながら、その速度をパフォーマンスモニターで見たり、完了するまでの時間を測定したりするだけでも大まかな速度は分かるだろう。

ファイルのコピーによる読み書き速度の測定
大きなファイルをコピーさせ、そのときのパフォーマンスモニターの値などを確認すれば、ディスクやネットワークなどの速度を簡単に調べることができる。

 

これを行うには、数十~数百GB以上のサイズのテストファイルが必要になるが、そのためには「fsutil.exe」というコマンドがとても便利だ。これはWindows OSのコマンドプロンプト上で利用できるCUIのツールである。fsutilには数多くのサブコマンド(オプション)があるが、その中に「指定されたサイズのファイルを作成する」という非常に単純な機能のサブコマンドがある。使い方は次の通りである。

 

fsutil file createnew <ファイル名> <サイズ>

<ファイル名>:作成したいファイルの名前。すでに同名のファイルやフォルダが存在しているとエラーなので、必要ならあらかじめ削除しておくこと
<サイズ>:作成するファイルのサイズ。10進数か、0xで始まる16進数形式で指定する。指定可能な最大サイズは対象となるファイルシステムや空き領域サイズによる

 

このコマンドでは、指定された名前のファイルを、指定されたサイズで作成する。例えば100GBちょうど(100×1024×1024×1024=107,374,182,400=0x1900000000)のファイル「testfile」を作成するには、次のようにする。

※10進数指定の場合
fsutil file createnew testfile 107374182400

※16進数指定の場合
fsutil file createnew testfile 0x1900000000

 実際に実行すると、次のようになる

fsutilで空のファイルを作成する
fsutil file createnewコマンドを使うと、ボリュームいっぱいになるような大きなファイルでも非常に簡単に素早く作成できる。これはWindows 10上での実行例。Windows OSのバージョンによって、fsutilで利用できるサブコマンドは少しずつ異なる。

 

このコマンドを実行する場合、基本的には管理者権限は不要である(Windows 7など、一部のOSでは必要。その場合は管理者権限でコマンドプロンプトを起動して実行すること)。書き込みが許可されていて、ボリューム上に作成のための十分な空き領域があればファイルを作成できる。

 

このコマンドを使ってファイルを作成する場合、対象となるファイルがNTFSやReFSボリューム上ならば、どんなに大きなファイルでも、すぐに作成される。ボリュームの空き領域が少なかったり、非常に低速なマシンなどを使っていたりするとしばらく待たされることがあるが、それでもせいぜい数秒以内で作成される。

[注意]fsutilで作成されたファイルの内容はゼロデータのみ

 fsutilコマンドで作成されたファイルを読み出すと、全てゼロばかりが返ってくる。16進数でいうと、0x00というバイトデータばかりが詰まったファイルに見える。ゼロ以外の値を返すようにはできない。

 また、このファイルから読み出しを行っても、実際にディスクからゼロデータ(が含まれたブロック)を読み出してくることはない。ディスク上のブロックとしては確保されているが、その部分のデータは「無効(validではない)」という状態になっている。そのため、ディスクにアクセスすることなく、ゼロデータが直ちに返される(仕組みについては後述)。

 このような特性があるため読み出し速度の測定などに使う場合は注意が必要である。いったん別のファイルにコピーするか(こうすると実際にディスクに書き込まれ、以後は本当にディスクから読み出すことになる)、負荷なしでゼロデータを読み出せる特殊なファイルと割り切って、主に書き込みテストに利用するとよいだろう。なお、ネットワーク越しに読み出した場合はネットワーク部分がボトルネックになるので、実際にディスクから読み出しているかどうかは問題にはならないだろう。

作成した巨大なファイルの使い方

 このように、fsutilコマンドを使えば巨大なファイルを簡単に作成できるが、いったいそれが何の役に立つのか、とお考えかもしれない。いろいろな使い方があるが、例えば次のような利用が考えられる。

  • (テストなどで使うための)固定長のダミーデータファイルとして利用する
  • ディスク(ファイルシステム)の読み書き速度を測定する
  • ネットワーク(ファイル共有サービス)の送受信速度を測定する
  • ボリュームをわざと満杯(に近い状態)にして、ディスクフル時のシステムの挙動をテストする
  • なるべく連続したブロックにファイルが割り当てられるように、あらかじめファイル全体の領域を確保しておく

 このようなファイルを使って、実際にディスクやネットワークの速度を測定する方法などについては、今後別TIPSで紹介する。

[補足]fsutil file createnewで作成されるファイルの仕組み

 fsutil file createnewコマンドでは、ディスクにデータを書き込むことなくファイルを作成している。そのためファイルの作成はすぐに完了する。NTFSやReFSには、ファイルとして利用する領域(ディスク上のブロック)は確保するが、実際にはデータは書き込まないという機能があり、それを使っているのでファイルの作成はすぐに終わる。そしてデータを読み出そうとすると、実際にはディスクから読み出すことなく、ゼロデータが返される。

 だがいったんデータを書き込むと、次回からは実際にそのブロックから読み出すことになるので、読み出しのための時間がかかる。またスパースファイル(疎なファイル)と違って、実際にファイルデータのためのブロックは割り当てているので、ディスクの空き領域は作成されたファイルの分だけ減少する。

 このような挙動は、NTFSやReFSにおけるファイルとそのデータ用ブロックの割り当ての仕組みに基づいている。

 NTFSやReFSにおけるファイルには、「長さ(ファイルサイズ)」の他に、もう一つ「有効なデータ長(VDL:Valid Data Length)」という属性がある。ファイルの先頭から末尾EOFまでの距離がいわゆる「ファイルサイズ」であり、dirコマンドなどではこれがファイルサイズとして表示されている。

 VDLとは、ファイルに書き込まれているデータの実際のバイトサイズである。通常、この値はファイルサイズと一致しているが(EOFの直前がVDL)、fsutil file createnewコマンドでファイルを作成すると、VDLが0(=ファイルの先頭位置)になっている。そしてVDLからEOFまでの間のデータが要求されると、ゼロデータが返される。これが、ファイルがゼロデータばかりに見える理由である。

VDL情報の確認
fsutil file queryvaliddataコマンドを使うと、有効なデータ部分の長さの情報が得られる。fsutil file createnewで作成したファイルはVDLが0だが、コピーしたファイル(通常のファイル)のVDLは、ファイルサイズと一致している。

 FATファイルシステムにはこのような機能はないため、FATファイルシステムに対してfsutil file createnewコマンドを実行すると、実際に書き込みが完了するまで戻ってこない。またFATでは最大ファイルサイズが2GB(もしくは4GB)に制限されているので、その点にも注意していただきたい。