空き容量が不足した Windows 2000 の C ドライブを拡張するには?

対象プラットフォーム

質問

現在 Windows 2000 Server のサーバを運用していますが、 C ドライブの空き容量が常時不足しています。 今まではその度に不要なファイルなどを D ドライブに移動するなどして対応してきましたが、それも限界に達しつつあります。
できれば再インストールは避けたいのですが、なにか方法はないでしょうか。

回答

Windows NT までは、 「J052688:[NT]Windows NT ブートプロセスとハードディスクの制限」や、「J040242: [NT]セットアップ時作成されるブートパーティションは4GBまで」等に記載されているように、システムパーティションの容量がディスク先頭から最大 7.8GB まで、新規インストールの場合は 4 GBまでという制限があったため、この問題に対して根本的な解決を行なうことは事実上不可能でした。
Windows 2000 ではこの制限がなくなったため、可能であれば再インストールを行なって C ドライブを大容量のパーティション(注1)にすることを推奨します。

注1: Windows 2000では従来からのディスク管理方式をベーシックディスクと呼称し、新たにダイナミックディスクというWindows 20000独自のディスク管理方式を実装しています。ダイナミックディスクでは、従来の「パーティション」に相当する概念を「ボリューム」と呼称しています。
ここでは紙面の関係上、単に「パーティション」と記述していますが、本トピックの記述は全て「パーティション」、「ボリューム」双方に適用可能です。

とはいえ、 Windows NT からのアップグレードを行なった場合や、既に長期間運用してしまっている場合など、簡単に再インストールを行なうことが困難な場合も多いと思います。 Windows 2000 のダイナミックディスクでは、動的なボリュームの拡張などもサポートされていますが、 OS が格納されているシステムパーティションとブートパーティションについては拡張することができませんので、この方法も利用できません。

しかし、こうした場合でも、 Windows 2000 に実装されている NTFS5 で実装された機能を利用することで、 Windows NT よりは柔軟に対応することが可能になっています。

NTFS5の新機能 - マウント機能を活用する

従来の 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 がインストールされている場合は、

  1. MSSQL サービスを停止
  2. C:\MSSQL7 フォルダの名前を変更
  3. 新規に C:\MSSQL7 フォルダを作成して、 MOUNTVOL コマンドでパーティションをマウント
  4. 新しい C:\MSSQL7 フォルダに古いフォルダの内容をコピー

といった処理が必要になります。ファイルやフォルダにアクセス権を付与している場合、単純にコピーを行なうとアクセス権が変更されてしまうため、一度バックアップを行なってからリストアするという動作も必要になります。

また、 Program Files フォルダのように通常何らかのプログラムによりロックされているフォルダは、名前の変更を行なうこと自体が困難なため、 Program Files 以下の各フォルダで名前変更が可能なものを個別に別パーティションにマウントするといった対応が必要となり、現実的には対応が困難です。

更に、マウントはパーティション単位でしか行なえないため、ディスクに新規パーティションを作成できない場合は、この方法を利用することはできません。

シンボリックリンクを実現する linkd コマンド

実は、標準のコマンドでは実現できないのですが、 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 以下の各フォルダにマウントすることが可能になるため、 別のパーティションの空き領域を活用することが可能です。

NTFS5のジャンクションポイント機能

今回紹介したマウント機能や linkd コマンドが実現する機能は、いずれも NTFS5 に実装されているジャンクションポイント(リパースポイント、再解析ポイントともいう)という機能を利用しています。 これはパーティションやフォルダをマウントしたディレクトリを DIR コマンドでみると、図6のように と表示されることからも分かります。 またこれらの機能は「J052905: [NT]NTFSジャンクションポイントの作成および操作方法」中でも紹介されておりますので、併せてご参照ください。


図6: DIRコマンドの出力結果
<JUNCTION>という表示が確認できる。

この機能は様々な応用が可能な汎用的な機能になっていて、他にもリムーバブル記憶域などで利用されています。

参考情報

注記・補足

  1. 本文書は、日経 Windows 2000 2001 年 5 月号の「トラブル解決 Q&A コーナー」に掲載された「空き容量が不足した Windows 2000 の C ドライブを拡張するには?」の草稿を筆者の方で HTML 化して掲載しているものです。

Copyright (C) 1998-2009 TAKAHASHI, Motonobu
Last update: 2002-11-27 21:55:30 JST
webmaster@monyo.com