Win7 のブート VHD ファイルのダイエット

2012年04月12日(木)00時59分

容量固定40GB

前回「Win7 の VHD ブートと稼働中のコピー」に引き続き VHD ブート関連の話題で、今回は起動用 VHD イメージのファイルサイズを少しでも小さくしようと苦闘?した記録です。
まず、当初は容量固定で 40GB の VHD ファイルにして運用していました。
これは、「容量固定の方がパフォーマンスが良くトラブルの可能性も低い」というようなことをどこかで読んだからです。
また、40GB にしたのは「Blu-ray へのバックアップ」を念頭に置いてのことです(といっても Blu-ray ドライブ持っていないのですが)。

容量可変方式に変更

が、とりあえず必要そうなアプリケーションを詰め込んだ状態での使用容量はせいぜい 15GB 程度、そのために毎回 40GB をバックアップするのは、どうにも時間の無駄に思えたため、容量可変に変更することにしました。
変換処理は、例えば「D:\VHD\固定.vhd」を「D:\VHD\可変.vhd」に変換する場合、「コマンド プロンプト」を管理者として実行し、以下二行のコマンドを入力すればできます(終了後は exit コマンド二回で「コマンド プロンプト」を終了できます)。

diskpart
create vdisk file="D:\VHD\可変.vhd" maximum=40960 type=expandable source="D:\VHD\固定.vhd"

ただし、現在起動中の VHD ファイルから生成することはできませんので、あらかじめ別システムでコピーしておいたものをソースとして使用する必要があります。
また、コマンド中「maximum=40960」となっている最大容量指定部分は、ソースの最大容量より大きくはできましたが、小さい値を指定することはできないようです(省略するとソースと同容量になります)。
なお、「可変 → 固定」と逆に変換する場合には、「type=expandable」の部分を「type=fixed」とします(あるいは何も指定しなければ容量固定になります)。

容量可変方式の不要ブロック

上記コマンドで「固定 → 可変」に変換した直後の状態では、実際の使用容量(15GB)以上の VHD ファイル(18GB)になっていました。
これは、create コマンドが「ブロック単位」でソースのコピーを行うことが要因であるようです。
一般的な OS でのファイル管理方式では、例えばあるファイルを削除したとしても、それはファイル・テーブル(ファイル管理用データベース)上での「この位置にファイルがあります」という情報が消されるだけで、実際にファイルが記録されていたブロックのデータが消される(ゼロクリアされる)わけではありません。
つまり、ファイルを削除すると「データは残っているが使われないブロック」ができるわけですが、create コマンドではこの「使われないブロック」もコピーするため、実際の使用容量より大きくなります。

不要ブロックの削除

というわけで、さらなる省サイズ化のだめには、使用されていないブロックを削減する処理が有効となりますが、これには compact コマンドを使用します。
圧縮処理は、例えば「D:\VHD\可変.vhd」を圧縮する場合、「コマンド プロンプト」を管理者として実行し、以下三行のコマンドを入力すればできます(終了後は exit コマンド二回で「コマンド プロンプト」を終了できます)。

diskpart
select vdisk file="D:\VHD\可変.vhd"
compact vdisk

事前圧縮処理(Pre-Compactor)

ただし、いきなりこの compact コマンドを実行しても、大してサイズに変化はありません。
これは、結局のところ compact コマンドも「何も書かれていないブロックを取り除くだけ」であり、create コマンドにおけるソースのコピーと同じ方式ですから、不要ブロックにデータが残っている状態で使用しても意味がないからです。
ということで、この問題を解決するために、「Windows Virtual PC」に付属する「バーチャル ディスク事前圧縮ユーティリティ(precompact.exe)」というツールを使用します。
なぜこれが Virtual PC に付属しているのか?といいますと、もともと「VHD」という形式が、Virtual PC 用の仮想ハードディスクとして開発されたものであるためです。
現在 Virtual PC は無償提供されており、また、Win7 で VHD ブートをしているエディションであれば「Windows XP モード」もありますので、これをインストールして「precompact.exe」を入手しました。
余談ですが、自分はこの「Virtual PC」がまだ市販ソフトであったときに購入しており、しかも結構高価だったにもかかわらず思ったほど使わなかったということもあって、これが無償提供されると聞いたときには、複雑な思いを抱いた記憶があります。

