ThinkPad X60s DtoD(Disk to Disk) リカバリー領域の移植

ThinkPad X60s を買った。
安かったので HDD 40GB のモデルを購入したんだけど、もちろんそんな容量では話にならないので、さっそく HDD を換装した。
その際 DtoD(Disk to Disk)リカバリー領域を移植したので、その時の記録を残しておこうと思う。なお、本体と換装用ドライブ以外に私が使ったのは以下のもの。

  • USB 接続 HDD ケース (2.5" SATA 用)
  • Linux マシン1台
    • PXE ブート用の母艦。USB CD-ROM ドライブとかで Knoppix 等を起動できるなら不要。
  • Windows マシン1台
    • Lenovo からダウンロードするリカバリーディスクの FD イメージが自己展開式の .exe で配布されてるので必要。
  • USB FDD
    • リカバリーディスクを起動するのに必要。ネットワークブートが出来るなら memdisk (syslinux に同梱)を使えるので不要かも。
  • Debian(etch) の netboot インストーラ
    • 試行錯誤の度にネットワークブートするのが面倒だったので、etch をインストールしてしまった。

私がやった手順は以下のとおり。

  1. ドライブを換装する。元のドライブは USB 接続な HDD ケースに納める。
  2. 有線 LAN を使ってネットワークブート。適当なディスクレス Linux 環境を起動させる。また、USB に移植元のドライブを接続して認識したことを確認する(dmesg とか /proc/partitions とか)。
    • 以後、移植先のディスクを /dev/sda、移植元のディスクを /dev/sdb とする。
    • 私はこの時に HDD に Debian GNU/Linux をインストールした。
  3. " fdisk -l /dev/sdb " などで DtoD 領域のサイズを確認した後、移植先の HDD に適当にパーティションを確保して、dd でパーティション内容を丸ごとコピー。
    • パーティションID 0x12 なのが DtoD 領域。もちろん、移植先パーティションの ID も 0x12 にしておく。
    • 移植元が /dev/sdb2、移植先が /dev/sda2 なら、普通に dd if=/dev/sdb2 of=/dev/sda2
    • 移植先のパーティションはディスクのどこに確保しても大丈夫なようだが、とりあえずディスクの末尾に作ってみた。
    • dd が終われば移植元のディスクはもう使わないので、ケーブルを抜いておく。
  4. 移植先のディスクのジオメトリ情報を記録しておく。
    • sfdisk -l /dev/sda
    • fdisk -l /dev/sda
  5. 移植先パーティションのブートレコードを取り出す。(移植先パーティションは /dev/sda2)
    • dd if=/dev/sda2 of=/tmp/sda2.bin count=1
  6. file コマンドなどで、先ほど取り出した中身を確認する。ヘッダ数(heads)、開始セクタ位置(hidden sectors)、セクタ数(sectors)などが実際の値ではなく、移植元のドライブの値になっているはずなので、適当なバイナリエディタ等で修正する。
  7. ブートレコードを移植先パーティションに書き戻す。
    • dd if=/tmp/sda2.bin of=/dev/sda2
  8. Lenovo からリカバリー修復ディスケット]をダウンロードし、そこからブートする。
    • "replace the current mbr" を選ぶ。
  9. 後は、マシン起動時に ThinkVantage ボタンを押せば Rescue and Recovery メニューに入れるはずなので、システムのリカバリーを選択して Windows 環境を復旧させれば作業終了。

以上の方法は「私の場合、それで出来た」というだけであって、当然ながらあらゆる保証はしないので、参考にする場合は At your own risk で。それに、たぶんもっと簡単な方法がありそうな気がする。
その他、作業中に気づいた点などは以下のとおり。

  • DtoD 領域は、パーティション ID こそ特殊なものの、中身は FAT32
  • とは言え、ブートレコードが特殊らしく、普通に DOSWindows のブートが可能な FAT32 パーティションを作成し、ファイルをコピーする、という方法ではダメなようだ。

なお、今回の作業にあたって、X40 - ThinkPad X60s/X40/X31 メモ の記述がたいへん参考になったことを申し添えておく。

*1:結果はこんな感じ。> sda2.bin: x86 boot sector, code offset 0x58, OEM-ID "MSDOS5.0", sectors/cluster 8, Media descriptor 0xf8, heads 255, hidden sectors 225520470, sectors 8916074 (volumes > 32 MB) , FAT (32 bit), sectors/FAT 8680, reserved3 0x800000, serial number 0xccdee5ea, label: "SERVICEV001"