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

HDDリカバリ領域(東芝)からVirtualboxへのインストールを試した。

前回東芝ノートのリカバリディスクでWindows7のVirtualbox仮想環境へのインストールを試みたが、
システム情報の偽装はうまく行ってそうだったが、2枚組のリカバリディスクの入れ替えが生じる箇所と思われる場面でエラーが生じて失敗した。
ディスク入れ替えの生じないHDDリカバリ領域からのインストールなら同じ問題は生じないと考えたので、HDDリカバリ領域からのインストールを試みた。


まず、実機でArch Linuxのインストールディスク(USBメモリ)でLinuxを起動。
# loadkeys jp106
# mount /dev/sdb1 /mnt
# fdisk -l > /mnt/fdisk.txt
sdb1はUSB接続した外部HDD。
パーティション情報を保存しておいたほうがいいと思ったので、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
こんな感じだった。
sda2がWindowsのCドライブなのは容量見ればわかるが、
sda1はWindowsの回復機能のパーティションらしい。
sda3がリカバリ領域。それほど大きくないね。
Windowsの回復機能はリカバリを行うと自動的に作られるようなので、sda3のリカバリ領域だけ抽出で良いぽい。
# dd if=/dev/sda3 of=/mnt/sda3.img bs=512
これでUSB接続したHDD上にWindows7のリカバリ領域が sda3.img として作成された。


ここからはVirtualboxのあるメインPCにHDDを繋いで作業。
リカバリ領域のパーティションイメージを抽出したが、Virtualboxで使うのはパーティションイメージではなくドライブ全体のイメージなので、どうするか考えたが、
新規に作成したVDIをLinuxに接続してfdiskでパーティションを作成し、パーティションにddで書き込むことにした。
ddでイメージを読み込むのに共有フォルダを使いたいので、元々あったUbuntuの仮想環境で作業した。

リカバリ領域は単体のHDDにしようと思ったので、
リカバリ領域のパーティションのセクタ数が12595200で開始位置が2048にすると、
VDIのサイズは「(12595200+2048)*512=6449790976」というわけで、6GBちょいのVDIを作成して仮想Ubuntuに接続した。

仮想Ubuntu上で、繋いだHDDはfdiskコマンドで開始セクタが初期値の2048で末尾までのパーティションを作成。
実機のパーティションはID17の隠しNTFSだったが、ブートするのに隠れてないNTFSの必要があるかと思ったので、fdiskのtコマンドでIDを7に変更した。
用意したリカバリ領域のイメージファイルがある場所を共有フォルダにして、作成したパーティションにddコマンドで書き込んだ。

1番目のパーティションにリカバリ領域があるHDDができたが、起動するためのブートローダが必要だが、
testdiskコマンドでWindows用のブートローダをMBRに書き込めるようなので使用した。
sudo testdisk

[No Log]
↑↓でデバイス選択
[Proceed]
[Intel]

[Analyse]
[Quick Search]
←→で*=Primary bootableに変更
[Write]

[Advanced]
[Boot]
[Rebuild BS]

[MBR Code]
testdiskは選択式のツールだが、流れはこんな感じ。
[Analyse]で見つかったパーティションをプライマリのブートパーティションに変更できる。
[Advanced]で[Rebuild BS]するとパーティションがブート可能になる。
[MBR Code]でMBRにブートローダがインストールできる。


作成したディスクでブート可能だったのだが、問題が生じた。
testdiskコマンドでMBRにインストールできるブートローダは、1番目のドライブじゃないとブートできない糞ローダだった・・・
作成した仮想ドライブを1番目のドライブとしてVMを起動するとリカバリ領域が起動するのだが、リカバリは1番目のパーティションに対して行われる。
作成したリカバリドライブを2番目のドライブにして起動するつもりだったが、できない。
VirtualboxでSATAのホットプラグが行えるので、リカバリ領域起動後にリカバリ対象のドライブを接続するということをやってみたが、途中で入れ替わっちゃダメらしい。


というわけで、もっとましなブートローダがあればリカバリディスクを単体のHDDとして作成できそうではあるが、
実機と同じようにパーティションを分割して、後ろにリカバリ領域がある構成にして、インストール成功したら後からリカバリ領域を消すことにした。


VDIを40GBで作りなおして、総セクタ数が83886080となり、リカバリ領域を残すと1番目のパーティションの終了位置は71290879。残りが全部リカバリ領域。
両方共パーティションタイプはID7の普通のNTFS。

で、ddでリカバリ領域のパーティションに書き込んでtestdiskでMBRにブートローダを書き込んで起動してみたら、
HDDの1番目のパーティションが消えてリカバリ領域が1番目になってた。
1番目のパーティションは空のままだったが、testdiskで[Analyse]するとファイルシステムがなかったら消されちゃうらしい。
あと、[Rebuild BS]でだと思うがパーティションタイプがID17の隠しNTFSに変わってたんだが、ブートは可能だった。

というわけで、testdiskの[Analyse]はパーティションを見つけるための機能で、
fdiskではaコマンドでブータブルにできるのでtestdiskの[Analyse]は使う必要ないぽい。
もう一度fdiskでパーティションを作り直し、
1番目のパーティションは開始位置が2048で終了位置が71290879、タイプ7のNTFS。
2番目のパーティションは残り全部で、タイプ17の隠しNTFSとした。
testdiskでは、
[Advanced]の[Rebuild BS]、[MBR Code]
でリカバリ領域をブート可能にしてMBRにブートローダ書き込み。

作成されたHDDを繋いだVMで起動し、2番目のパーティションからリカバリ領域がブートでき、インストールに成功した!


のだが、インストール直後のリブートで一回Windowsの回復が発生してブートローダの修復?後にWindows7が起動したのだが、
初回インストール時に東芝の追加ソフトがインストールが始まるのだが、
無線LANのインストールぽいところで死んで無限再起動に陥る・・・
Alt+Ctrl+Delとか、
初回ブートの東芝インストーラーが、
/ProgramData/Microsoft/Windows/Start Menu/Programs/Startup/B1.BAT (パーティション区切りはLinux表記)
の様なので、中で起動しているコマンドをコメントしてみたり試したりしてたら何時の間にか初回起動にならなくなったのだが、

Administratorが無効で初期ユーザーもいないからログイン不能ぽいことになってWindows壊れたw


東芝の追加ソフトインストールがなければ突破できそうなんで頑張れば行けそうなのだが、今回は失敗。
なんとかなりそうな気ががするので、もうちょっと頑張ってみる。