「precompact.exe」の使い方

本題に戻りまして、この「precompact.exe」は、実行するとハードディスクのファイルが書かれていない領域にゼロを書き込んでいくツールです。
これが、「VHD ファイル」の各ブロックに対してゼロクリアしていくものではなく、「ハードディスク」の各ブロックを消去するものであることに注意が必要です。
つまり、これを使用するためには、その前に VHD ファイルをマウントし、OS からハードディスクとして認識されるようにしておく必要があります。
さらに、「precompact.exe」を普通にダブルクリックで実行した場合、接続されている全ハードディスクに対して実行されます。
当然ながら、物理的な実ハードディスクの各ブロックをゼロクリアしても意味もなく時間の無駄ですので、コマンドラインから「-SetDisks」スイッチを使用し、処理するドライブレターを指定して実行することになります。
例えば、対象 VHD ファイルを E ドライブにマウントしている場合は以下のようになります(最後の「e」がドライブ指定です)。

precompact.exe -SetDisks:e

このとき、ドライブは複数指定可能で、例えば「E」「G」「I」のサンドライブを順に処理する場合は以下のようにします。

precompact.exe -SetDisks:egi

また、「-Silent」スイッチを指定すると、開始時の「Would you like to prepare the virtual hard disk(s) for compaction?」という確認なしで、いきなり処理が始まりますので、BAT ファイルなどに組み込む場合に便利です。
ただし、途中経過も一切表示されない本当の Silent 処理になりますので、終了時間の予想がつきにくいのが難点ですが。

precompact.exe -Silent -SetDisks:e

Win7では事前圧縮処理は不要か?

今回、この記事を書くためにいろいろと調べている過程で、Microsoft の中の人?が書いていると思わしき、以下のページを見つけました。

http://blogs.msdn.com/b/virtual_pc_guy/archive/2009/12/14/the-different-ways-to-compact-a-disk.aspx

これを読んでいると、どうも Win7 では「ファイル単位」での圧縮が行われるらしく、この場合はあらかじめ各ブロックをゼロクリアする「事前圧縮処理」は要らないと読めます。
つまり、NTFS のファイル・テーブルを読んで必要な場所のみを残す、という処理をするため、ブロックにデータがあっても、それが使用されていなければ削除されるというわけです。
ただし、これは Virtual PC の機能として存在する?「仮想ハードディスクの圧縮」を使えば、ということのようで、試した限りでは、少なくとも diskpart の compact コマンドは、Win7 付属のものも「ブロック単位」であり、precompact.exe を実行しておく必要がありました。

NTFS 圧縮

また本筋に戻りまして、さらなる容量削減を目指し、「NTFS 圧縮」もしてみました。
ドライブのプロパティで「このドライブを圧縮してディスク容量を空ける」となっているアレです。
これもまた、過去に Windows Update で「NTFS 圧縮しているファイルが破損する」というバグがあり、その直撃を受けたという嫌な思い出があったりもするのですが、それはともかく、システム・ドライブは音声や動画といった「圧縮の効きにくいファイル」が少ないため、これは効果があるのではないか、と期待されます。
が、やってみたところ、「14.2GB → 13.7GB」と、せいぜい 500MB ほどしか縮みませんでした。
ただし、次に述べる「最適化」を行うと「12.9GB」と、なぜか 1GB 超縮みましたので、まあやった甲斐はあったかな、という程度にはなりました。

デフラグと最適化と Ultra Defrag

