現在 Windows 2000 Server のサーバを運用していますが、 C ドライブの空き容量が常時不足しています。
今まではその度に不要なファイルなどを D ドライブに移動するなどして対応してきましたが、それも限界に達しつつあります。
できれば再インストールは避けたいのですが、なにか方法はないでしょうか。
Windows NT までは、 「J052688:[NT]Windows NT ブートプロセスとハードディスクの制限」や、「J040242: [NT]セットアップ時作成されるブートパーティションは4GBまで」等に記載されているように、システムパーティションの容量がディスク先頭から最大 7.8GB まで、新規インストールの場合は 4 GBまでという制限があったため、この問題に対して根本的な解決を行なうことは事実上不可能でした。
Windows 2000 ではこの制限がなくなったため、可能であれば再インストールを行なって C ドライブを大容量のパーティション(注1)にすることを推奨します。
とはいえ、 Windows NT からのアップグレードを行なった場合や、既に長期間運用してしまっている場合など、簡単に再インストールを行なうことが困難な場合も多いと思います。 Windows 2000 のダイナミックディスクでは、動的なボリュームの拡張などもサポートされていますが、 OS が格納されているシステムパーティションとブートパーティションについては拡張することができませんので、この方法も利用できません。
しかし、こうした場合でも、 Windows 2000 に実装されている NTFS5 で実装された機能を利用することで、 Windows NT よりは柔軟に対応することが可能になっています。
従来の Windows NT で、ローカルディスクを利用するには、 C から Z のドライブ文字を割り当てた上で、その文字を利用してアクセスする必要がありましたが、 Windows 2000 では、ドライブ文字を割り当てる代わりに、特定のディレクトリにパーティションやボリュームを割り当てる(マウントする)ことが可能になっています。
例えば、ディスク構成が図1のようになっている場合、新規ディスクを E ドライブとしてアクセスする代わりに、 C:\MSSQL7 というフォルダとしてアクセスすることが可能です。
----- 図1: ディスク構成 +---+---+ +------------+ MOUNT前 | C | D | |新規Disk(E) | +---+---+ +------------+ +---+---+ +------------+ MOUNT後 | C | D | |C:\MSSQL7 | +---+---+ +------------+ -----
これを実現するのが MOUNTVOL コマンドや「コンピュータの管理」中の「ディスクの管理」スナップインです。図2と図3で各々 MOUNTVOL コマンドと「ディスクの管理」を利用して、現在 D:\ ドライブの CD-ROM ドライブを C:\CDROM というフォルダで参照できるようにした例を示します。
C:\>mountvol <== 最初にMOUNTVOLコマンドを実行して、ボリューム名の一覧を確認する ボリューム マウント ポイントの作成、削除、または一覧を表示します。 MOUNTVOL [ドライブ:]パス ボリューム名 MOUNTVOL [ドライブ:]パス /D MOUNTVOL [ドライブ:]パス /L パス マウント ポイントを常駐させる既存の NTFS ディレクトリ を指定します ボリューム名 マウント ポイントの対象となるボリューム名を指定しま す。 /D 指定されたディレクトリからボリューム マウント ポイント を削除します。 /L 指定されたディレクトリのマウントされているボリューム の一覧を表示します。 現在のマウント ポイントのボリューム名に対して取り得る値: <== ここからボリューム名の一覧 \\?\Volume{964f04b4-d4e9-11d3-ba7f-806d6172696f}\ C:\ \\?\Volume{4b881260-dad4-11d3-adcb-806d6172696f}\ D:\ \\?\Volume{72d10343-d4a1-11d3-bff9-806d6172696f}\ A:\ C:\>mkdir CDROM <== マウントするフォルダの作成 C:\>mountvol C:\CDROM \\?\Volume{4b881260-dad4-11d3-adcb-806d6172696f}\ <== Dドライブのマウント C:\>dir /w CDROM <== マウントされたDドライブの内容の確認。CD-ROMの内容が表示されている。 ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は 18F5-8ABB です C:\CDROM のディレクトリ [Acrobat] Autorun.inf [MVConv] [MVPlayer] ReadMe.txt [Tranavi] UserSupt.PDF Version.txt Welcome.pdf icon.ico [keitai] menu.exe [wav] 7 個のファイル 1,253,776 バイト 6 個のディレクトリ 0 バイトの空き領域 C:\>
図2: MOUNTVOLコマンドの実行例
図3: GUIでのボリュームのマウント
このように便利なマウント機能ですが、幾つか制限事項があります。まずマウント機能でマウントするフォルダは空である必要がありますので、上記の例で既に SQL Server 7.0 がインストールされている場合は、
といった処理が必要になります。ファイルやフォルダにアクセス権を付与している場合、単純にコピーを行なうとアクセス権が変更されてしまうため、一度バックアップを行なってからリストアするという動作も必要になります。
また、 Program Files フォルダのように通常何らかのプログラムによりロックされているフォルダは、名前の変更を行なうこと自体が困難なため、 Program Files 以下の各フォルダで名前変更が可能なものを個別に別パーティションにマウントするといった対応が必要となり、現実的には対応が困難です。
更に、マウントはパーティション単位でしか行なえないため、ディスクに新規パーティションを作成できない場合は、この方法を利用することはできません。
実は、標準のコマンドでは実現できないのですが、 NTFS5 では更に便利な機能が実現されています。 この機能を実現するのが Windows 2000 のリソースキット中にある linkd というコマンドです。
このコマンドを利用することで、任意の NTFS パーティション上に任意の NTFS パーティションにあるフォルダをリンクすることが可能になります。 ローカルマシン上のフォルダに限定されますが、 UNIX のファイルシステムでは以前から実現されているシンボリックリンクと同様の機能になります。 機能としてはショートカットに近いものだと考えると分かりやすいでしょう。 ただしショートカットと異なりファイルシステムレベルで動作しますので、 Explorer 以外のアプリケーションからも利用することが可能です。
例えば、ディスク構成が図4のようになっている場合を考えます。 既に新規にパーティションを作成する余裕はないため、 mountvol コマンドは利用できませんが、 linkd コマンドを利用すると、例えば D:\C_DRV\MSSQL7 フォルダを C:\MSSQL7 フォルダとして見せるといったことが可能になります。
----- 図4: ディスク構成 +-----------------+-----------------+ | C(空き容量なし) | D(空き容量あり) | +-----------------+-----------------+ -----
図5に C:\WINNT\TEMP フォルダを C:\TEMP フォルダにリンクする例を示します。 マウント機能と違って、リンク先のフォルダを予め作成してはいけません。 またフォルダに対してだけではなく、特定のファイルに対するリンクを作成することも可能です。
図5: linkdの実行
最後のlinkd /d は、リンクを解除するコマンド。なお RMDIRコマンド等で削除することも可能です。
この機能を利用すると、先程紹介した Program Files フォルダに付いても、別のディスク上のフォルダを個別に Program Files 以下の各フォルダにマウントすることが可能になるため、 別のパーティションの空き領域を活用することが可能です。
今回紹介したマウント機能や linkd コマンドが実現する機能は、いずれも NTFS5 に実装されているジャンクションポイント(リパースポイント、再解析ポイントともいう)という機能を利用しています。
これはパーティションやフォルダをマウントしたディレクトリを DIR コマンドでみると、図6のように
図6: DIRコマンドの出力結果
<JUNCTION>という表示が確認できる。
この機能は様々な応用が可能な汎用的な機能になっていて、他にもリムーバブル記憶域などで利用されています。