ジャンル不定の日記です。

リカバリ領域からVirtualboxにWindows7インストール成功した

先日から試していた、東芝ノートPCのリカバリを使ってVirtualbox仮想環境にWindows7インストール成功した。
DVD2枚組のリカバリディスクとHDDのリカバリ領域があるのだが、DVDは入れ替え作業ぽいところでエラーが出て失敗したのでリカバリ領域を使ったインストール。

機種はTOSHIBA dynabook Satellite B450/B (ヤフオクのジャンク品で3,300円)
東芝機ならノートでもデスクトップでも同じ方法でできると思う。

これまでの仮想環境へのリカバリ実験で、
FUJITSU XP (CDx3) → 失敗
HP Vista (DVDx1) → 成功
TOSHIBA 7 (DVDx2) → 失敗
と、今回の、
TOSHIBA 7 (HDD) → 成功
となった。
プリイン回避の改造が必要だったんで、HPのVistaより難しかった。


<実機システム情報の抽出>
システム情報はdmidecodeコマンドのWin32バイナリを拾ってきてコマンドプロンプトから、
dmidecode > dmidecode.txt
てな感じでテキストファイルに保存。
USBメモリを使用して行った。
リカバリを行うときに東芝ノートに偽装する必要があるので使う。


<実機パーティション情報とリカバリ領域イメージの抽出>
Arch Linuxのインストールディスク(USBメモリ)で実機を起動し、外付けHDDに保存した。
リカバリ領域の容量は6GBちょいなので、大きめのUSBメモリでも可能なサイズ。
保存用の外付けディスクが /dev/sdb1 だとして、
# mount /dev/sdb1 /mnt
# fdisk -l > /mnt/fdisk.txt
# dd if=/dev/sda3 of=/mnt/recovery.img bs=512
fdiskの出力を確認しての作業だが、実機パーティションは、
Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1  *         2048   3074047   3072000   1.5G 27 Hidden NTFS WinRE
/dev/sda2         3074048 475801599 472727552 225.4G  7 HPFS/NTFS/exFAT
/dev/sda3       475801600 488396799  12595200     6G 17 Hidden HPFS/NTFS
こんな感じになってて、タイプが17の隠しNTFSのパーティションがリカバリ領域だったんで、このパーティションイメージをファイル化。


<仮想HDDの作成>
実機から抜き取ったのはリカバリ領域のパーティションイメージであってディスクイメージではないので、
仮想HDDを作成してfdiskでパーティションを作り、ddでイメージを書き込む。
作業は、Linuxのインストールディスクなどでも可能だと思うが、
Virtualboxの共有フォルダでパーティションイメージを転送したかったので、構築済みのUbuntu(Xubuntu 14.04)仮想環境を使用した。
仮想HDDは可変サイズVDI形式で40GBとした。
本来はリカバリ領域を単体ディスクにしたかったが、testdiskのブートローダが1番目のHDD以外はブートできない糞仕様の様なので、実機と同じようにHDDの末尾にリカバリ領域がある構成に。
40GBのVDIを作成すると総セクタ数が83886080となり、リカバリ領域のセクタ数が12595200なので、
パーティション1: 始点2048 終点71290879 タイプ7(NTFS)
パーティション2: 始点71290880 末尾まで タイプ17(隠しNTFS) ブータブル
となるようにfdiskでパーティションを構成。
一度ハマったのだが、リカバリ領域ブータブルにしなくてもtestdiskでブート可能なのだが、リカバリツールでエラーになるぽい。
パーティションの構成が終わったらリカバリ領域のパーティションイメージを書き込み。
# dd if=/media/sf_data/recovery.img of=/dev/sdb2 bs=512
共有フォルダ上のイメージファイルが"/media/sf_data/recovery.img"で/dev/sdb2が仮想HDDのリカバリ領域。
リカバリ領域のパーティション番号が2以降で前に空き領域があればパーティション1は不要かもしれない。


