2011年9月10日土曜日

ノートPCのパーティション整理

個人で買ったものだけど仕事でも使用しているLetsnote S9、以前SSDに換装したことを書いたけれど、パーティション割りが思うようになっていないままだったので、再度整理してみることにした。

私が考えるベストなパーティションの分割方法は、ずばり「1ドライブ=1パーティション」である。
ネットでは、CドライブはWindowsのシステム+アプリケーション用、Dドライブはデータ用としてパーティションを切ろう、という提案を見かけるが、私はあまり好きではない。というのも、そのように分割していても、使い込んでくると「システム用はガラ空きなのにデータ用は逼迫している」とかその逆に陥ることが多い。特に、システム+アプリケーション用のCドライブが足りなくなってきて、仕方なくDドライブにアプリケーションを入れる必要に迫られたときの、何というか気持ち悪さというか、ある種「罪悪感」にも似た感じがどうもイヤだ。そう、CとDの使用率のバランスはたいがい極端になるものだと思う。

それならいっそのことCもDもなしにして、一つのパーティションにすべてを入れてしまえばよいと思う。
「システム用とデータ用と、それぞれ別々にバックアップしたいから別パーティションした方がいい」という意見も聞くが、そもそもシステム用=OS+アプリケーションは再インストールすれば済む話だし(また、たまにはOSからクリーンインストールした方がPCのもたつきが解消されるし)、一方個人データ部分のバックアップはシステム用と違ってブートレコードだのboot用ファイルだの考えずに、ファイル/フォルダごと適当なところにコピーしておけば済むのだから、あえて別パーティションにする理由はなく、それことWindowsがデフォルトでお仕着せ(笑)てくる「マイドキュメント」以下にでも放り込んでおけば、そのフォルダ以下だけをバックアップすれば済むのだ。
それに、同じ物理ディスク上にパーティションを分けていても、そのディスクがクラッシュすれば全滅するのは自明のこと。安全性を考えてパーティションを分けるというのもちょっとばかり説得力に欠ける。

話はずいぶん脱線したけれど、要はパーティションは基本的に1ドライブに1つだけという風にしたいということです。ただ、過去のデータや管理手法をそのまま踏襲する必要がある関係上、便宜的にEドライブをもうけて、その中にこれまでの資産を置くようにしている。ただ、先に言ったようにCとEドライブにパーティションを分けるのではなく、あくまで実際のディスク上では基本1パーティションとし、XP時代はsubstコマンドを使って仮想ドライブとしてEドライブを作成していた。そのEドライブが実際に参照する先はCドライブのMyDataなる個人用データフォルダとしていた。これで、便宜的にはCドライブ=システム+アプリケーション用、Eドライブ=個人データ用として分けて運用できるけれど、実際にはCドライブもEドライブも同一ドライブなので、どちらかの容量だけが足りなくなるということはない。
Windows7に以降した現在では、substコマンドは使わずにジャンクションを使うようにしている。substコマンドで割り当てたドライブ名でファイルアクセスするとき、Windows7ではアプリケーションによってはうまくファイルにアクセスできないことがあった。これはXPのときには無かった問題だ。そこでWindows7ではジャンクションを使うことにしたのだが、そうすると私の場合ではやはり別パーティションとしてEドライブを作って、そのEドライブのフォルダをCドライブの個人フォルダにジャンクションするようなやり方が必要なわけで、そうなると1ドライブ=2パーティションということになってしまう。しかし、ジャンクションを作るだけのEドライブにはそんなに容量は必要ないので実際には100MByte程度のごく小さいパーティションをつくって、ジャンクションでCドライブにフォルダ単位で飛ばしているという要領だ。これならディスクをうまく全部使い切りたい、という欲求を十分に満たしている。

さて、再び話が大幅に逸れたけれど、いよいよLetsnote S9のパーティションを整理する方法について記録しておきたい。
このS9にはリカバリ用DVDがついてくるのはよいのだけれど、リカバリするとHDDにリカバリ領域をまず作って、そしてWindows7の32bitをインストールする、という流れになるようだ。私のように64bit版を使いたいなら、更にHDD/SSD上のリカバリ領域から起動して再度64bit版をインストールする、という手順が必要になる。DVDから起動して直接HDD/SSDにWindows7 64bitをインストールするという選択肢があったらなぁ。しかも、HDDにはリカバリ時くらいにしか使わないリカバリ領域が居座ってしまい、容量の小さいSSDでは窮屈になってしまう。
という訳でWindows7をインストールするにはどうしても「リカバリ領域」がHDDにできてしまう。そこで問題となるのは、Windows7がインストールされたままの状態で、どうやってそのリカバリ領域を削除して一つの大きなパーティションに切り直すか、という点だ。
Windows7には標準でパーティションサイズを縮小・拡張する機能はついているけれど、ちょっと制約が大きいのが困る。今回の場合、リカバリ領域がディスクの前のほうに居座っているので、これを削除することはできても、現在インストールされているWindowsのシステムパーティションを前の方に移動させることができない。システムを入れたままパーティションを移動させるツールとしては、EASEUS Partition Managerなど便利なツールがあるけれど(実際、これまで何度もお世話になった)、今回は対象がSSDでパーティション先頭を4KiBの倍数に整列させないとパフォーマンスが落ちるというものなので、EASEUSは使えない。このツールはパーティションを操作するときに4KiBではなくシリンダ単位に整列させてしまうからだ。
なんとかSSDのアライメントを狂わさないで、かつ、システムを壊さないままパーティションを変更する方法がないかと調べてみたところ、GPartedというツールがあることを初めて知った。どうもLinux系のツールらしいが、いろんなファイルシステムの移動やコピーにも対応しており、しかも4KiB単位でアライメントしてくれるらしいので早速DLしてやってみた。