例えばネットで、VHD ファイル圧縮に関する情報を集めますと、大体その手順は「デフラグ → 事前圧縮処理 → compactコマンド」とされています。
「デフラグ」とは、一つのファイルが分割され、ハードディスク上で分散して格納されてしまっている場合に、それらを集めて「ひとつなぎ」にしてしまうことです。
さらにこの上位互換的なものとして「最適化」があります。
これは、ファイルごとにまとめるだけでなく、さらに全ファイルを(一般的により高速に読み書きできる)ハードディスク先頭領域にまとめてしまいます。
そして自分は、この「最適化」目的のために、「Ultra Defrag」というアプリケーションを導入しました(理由は「コンソールで使える」「標準で日本語対応」「ポータブル版がある」などです)。
もっとも、VHD の時点で「ハードディスク先頭領域にまとめる」ことの効果にはそれほど期待しておらず、「空き領域がまとめられる」ことが狙いです。
これは例えば、空き領域が分散されていて「ここと、ここと、ここと、ここと…、が空きブロックで不要です」という状態よりも、一か所にまとまっていて「ここから○ブロックが不要です」の方が、当然管理に必要な情報が少なくなり、その分 VHD ファイルのサイズも減るだろう、ということです。
ということで、さっそく VHD ファイルをマウントして「完全に最適化する」をしてみたところ、前述の通り、なぜか 500MB も圧縮容量を稼ぐことができました。

複製 VHD ファイルの同時マウント

実は今回いろいろと調べてみるまで、複製した VHD ファイルを、元の VHD ファイルと同時にマウントできる、ということを知りませんでした。
何の話かといいますと、まず今の環境は WinXP と VHD ブートの Win7 でデュアル・ブート体制になっており、Win7 の起動用 VHD ファイルは WinXP を立ち上げ、そこからコピーしてバックアップを取っています。
つまり、同じ内容の VHD ファイルが「Win7x64.vhd」と「Backup.vhd」の二つ同時に存在するわけです。
で、「Win7x64.vhd」で起動しますと、当然ながらこれが C ドライブとしてマウントされています。
この状態で「Backup.vhd」をマウントすると、以下のように「オフライン」というエラーが表示され、ドライブレターの割り当てが行われないのです。

VHDオフライン

しかし、「Windows はハードディスクごとに識別子(署名)を埋め込んで管理している」という知識があったため、「ああ、これは署名が競合するから無理なんだな」と、勝手に納得して済ませていました。
そして、今回多用している diskpart というコマンドライン・ツールは、WinXP にも存在するのですが、これはバージョンが古いため VHD ファイルを操作する機能に乏しく(というより無い?)、そういう目的にはほぼ使えません。
それで仕方なく、Win7 のインストール DVD を起動し、「SHIFT + F10」キーでコマンド・プロンプトを開いて compact コマンドを使ったりしていたのです。
ところが、調べてみるとこれは、右クリックして「オンライン」にするだけで回避(マウント)可能でした。

VHDオンライン

つまり、エラーだと思っていた「オフライン(オンラインである他のディスクと署名が競合しているために、ディスクはオフラインです)」というのは、単なる警告だったわけです。
何事も思い込みで勝手に判断せず、とりあえずは調べてみた方がいい、と思い知らされた出来事でした。

ファイル・サイズ増減の記録

最後に、この記事を書くにあたって行った、「どういう作業をすればどのくらい VHD ファイルのサイズが増え(あるいは減り)、またその際内部のブロック配置状況がどうなっているのか?」を確認するために作った記録を残しておきます。
各見出しの数値は VHD ファイルの容量、画像は、Ultra Defrag で「分析」で表示されたものです。

[00]55.3MB

8GB の可変 VHD を作り、全領域を割り当てたパーティションを一つを NTFS でフォーマットした初期状態です(「このドライブ上のファイルに対し、プロパティだけでなくコンテンツにもインデックスを付ける」をオフにしています)。
ハードディスクの管理に必要な部分(ファイル・テーブルなど)以外は、何も使用されていません。

00

[01]2.34GB

「ファイル数=14000個、フォルダ数=700個、サイズ=2.25GB、ディスク上のサイズ=2.29GB」のフォルダ(以下「フォルダA」)を一つコピーしました。

01

[02]4.61GB

「フォルダA」と同じものを、もう一つ追加でコピーしました(以下「フォルダB」)。

02

[03]4.61GB

先にコピーした「フォルダA」を削除しました。
ディスクの使用量は減っていますが、一度増加した VHD ファイルのサイズは減っていません。

03

[04]4.60GB

[03]の状態で、「事前圧縮処理」をせずに、いきなり compact コマンドを実行してみました。
しかし、当然ながら VHD ファイルのサイズはほとんど変わりません。

