2012年11月30日金曜日

PC ドライブレターのお話

PC を使っていて、機種毎にドライブ構成が違う。 どなたもご存知の事と思います。
例えば、光学ドライブが、 E:¥ だったり G:¥ だったり ... 。
アイコン表示や名称で区別できますが、自分でプログラムを書こうとすると、これがなかなか厄介!
今回、新 PC の OS 設定で Internet を漁っていて、面白い投稿に出会いましたので、自分なりにこの辺を書いてみましょう。 題して、PC ドライブレター(ドライブ文字)のお話。


なぜ、C:¥ ドライブなの?
OS はC:¥ 。 どうして、A:¥ からじゃないの?と思われる方もいらっしゃるのでは。
これは、昔々の Windows 更に遡る MS-DOS の名残です。 A:¥ と B:¥ はフロッピーディスクの為に空けてあるのです! 起動ドライブ( OS が保存されていた所 ) だったので一番最初。
Microsoft さまはこれが未だに捨てられない ... 歴史を大事にしている (?) 訳。


ドライブレターの割当
機種毎にドライブ構成が違います。 PC メーカーや自作 PC でも、D:¥ から後の並びは様々。
順番が違っていたり、跳んでいたり。
これは、OS をインストールした時の名残りです。
C:¥ 以外は基本的に変更も可能です。 ただし、ソフトによってはドライブの位置 ( ドライブレター 例:C )に依存した動作をするものもある為、留意してください。 下手に変えない方が無難。
ご自分で追加した HDD 等では、自由にドライブレターを弄れます。 例外有!後述。

コントロールパネル > 管理ツール > コンピューターの管理 > ディスクの管理 > ドライブ選択 > 右クリック > ドライブ文字とパスの変更 > 変更


ディスクの管理 ツール
前に「面白い投稿」と書いたのが、ディスク管理ツールに関するものでした。
このツールは CMD のコマンドのフロントエンドとして機能していると言うのです。 目から鱗。
コマンドは mklink と mountvol と。( diskpart も ? )
更に、ここには、USB メモリなど実行時に動的にドライブレターが割り当てられるものを、固定化する方法にも触れられています。
面白かった内容を一部掲載させて戴く事としましょう。 ちょっと長いかな?
(前略)

シンボリックリンクを作るmklinkコマンド
 
で,ようやくmklinkの話に入ります.mklinkはおおざっぱに言うと「ファイル/ディレクトリ間の関連付け」をするコマンドです.たとえばa.txtというテキストファイルとb.htmlというHTMLファイルを関連づけてa.txtの編集結果をb.htmlに反映できるようにするとか,そういうことができます.深い階層にあるファイルをマイドキュメントの適当なファイルと関連づけておけば,いちいち目的のファイルがある階層にアクセスしなくても編集作業ができるようになるという優れもの.ディレクトリのことで言うと,たとえば,コマンドプロンプトでdir /a \Users\{UserName}\と打ち込んでみると,マイドキュメントやスタートメニューといった項目がジャンクションになっていることがわかります.これのおかげで,何も考えなくてもユーザーフォルダからいろんな場所に移動できるわけです.

(中略) 以下、外付け HDD との絡み

tipsの解題をしたときにジャンクションということを書きましたが,オプションにある/Jスイッチが,まさにそのジャンクションを作るスイッチです.なので,これを使ってtipsでやっていた操作をすることができるはずですね.ということで試しにmklink /J "C:\Users\UserName\Documents\hdd1" "任意のドライブレター:\"↵とやってみます.mklinkは管理者としてでないと動かないので,実行するときには[スタートメニュー]→[すべてのプログラム]→[アクセサリ]→[コマンドプロンプト]を右クリック,[管理者として実行]します.すると問題なくジャンクションが作成されますが,先ほどと同じようにdirコマンドで属性を確認してみると<JUNCTION>  hdd1[任意のドライブレター:\]となっていると思います.これだとドライブレターとの関連づけなので,デバイスの取り外しなどでレターが変わってしまうとアウト.つまり<JUNCTION>  hdd1[\\?\Volume{GUID}\]となっている必要があるわけです.ではどうするかというと,mountvolコマンドを使って一意のGUIDを取得します.

mountvolコマンドでGUIDを取得してmklinkする

コマンドプロンプトを開いてmountvol↵と入力すると,GUIDとドライブレターの一覧が表示されます.この中から目的のドライブを見つけたらGUIDをメモするか,ウィンドウタイトルを右クリックして[編集]→[範囲選択]で\??\Volume{GUID}\を選択後,再度[編集]→[コピー]しておきます.この作業が無事終わったら再度mklinkでジャンクションの作成にトライしてみます.打ち込むコマンドはmklink /J "C:\User\{UserName}\Documents\hdd1" "取得したGUID"↵です(リンク元については任意のフォルダなので適宜読み替えてください).今度は次のような画面になって,GUIDを使ったジャンクションが作られていることが確認できると思います.

tipsはmklinkのフロントエンド解説だった

というわけでdiskmgmt.mscやらmklinkやらmountvolやらたくさん出てきましたが,一連の確認作業を通して"ディスクの管理"はmklink(およびmountvol)のフロントエンドとして機能しているのだということがよくわかりました.
                                                         
 (前略)(中略)は ShiroYuki_Mot 挿入
有益な情報をありがとうございます。

ドライブの GUID を元に認識する方法。 これは面白い! きっといつか役に立ちそう。


割当時の留意点
勝手にドライブレターが変わっては困るのが、 OS 絡み。
Users Folders 等を C:¥ から別のドライブに移動した場合、レジストリーにその情報を登録しますので、ドライブレターを固定しなければ OS の挙動が不安定若しくは起動不可能ともなり得ます。
設定して直ぐにはそんな馬鹿な事はしないでしょうが、念の為、ドライブには名称 ( Volume Label ) を付け OS の一部である事を明示しましょう。
名称を付ける事によって、プログラミング時にドライブレターに依らない識別も可能となります。
更に、先の GUID での認識を上手に使えば、ドライブレターでのリムーバブル系のドライブをハンドリング出来そうです。

いや~ OS って奥が深いですね。 難しい。

0 件のコメント:

コメントを投稿