[Linux]Virtual BoxでP2Vする方法

vboxsetting

P2V関係のアクセス数が意外にあるので、私流のやり方を書いてみます。Linuxの知識がある程度ある人を対象としています。書いてあることの意味が分からなければコメント欄で聞いてください。

P2Vとはなにか

Physical to Virtualの略です。その名の通り、物理マシン、つまり実際のマシン、PC、などで動いているOS含む環境一式を仮想マシンにする方法です。昔のOSでしか動かないアプリを使い続けるためには最も優れた方法だと思います。

P2Vする専用のソリューションが有料/無料ふくめていくつか有りますが、VirtualBoxならVirtualBox付属のツールでなんとかなります。ただ、マシン構成が複雑だと試行錯誤が必要かもしれません。

では、私流のやり方を書いてみます。

1.現状のHDDをまるごとイメージ化

これ、単純なようですが若干面倒です。対象とする物理マシン上にHDDが2つ以上あり、かつ、システムドライブが入っているHDDの容量以上の空き容量が他のドライブに無いとそもそもディスクイメージを保存する場所が無いからです。

このようなときは、HDDをダンプした結果をそのまま他のPCに写しちゃいましょう。ddの出力をnetcatします。

これを実現するために、もう一台Linuxマシンを用意します。これをHDDデータを保存するマシンとして使います。Linuxマシンがない場合は、UbuntuのLiveCD(インストールCD)などでOKです。
(私はWindows上で動くVirtualBoxにインストールしたUbuntuでやりました。つまりLinuxが動けばなんでもいいです)

そして、P2VするマシンでもUbuntuなどのLive CDを起動させます。こちらは、メモリ上でOSを起動させてシステムドライブをロックさせない、ということが必要なので必ずLive CDを使います。
CDROMドライブがない場合は、UNetBootinなどでUSBメモリから起動させることもできます。

ちょっとややこしいかもしれないので、もう一度書きます。

P2Vする対象のマシン:LiveCDでLinuxを起動する
HDDデータを保管しておくマシン:Linuxを起動させておく(方法は問わず)

これで準備は整いました。HDDイメージを保存するPC、P2VするPC、どちらもLinuxを動作させておきます。この状態で以下のコマンドを入力します。

HDDデータを保管しておくマシン:

nc -l 12345 | bzip2 -d |dd bs=16M of=[保存先ファイル名]

この後、P2Vする方のマシンで以下のコマンドを入力します。

P2Vする対象のマシン:

dd bs=16M if=/dev/sdXX | bzip2 -c | nc [受信側マシンのIPアドレス] 12345

sdXXはダンプするHDDの名前です。

ちなみに、bzip圧縮はブロックサイズ16MBが一番効率が良いそうなのでそうします。
Using DD Over Netcat vs SSH

ddは進捗状態を表示しないので、動いてるのかどうかわかりませんが、別のターミナルからddにUSR1シグナルを送ると進捗を表示してくれます。間違ってプロセスを殺さないように注意。

killall -SIGUSR1 dd

HDDの容量と速度にもよりますが、フルダンプなので(ファイルがあるエリアだけ送るとかしないので)かなり時間がかかります。

あらかじめ、P2Vするマシン上の空き領域エリアをゼロクリアしておけば、通信速度はずっと早くなるはずですが、そもそもゼロクリアにもかなりの時間がかかるため、私の経験上、効果は限定的だと思います。やらなくていいと思います。

それに、P2Vしようとするマシンは古いマシンであることが多く、そのような場合はLANよりもHDDアクセスがボトルネックになるので、やっぱりゼロクリアすることの恩恵はあまり受けられません。ただし、最終的に可変サイズ方式の仮想HDDイメージにする場合は容量の節約になります。

ゼロクリアする場合は、LinuxからP2V対象のHDDをマウントして、以下のコマンドを打ちます。

$ cd [P2V対象のHDDの中のファイルシステムのどこか]
$ dd bs=16M if=/dev/zero of=zero.img 
(ずっと待っていると容量オーバーでエラーになって終了する)
$ del zero.img

いずれにせよ、だいたい数時間単位で待つことになるので、放置してラーメンでも食いに行きましょう。

2.HDDイメージを変換する

ラーメンを食って帰ってきたらHDDダンプが終わっているはずです。

まずは、出来上がったddのイメージ(生イメージ、rawイメージ)をVirtual Boxの仮想HDDイメージに変換します。これには、VirtualBoxに付属しているVBoxManageツールを使います。Linuxであればパスが通っているはずです。WindowsであればVirtualBoxのインストール先のどこかのフォルダに入っています。

で、以下のようにします。

$ vboxmanage convertfromraw [変換元イメージファイル] [変換後イメージファイル]

「vboxmanage convertfromraw」と打つとusageが出てきますので、一応確認してみてください。面倒な場合は無指定でも困らないと思います。

一応、このコマンドは標準入力からのデータも受け取ることが出来ます。なので、本来であればnetcatで受け取ったddのデータをディスクに保存すること無く、そのままVirtualBoxイメージに変換出来るはずなのですが、うまく行った試しが無いため諦めています。

3.VirtualBox仮想マシンを作る

ここまで来たらあとは簡単です。VirtualBoxのGUIから新しいマシンを作り、先ほど変換したHDDイメージを指定します。

P2V対象のマシンにインストールされていたOSがWindowsの場合は、IO APICを有効化というチェックをONにしなければならない場合があります。

vboxsetting

画面が真っ暗なままになっている場合はこのオプションをON/OFFしてみましょう。詳細は以下記事から。

VirtualBOXでWindowsマシンをP2Vするときの注意点

以上で普通に動くはずです。特に複雑なマシン構成でない限り、VirtualBoxのオプションはいじらなくても動作すると思います。

お疲れ様でした。

おまけ:CPUID

インストールしたマシンと違うマシンで実行出来ないような仕組みになっているソフトがたまにあります。そういうのは当然ですが、P2Vしても動きません。

ですが、古いソフトの場合は単純にCPUIDを見ているだけだったりします。VirtualBoxは仮想マシンのCPUIDをいじれるので、古いマシンでCPUIDをチェックし、同じCPUIDを仮想マシンに書き込めば動くようになる場合があります。

以下のコマンドでホストマシンのCPUIDを調べることが出来ます。

$ VBoxManage list hostcpuids

以下で仮想マシンのCPUIDを書き換えることができます。

$ VBoxManage modifyvm --cpuidset  

ここらへんはより詳しいサイトが沢山あるので、ぐぐってみてください。私は専門外です。