04

[05]2.35GB

[04]の状態に、「precompact.exe」で「事前圧縮処理」をかけてから compact コマンドを実行してみました。
VHD ファイルから、削除したフォルダ分の容量が削減されました。
ただし、ハードディスク前半の、削除した部分のブロックは、空きブロックとしてそのまま残されています。

05

[06]2.33GB

[05]の状態に、Ultra Defrag で「最適化」をしてから「事前圧縮処理」をかけ、compact コマンドを実行してみました。
ハードディスク前半部の空きブロックが後ろに回され、一つにまとめられています。
そのためか、VHD ファイルの容量もわずかながら削減されています。

06

[07]1.84GB

[06]の状態に、「このドライブを圧縮してディスク容量を空ける」をチェックして「NTFS 圧縮」をかけてみました。
フォルダ内には、音声や動画のような圧縮に向かないデータが少なかったせいもあり、「ディスク上のサイズ」では 1.39GB とかなり縮んでいます。
ただし、実験的にここでは「最適化」はせず、「事前圧縮処理 → compact コマンド」処理のみしてみたところ、VHD ファイルのサイズは、「ディスク上のサイズ」程には減っていません。

07

[08]1.48GB

[07]の状態で、「最適化 → 事前圧縮処理 → compact コマンド」処理したものです。
VHD ファイルのサイズが「ディスク上のサイズ」に近づき、かなり縮小されました。
ということで、「NTFS 圧縮 → 最適化 → 事前圧縮処理 → compact コマンド」で最大効果、ということが確認できました。

120411008

関連記事

【同じタグを付けた記事の一覧】
バックアップ ポータブル Windows

スポンサーサイト

コメントの投稿

非公開コメント

最新記事
最新コメント
Amazonおまかせリンク
カテゴリ
タグクラウド
Amazonお買い得ウィジェット
カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
月別アーカイブ
プロフィール

電脳太助

Author:電脳太助
Website:電脳スピーチ web

RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

サイト内検索
Ads by Google
FC2アクセスランキング
Ads by Google
FC2拍手ランキング
ユーザータグ

音楽管理(66)
ポータブル(57)
ソフト紹介(44)
プログラミング(42)
音声技術(41)
自作ソフト(35)
サイト運営(32)
FC2(31)
ブログ(30)
iTunes(27)
Windows(25)
LISMO(24)
音声合成(23)
音声認識(22)
x-アプリ(22)
電子ブック(22)
eラーニング(20)
バックアップ(19)
語学学習(19)
foobar2000(18)
ソースコード(18)
WindowsLiveWriter(15)
画像管理(15)
C++(14)
アフィリエイト(10)
DnspTools(10)
fi-6130(9)
FLAC(9)
JavaScript(9)
ウォークマン(9)
英語音読学習計画(8)
Gracenote(8)
Prolog(8)
ベクター(8)
雑記(8)
CodeBlocks(7)
SyntaxHighlighter(7)
TraConv(7)
spcbght(7)
wxWidgets(7)
VirtualBox(6)
W63CA(6)
DCP-J552N(6)
WinRT(6)
WindowsLiveMesh(6)
iGoinLM(6)
英語発音矯正実験(6)
ExactAudioCopy(6)
MP3Gain(6)
LAME(5)
音楽技術(5)
Mery(5)
楽器演奏(5)
GalateaTalk(4)
nLite(4)
WindowsLiveSkyDrive(4)
ホームページ(4)
GalateaProject(4)
MIDI(4)
LLVM(4)
PC-98(3)
カウンター(3)
AACGain(3)
iTCDini(3)
OverCutChecker(3)
拍手(3)
PK-513L(3)
UniversalExtractor(3)
アクセスランキング(3)
ImageCompositeEditor(2)
アクセス解析(2)
OCR(2)
qtaacenc(2)
資格試験(1)
AquesTalk(1)
AquesCmdDl(1)

FC2アクセスランキング
最新トラックバック
アクセスランキング
[ジャンルランキング]
コンピュータ
90位
アクセスランキングを見る>>

[サブジャンルランキング]
ソフトウェア
6位
アクセスランキングを見る>>
FC2カウンター