巨大なサイズのファイルを簡単に作る方法

連載目次

対象OS:Windows XP/Windows Vista/Windows 7/Windows Server 2003/Windows Server 2008/Windows Server 2008 R2


操作方法

 Windows XP以降のWindows OSには、コマンド・プロンプト上で利用できるツールとして、「fsutil.exe」というコマンドが用意されている。コマンドの概要については別稿の「Windows XPの正体 強化されたコマンドライン・ツール―2.ディスク/ファイル関連ツール」などを参照していただきたいが、主にファイル・システムに関するさまざまな操作ができるようになっている。

 fsutilにはサブコマンドがいくつか含まれているが、その中に「指定されたサイズのファイルを作成する」という非常に単純な機能のコマンドがある。使い方は次の通りである。

fsutil file createnew ファイル名 サイズ
ファイル名:作成したいファイルの名前。すでに同名のファイルやフォルダが存在しているとエラー。

サイズ:作成するファイルのサイズ。10進数で指定する。最大サイズは対象となるファイル・システムによる。



 このコマンドでは、指定された名前のファイルを、指定されたサイズで作成する。「サイズ」は10進数で指定するので、例えば10Gbytesちょうど(=10,737,418,240)のファイルtestfileを作成するには、次のようにする(このような計算には電卓アクセサリが便利である)。

C:¥>fsutil file createnew testfile 10737418240



 「ファイル名」には、ローカルのディスク上のファイルだけでなく、リモートのファイル・サーバ上のファイル名やUNCなども指定できる。

 作成されるファイルの中身は、すべてゼロで埋められている。16進数でいうと、0x00というバイト・データばかりが詰まったファイルとなる。ほかの値を指定することはできない。

 このコマンドを使ってファイルを作成する場合、対象となるファイルがNTFSボリューム上ならば、どんなに大きなファイルでも(現在のNTFSの実装では最大で約16Tbytesまで。連載「仮想PCで学ぶWindowsシステム管理」の「ファイルの最大サイズはいくつまで?」参照)、すぐに作成される。ただしディスク上の空き領域が少なかったり、非常に低速なマシンなどを使っていたりするとしばらく待たされることがあるが、それでもせいぜい数秒以内で作成されるようである。NTFSの場合には、ファイルのブロック(クラスタ)を予約するだけで、実際にファイル・データを書き込むわけではないからだ(次回読み出すときにはゼロ・データが返される。いったんデータを書き込めば、次回は実際にそのブロックを読み出すことになる)。ただしスパース・ファイルと違って、実際にファイル・データのためのブロックは割り当てているので、ディスクの空き領域は作成されたファイルの分だけ減少する。

 これに対して、FATファイル・システム上にファイルを作成した場合は、実際にディスクへの書き込みが発生する。リモートのファイル・サーバ上のファイル名を指定してfsutilを実行すると、すぐにコマンドの実行が完了するので、ファイルがすぐに作成されたように見えるかもしれないが、実際にはその要求はリモートのサーバ側でキャッシュされてから実行されている(遅延書き込みされている)。そのため、作成したファイルをすぐに利用しよう(読み出そう)としても、ファイルの作成(ゼロ・データの書き込み)が完全に完了するまでは、次の読み出しコマンドなどは待たされる。

 またFATファイル・システム上では、ファイル・サイズの最大値は4Gbytes未満に限定されているので、4Gbytes以上のファイルを作成することはできない(ファイル・サイズの制限については「TIPS:ファイル・システムの制限―2G/4GBytes超のファイルに注意」参照)。

●巨大なファイルの使い方

 このように、fsutilコマンドを使えば巨大なファイルを簡単に作成できるが、いったいそれが何の役に立つのか、とお考えかもしれない。いろいろな使い方があるのだが、代表的なものとしては、ファイル・システムやOS本体、ネットワークなどに対する負荷テストやパフォーマンス(転送速度)測定などが挙げられる。また変わったところでは、ディスク上の特定の領域を予約したり、後で利用するために一時的にディスク上の場所や領域を確保したりしておく(それらの領域を利用する直前にファイルを削除する)という用途もある。以下、いくつか簡単に紹介しておくが、これ以外の用途に使うのももちろん自由である。