<ブートローダのインストール>
引き続き仮想Ubuntu上での作業。
リカバリ領域を起動するのにブートローダが必要だが、testdiskコマンドを使った。
# apt-get install testdisk
# testdisk
[No Log] ↑↓でデバイス選択 [Proceed] [Intel]
[Advanced] [Boot] [Rebuild BS] [Write] [Y]
[MBR Code] [Y] [Y]
testdiskはコマンド選択式のアプリ。
今回は1番目のパーティションが空だが、空のパーティションがある状態で[Analyse]コマンドを使うと、パーティションが削除されて番号が詰められてしまうようなので注意。
リカバリ領域のパーティションがブータブルなのでtestdiskの[MBR Code]で自動で起動できるようだが、
ブータブルの領域がない場合は起動時に"1234F"と表示される。1234はパーティション番号でFはFDDで、選択したものがブートされる。
が、リカバリ領域がブータブルでない場合はリカバリツールでエラーが発生する模様。


<システム情報の偽装>
作成した仮想HDDでリカバリツールが起動できるが、システム情報を偽装して東芝ノートだと思わせないとツールが使えない。
実機のdmidecode出力結果を元に、
VBoxManage setextradata "Win7" "VBoxInternal/Devices/pcbios/0/Config/DmiSystemProduct" "dynabook Satellite B450/B"
てな感じで、VirtualboxのBIOSシステム情報を変更できる。
"Win7"の部分はVM名
続く部分は、"Config/"に続く"DmiSystemProduct"の部分が設定項目。
最後のパラメータが値だが、値に数字以外が含まれる場合はそのまま入力でいいのだが、値が数字のみで構成されている場合は"string:0000000000"の様に書かないとVMが起動できない。
不要な値もあるかもしれないが、
DmiSystemVendor
DmiSystemProduct
DmiSystemSerial
DmiSystemUuid
DmiSystemFamily
DmiSystemSKU
上記6項目を設定したらリカバリツールが使用できた。


<Windows7のインストール>
ここまでの作業でインストール可能になっているので、TOSHIBA Recovery Wizardで仮想HDDの1番目のパーティションにインストールなのだが、
インストール完了後の初回起動時に東芝の追加インストールが始まり、エラーが発生して無限再起動に陥る。
インストール直後に改造する必要があるので、インストール完了で再起動の場面になったら、再起動せずにシャットダウンする。
ちなみに、MBRにtestdiskのブートローダが入っていることが原因だと思うが、HDDから起動すると一度Windowsの修復が発生する。自動で治る。


<プリインストールの改造>
東芝追加インストールで無限再起動に陥るので改造する。今回の作業も仮想Ubuntuで行った。
# mount /dev/sdb1 /mnt
Windowsのパーティションがsdb1なので、マウント。
OSバージョンによって構成が違うと思うが、手元のでは初回起動時に"/ProgramData/Microsoft/Windows/Start Menu/Programs/Startup/B1.BAT"が実行され、更に"/Windows/System32/sysprep/BTOot.bat"実行される構造になってた。
BTOot.batでは、"/Windows/System32/sysprep/"にある"COMPxxx"ディレクトリが存在すると追加インストールされる。
"COMPxxx"ディレクトリ内の"COMPMSG.INI"をみると、何をインストールするのかなんとなくわかる感じだった。
"COMPxxx"ディレクトリが存在しなければインストールが省略されるので、消す。(復元可能な方法で行ったが)
特に、"COMP086"の"Atheros Wireless LAN Driver"が無限再起動の原因ぽかった。
まあ、全部消したw


インストールしてノートPC裏のプロダクトキーで認証もできたのだが、
プロダクトキーで認証するまで、海賊版だとか言われたw
COMPxxxで消さないほうが良いのがあったのかもしれない。
まあ、プロダクトキーで認証できて正規版になったので問題なしぽい。


COMPxxxのプリイン消しすぎたからだと思うが、壁紙すら無いw