15年以上前のクラシックなPCをバックアップ（仮想化）してみた

いまにも壊れそうな15～17年くらい前のPCをバックアップのため仮想化しました。いわゆるP2Vなんですが思ったよりも手こずったのでその時のメモです。

##ターゲットPCのスペック
ターゲットPCのOSはWindows2000 SP2、メモリ128M、HDD40G、HDDのインターフェースはIDEです。

##ホストPCの環境
仮想化ソフトはVirtualBoxを使用、ホストOSはUbuntu16（64bit）。ターゲットPCからイメージを取得するのにTiny Core Linuxを使用しました。

##イメージの取得
###これまでの方法が使えない
P2Vでまず思いつくのがVMware Converterなんですが、最新のVMware vCenter Converter StandaloneはWin2000に対応していないようです。できる限り古いバージョンをダウンロードしリモートからの変換を試してみたのですが、サポートされていないからなのかターゲットPCの状態が悪いのかエラーとなり失敗してしまいました。

といって動いているのが不思議なくらいのターゲットPCにサービスパック4をインストールしたりといった試行錯誤は怖くてできません。といって今回使った以上に古いVMware Converterも探しだせなかったため、この方法は断念することとしました。

次はイメージバックアップを取得してバックアップファイルから仮想マシンに変換する方法です。過去にこの方法で変換したこともあったのですが、最近使っていないせいかバックアップソフトそのものが見つかりません。なんとかWinPEベースのバックアップツールを見つけ出したのですが、PCが古すぎるのかブートできません。

WinPEのバージョンを下げる等、他の方法をためそうにも本体がネットワークブートやUSBブートに対応していないため、イメージを作成して、CDを焼いて、試してを繰り返すしかなさそうです。

その時代はそれが普通だったんですが、ネットワークブートやUSBブートに慣れきってしまっている今の私にとってはかなり苦痛な話です。

しかもメモリは128M。うーん。心が折れそうです。

###Tiny Core Linux登場！
メモリ128M…でふとあのOSを思い出しました！そう少ないメモリといえばTiny Core Linuxです！以前VirtualBoxのコマンドヘルプを見ていた時にVMware形式の仮想ディスクだけでなくRAWディスクイメージをVirtualBoxの仮想ディスクに変換できそうなことが書いてあったのでTiny Core Linux + ddで取得したディスクイメージが変換できるかもしれないということでで試してみました。

早速TinyCore v8のISOファイル（16Mバイト）をダウンロードしCDに焼きます。サイズが小さいのであっという間にダウンロード＆作成は完了しました。

CDをセットし起動してみると…起動できました！こんなに古いPCでも起動できたことに感激です。

確認してみたところUSBデバイスは認識しているようです。USBのHDDをつないでマウントを試みたところあっさりとマウントできました！うれしいかぎりです。

###ディスクイメージの取得
さっそくddコマンドを使ってディスクイメージを取得してみます。

```console:ディスクイメージ取得
$ sudo dd if=/dev/sda of=/mnt/sdc1/win2000.img
```

あとは待つだけ…なんですが秒あたり1Mバイト程度しかコピーされないようです。同じ操作を手元のPCで実行するとかなりの速度でコピーされますのでTiny Core Linuxの問題ではなくPCの問題のようです。1秒で1Mとなると10秒で10M、1分で60M、1時間で3.6Gなので40Gコピーするには11時間くらいはかかる計算になります。

仕方ないので夜間放置しておくことにしました。

次の朝、できているかなと見てみるとFile too largeで止まっていました。失敗です。Windowsでも使えるようにとHDDをFATフォーマットしたのがいけなかったようです。しかしWindowsでの利用も選択肢として残しておきたいので分割しながらイメージを取得することとしました。

```console:ディスクイメージ取得（2Gで分割）
$ sudo dd if=/dev/sda | split -b 2000m - /mnt/sdc1/win2000.img.
```

次の朝、確認したところwin2000.img.aa, win2000.img.ab, ...のような感じで分割されたイメージファイルが作成されました。エラーも発生していないようです。

###ディスクイメージの変換
まずはホストOSであるUbuntuに先ほどのHDDをマウントし`cat`コマンドで分割されたファイルを結合します。

```console:イメージファイルの結合
$ cat /media/hachi/BACKUP/win2000.img.* > win2000.img
```

結合後は40G近いファイルになるのですが無事結合できました。ホームディレクリのフォーマットがext4だからでしょうか。

つづけてVBoxManageコマンドを使ってディスクイメージを仮想マシン用のディスクイメージに変換します。本当にddで取得したイメージが変換できるのか心配だったのですがあっけなく完了し6Gほどの仮想ディスクが作成されました。未使用の領域を圧縮してくれたぽいです。

```console:イメージの変換
$ VBoxManage convertfromraw win2000.img win2000.vdi --format VDI #VDI形式に変換
```

##仮想マシンの作成
VirtualBoxを起動し仮想マシンを作成します。

一番最初の画面でWindows2000を選択します。これを選択しておくと仮想マシンの構成をレガシーな構成にしてくれますので後々の設定が楽になります。

作成途中のハードディスクを選ぶところで先ほど変換したwin2000.vdiを選択します。

作成できたら以下のあたりを確認します。
- ストレージコントローラーが実機と同じIDEになっているか？
- ディスクのプライマリがwin2000.vdiになっているか？
- ディスクのセカンダリにOptical Driveが追加されているか？（これがないとこの後でドライバーをインストールすることができません）
- ネットワークアダプターがPCnet-FAST III等の古いものが選択されているか？
- システムでEnable I/O APICがオンになっているか？（今回の場合ではオンでないと起動できませんでした）

###起動
完成したら起動してみます。緊張の瞬間ですが、今回の場合はラッキーなことに無事起動できました。

###ドライバーのインストール
起動できたらドライバーをインストールします。DevicesメニューからInsert Guest Additions CD image...を選択するとインストーラーが起動しますのでドライバーをインストールします。

###不要となったデバイスを削除
念のため実機で使われていた不要なデバイスを削除します。非表示になっていることもあるので、コマンドプロンプトを起動し以下のように入力しデバイスマネージャーを起動します。

```text:コマンドプロンプトで実行
set devmgr_show_nonpresent_devices=1
devmgmt.msc
```

表示メニューから非表示のデバイスの表示をクリックすると非表示だったデバイスが表示されますので不要なデバイスを削除します。今回の場合は実機のイーサーネットアダプターとか隠れていました。

##バックアップ
無事起動できたら仮想マシンをバックアップしておきます。バックアップはFile → Export Appliance...で行います。～.ovaという名前で保存されますので、このファイルを外部メディアに保存しておけば、もしホストPCが壊れたとしてもVirtualBoxをインストールしFile → Import Appliance...でリストアすることができます。

##まとめ
今回の件のまとめです。

* Linux + dd + VirtualBoxの組み合わせでP2Vはできる。Windowsは不要。
* Windowsを使わないならバックアップ用HDDはext4フォーマットでもよさそう。ext4なら今回みたいな分割とかしなくてもよさそう。
* バックアップ用HDDはターゲットPC以上の容量が必要。
 * ddとgzipを組み合わせて圧縮しながらファイルに保存することもできそうな気もするのですが今回は試していないのでわかりません。