■ディスク読み書き性能の測定
 最もよく使われると思われるのが、ディスクやファイル・システムなどの読み書き速度のテストだろう。巨大なファイルを1つ作成して、それをコピー・コマンドやエクスプローラのコピー機能を使って、さまざまな場所にコピーすることにより、ファイル・システムやディスク・システム、そしてそれを制御するシステム全体のパフォーマンス測定などが可能になる(ディスクとの転送速度だけでなく、CPUの使用率なども測定できる)。このような測定を行う場合は、なるべく大きなファイルを使わないと誤差が出るので(時間の測定誤差もあるし、OSのディスク・キャッシュに入りきるような小さなファイルでは、ディスクの実際のアクセス速度を正しく測定することはできない)、fsutilで素早く作成できる巨大なファイルは、テストには好都合である。また、一気に巨大なファイルが作成されるので、ファイルそのものに含まれるフラグメントも最小になり、測定誤差を低減させることができる。

 なお、コピーに要する時間を測定するにはストップウォッチで手動測定してもよいが、例えばコマンド・プロンプトに秒を表示させるようにしておけば(「prompt $p $t$g」を実行しておく)、コピーに要する時間を簡単に測定できるだろう。また分単位でよければ、次のようにすれば、コピーの前後の時間を表示させることができる。

C:¥>time /t && copy testfile testfile2 && time /t

※「time /t」は現在の「時:分」を表示させるコマンド、「&&」はコマンドの連続実行を表す。



注意:すでに述べたように、NTFS上にファイルを作成した場合は、実際にはディスクへのアクセスを行うことなくファイル(ゼロ・データ)を読み出すことに注意していただきたい。そのため、必要ならばいったん別のファイルをコピーしてから(これならば確実にディスクからの読み出しが行われる)、測定に使うとよい。


■ネットワークの負荷テスト/性能測定
 以上のようなファイルのコピーのテストを、ネットワーク越しに行えば、ネットワークのパフォーマンスをテストすることができる。ネットワーク帯域の消費の具合や、ファイル・サーバのCPU負荷、ディスクのI/O負荷などを調べることができるだろう。ローカル側のハードウェアの影響を受けないようにするには、例えば「copy remote-file nul」とすればよい。これならばネットワーク経由で読み出したファイルの内容は単純に捨てられるだけである(NULデバイスに書き込むことは、データを捨てるのと等価)。

 また巨大なファイルを(複数のマシンから)連続して読み出せば(ファイルとして読み出してもよいし、ftpなどで「get remote-file nul」としてもよい)、ネットワークを含むシステム全体の負荷テストにもなる。

■圧縮ボリュームの負荷テスト
 このコマンドを使って作成したファイルの中身は、すべてゼロ・データである。そのため、圧縮させると非常に小さなサイズにすることができる。NTFS上に作成したファイルを圧縮/解凍させてみれば(エクスプローラで「圧縮属性」を付け外ししてみるか、コマンド・プロンプト上でcompactコマンドを使う)、圧縮/解凍に要するCPU性能などの見積もりができるだろう。

 なお、圧縮ボリュームや圧縮フォルダ中に直接fsutilでファイルを作成しても、作成されたファイルは圧縮されない。fsutilで作成したファイルを圧縮するには、上で述べたような操作を行う必要がある。

■NTFSに変換するためのMFT領域の作成
 Windows OSでは、FAT32で作成されたボリュームをconvertコマンドを使ってNTFSボリュームに変換することができる。NTFSではMFT(Master File Table)という、一種のルートとなるインデックス領域が必要になるが(別稿の「NTFSではフラグメントは発生しにくい?―NTFS基礎のキソ」参照)、このMFTがフラグメントを起こしていると、NTFSのパフォーマンスを最大限に発揮することができない。

 最初からNTFSとして作成されたボリュームならMFTがフラグメントを起こす心配はないが、FAT32から変換したボリュームでは、場合によっては(空き領域が少ないと)フラグメントを起こす可能性がある。

 このような事態を避けるには、あらかじめfsutilでMFT用の領域を作っておき(適当な名前のファイルをルートに作成しておく)、convertコマンドの引数にそのファイル名を与える(「convert e: /fs:ntfs /cvtarea:tempfile」のようにする)。fsutilで作成されたファイルはフラグメントが最小限に抑えられているからだ。convertコマンドは、与えられたファイルをMFT用の領域として使用することができる。MFTとして必要なサイズはボリューム・サイズやファイル/フォルダの総数にもよるが、ボリューム・サイズの1割もあれば十分である。余分な部分はconvertが空き領域として解放してくれる。MFTのサイズの見積もり方や具体的な操作方法については、[スタート]メニューの[ヘルプとサポート]で「convertコマンド」を検索して、その解説を参照していただきたい。

■更新履歴

【2011/06/27】Windows XP以降のOSを対象OSに加え、記述を一部修正しました。

【2002/09/28】初版公開。


Windows TIPS

Copyright© 1999-2015 Digital Advantage Corp. All Rights Reserved.