USBメモリからGPartedを起動して、ディスク前半のリカバリ領域を削除、その後Windowsのパーティションをディスクの一番前に移動させてApplyボタンを押す。SSDだからかわずか30分くらいで約100GByteのデータを移動完了して、再起動と相成った。しかし・・・
Windowsはブートするもののログインができない。画面右下に、「このWindowsのコピーは正規品ではありません」と出ている。なんでかな?
とりあえず、CTRL+ALT+DELでタスクマネージャが起動できたので、そこからcmd.exeを起動していろいろと探ってみる。それで気づいたことは、パーティション移動後に起動したWindowsは、なぜかEドライブになっていた、ということ。Cドライブは存在していない。更にreg.exeコマンドなどで調べてみると、レジストリHKLM\SYSTEM\MountedDevicesに\DosDevices\C:と\DosDevices\D:が登録されており、そのキー値に何やらよく分からないバイナリ値が設定されている。想像するに、その設定値が意味するドライブ情報と、現在の(パーティション移動後の)システムドライブの情報とが一致しないかなんとかの理由で「正規品ではない」と判定しているのだろうと考えた。であれば、どのレジストリのドライブ情報を正しく書き換えてやるか、あるいは、その\DosDevices\C:キー自体を削除できればCドライブとして居座っている何かよく分からない別ドライブの代わりに、現在のSSDのシステムドライブが登録される(か、Eドライブではなく、Cドライブとして起動する)などして、正規品として認めてくれやしないだろうか?と思った。が、・・・。
reg.exeコマンドでレジストリ値を調べることはできても、書き換えたり削除することがどうしてもできなかった。ACLの問題かと考えて、SubInAcl.exeツールを使ったりしてみたけれど、そのツールでレジストリのアクセス権限を変更できない。おそらく「正規品でない」と判定されている以上、コマンドプロンプト上でいろいろやっているのは、権限が制限された仮ユーザーの状態なのだろう。そのユーザーがアクセス権限を変更できるわけがない。かといって、ユーザーの切り替えをやって正規ユーザー名+パスワードを入力しても「正規品でない」ということでログインさせてもらえないし・・・。

八方塞がりだ。

仕方ないので、取ってあったバックアップからWindowsシステムの復元をして、元の状態(回復パーティションがある状態)に戻した。
今度は、回復パーティションをWindows上から削除した後、Eドライブ用の小さな100MByte程度のパーティションを作った。その後GPartedを起動して、今度は回復パーティションを削除して空いた領域いっぱいまで現在のWindowsのパーティションを拡張することにした。GPartedがパーティションを移動させている間、祈ること約30分、作業が完了して再起動すると・・・。
うん、今度はちゃんとログインできてデスクトップが見えるようになった。いくつかアプリケーションを立ち上げてみるが、ちゃんと起動しているいるようだ。個人用のデータもちゃんと残っている。

よかった、これでようやくほぼ希望するパーティション割りになった。
しかし、やはりOSの入れ替えなどや(今回は入れ替えなかったけれど)、パーティションの操作をやろうとすると、時間がかかるなぁ。かれこれ丸一日くらいかかってる。実際には、大切なファイルのバックアップ関係が半分以上の時間を占めているのだけれど。

2011年9月2日金曜日

Windows7の電卓

今さらですが、Windows7の電卓ってソフトを書く人間にとっては改悪だよな。

ソフト書いたりデバッグしていると、時々10進数を16進数を相互に変換したくなるときがある。そして、変換結果に対して、ちょっとした関数演算(logとかexpとか)をやることがある。
でも、Windows7になると「普通の電卓」「関数電卓」「プログラマ電卓」などと切り替え式になってしまったため、「プログラマ電卓」で16進数→10進数変換したあと、そのまま関数演算ができない!「関数電卓」に切り替える計算結果が0に戻されてしまうので、結果を覚えといてまた入力し直してから計算、ということになる。

このような「モード切替」があるUIって、それぞれのモード毎に機能が整理されて便利だと思う反面、自分が使いたい機能があるのはどのモードだっけ?ということになり、モードの「坊主めくり」状態に陥る危険性もあるわけでどうも好きじゃないな。
まあ、電卓の機能ごときで坊主めくりになってしまうことはないけれど、電卓モード切替がATL+1~4で簡単にできるのだから、せめて計算結果くらいはモード間で保持されていてもよいのでは?と思う。