/*
 * make backup of CF-R5 by FreeBSD
 *  FreeBSD 的 Let's note CF-R5 のバックアップ方法
 *   by uratan! 2007.4.17, 2007.7.3
 */

Panasonic のノート PC、Let's note CF-R5 の隠しリカバリ領域の バックアップをFreeBSD 的に取ってみました。


●用意する環境
・Let's note CF-R5L
・USB CD-ROM ドライブ
・FreeBSD 6.2R install CD
・親 FreeBSD マシン

各マシンの IP アドレスは以下のとおりと仮定します。
・親 FreeBSD マシン     192.168.7.55
・Let's note CF-R5       192.168.7.66
なお、ネットワークはケーブルを介してつなぎます。 無線 LAN は使えません。
●事前準備
親 FreeBSD マシンにて、以下を準備します。

1. nfs サーバーとして使えるように設定する。
:::: /etc/rc.conf ::::
nfs_server_enable="YES"		# This host is an NFS server (or NO).
nfs_reserved_port_only="YES"	# Provide NFS only on secure port (or NO).
:::: /etc/exports ::::
/usr -maproot=root -alldirs -network=192.168.7.0
2. スペシャル atacontrol を make しておく。
install CD からソースを解凍し、 パッチ を充てて作成します。   (Makefile に "LDFLAGS= -s -static" の 一行を追加する必要があるかもしれません)
# mount /cdrom
# mkdir /usr/xxx
# cd /usr/xxx
# cat /cdrom/6.2-RELEASE/src/ssbin.a* | tar xzvf - sbin/atacontrol
# umount /cdrom
# cd sbin/atacontrol
# patch < /somewhere/someplace/the-patch
# make
●ブート
CF-R5 に USB CD-ROM を接続し、FreeBSD 6.2-RELEASE install CD-ROM にて ブートします。ATA CD-ROM ドライブをそこいらへんの ATA-USB 変換ケーブル で変換したものでもブートできました。
        (2012.10.24 これ 元の ATAPI CD が MATSHITA 製だったからかもしれません)
●HDD プトテクトの解除
installer が起動したら すかさず fixit 環境をたちあげ、network 経由で 親 FreeBSD マシンのディスクをマウントします。
# ifconfig rl0 inet 192.168.7.66
# mount_nfs 192.168.7.55:/usr/xxx /mnt
先に用意したスペシャル atacontrol を使って HDD の領域プロテクトを はずします。
まず現状を確認すると、
# /mnt/sbin/atacontrol cap ad0
...
device model          TOSHIBA MK6034GAX
...
lba48 supported       110912760 sectors
...
と表示されます。
以下の手順により HDD の領域プロテクトをはずし、一度 OS から 切り離すことで変更後の領域を認識させます。
# /mnt/sbin/atacontrol max ad0
# /mnt/sbin/atacontrol detach ata0
# /mnt/sbin/atacontrol attach ata0
# /mnt/sbin/atacontrol cap ad0
...
lba48 supported       117210240 sectors
...
/var/log/messages に残ったログの確認の方がわかりやすいかもしれません。
# dmesg | fgrep TOSHIBA
ad0: 54156MB <TOSHIBA MK6034GAX AC102F> at ata0-master UDMA100
ad0: 57231MB <TOSHIBA MK6034GAX AC102F> at ata0-master UDMA100   <=== 3GB 増えてる
●リカバリーデータの吸出し
親 FreeBSD マシンの HDD に余裕があるならまるごと吸い出すのもいいですが、 (bs をある程度大きくとっておかないと時間がうんとかかります)
# dd if=/dev/ad0 bs=65536 | gzip > /mnt/dd-alldisk.gz
MBR とリカバリー領域だけにとどめておくと効率的ですね。
(ネットワークを流れるデータが極小になるように、こちら側で圧縮します)
# dd if=/dev/ad0 bs=512 count=1 | gzip > /mnt/dd-mbr.gz
# dd if=/dev/ad0 bs=32256 iseek=1760520 | gzip > /mnt/dd-recov.gz
(ここでは 63セクタを 1ブロックとして扱ってまして、
32256 とは: 512[byte/sector] * 63[sector]
1760520 とは: 110912760[LBA] / 63[sector] という意味です)
●おまけ
吸い出したリカバリー領域を別の LBA に置いてブートさせる場合には、 リカバリー領域の先頭セクタに含まれる「自分はここに置いてある」情報の LBA(4バイト)を書き換える必要があるようです。
    |0000 : EB 58 90 49 42 4D 20 20 37 2E 31 00 02 08 20 00  : .X.IBM  7.1... .
    |0010 : 02 00 00 00 00 F8 00 00 3F 00 FF 00 F8 64 9C 06  : ........?....d..
       .     .  .                               ~~~~~~~~~~~ 0x069c64f8 is 110912760
    |01F0 : 42 6F 6F 74 20 66 61 69 6C 75 72 65 00 00 55 AA  : Boot failure..U.



- * - * -


    まだやり方を模索していた頃...





/*
 * make backup of CF-J10V by FreeBSD
 *   by uratan! 2012.6.9
 *   revised:   2022.9.10
 */

Panasonic Let's note CF-J10V のリカバリ領域のバックアップを、 例によって FreeBSD 的に取ってみました。
リカバリ領域は隠されてなかったので普通の作業です。 細かいところは上の CF-R5 のもご参照ください。


●使用した環境
・Let's note CF-J10V
・親 FreeBSD マシン (8.1-RELEASE)
・FreeBSD 8.3-RELEASE install DVD
・USB DVD ドライブ: LF-P968C

なお、ネットワークはケーブルを介してつなぎます。 無線 LAN は使えたとしても遅いですし。
●ブート
BIOS setup にてブートの優先順位を変更します。USB 光学ドライブを内蔵 HDD よりも上にしておきます。
CF-J10V に LF-P968C を接続し、FreeBSD 8.3-RELEASE install DVD にて ブートします。
●shell 環境
installer が起動したら すかさず fixit 環境を立ち上げ…ようとしたら DVD が mount できないとのメッセージが…。
とりあえず Holographic Shell を起動し、なにはともあれ 親 FreeBSD マシンのディスクを mount_nfs します。
/bin のツールの備えでは全然足りないので、親 FreeBSD マシンの /rescue/ を nfs で見える所に丸ごとコピーしました。親マシンの /bin などは 共有ライブラリベースで使えませんでしたので。
8.1R vs 8.3R の OS の minor version の違いはまあ上位互換でしょう。
しかし手作業では DVD を mount_cd9660 できるのにヘンですねぇ。
●リカバリーデータの吸出し
dmesg や fdisk にて HDD の様子を窺ったところ、特に細工はしてない模様 でしたので、後は dd するだけです。
    (HDD のお尻側では さすがにいろいろ無理がある 容量だからかな?)
fdisk の数値も 512bytes/sector のようですし、dd bs=512 で普通に アクセスできるようなので HDD のセクターサイズは 512bytes/sector なのでしょう、よかった。

# /mnt/rescue/dmesg
...
ad4: 238475MB <Hitachi HTS543225A7A384 ESBOA60W> at ata2-master UDMA100 SATA 3Gb/s
...
# /mnt/rescue/atacontrol cap ad4
...
lba supported         268435455 sectors
lba48 supported       488397168 sectors
...
# /mnt/rescue/fdisk ad4
...
The data for partition 1 is:
sysid 39 (0x27),(unknown)
    start 2048, size 30720000 (15000 Meg), flag 0
	beg: cyl 0/ head 32/ sector 33;
	end: cyl 1023/ head 254/ sector 63
The data for partition 2 is:
sysid 39 (0x27),(unknown)
    start 30722048, size 614400 (300 Meg), flag 80 (active)
	beg: cyl 1023/ head 254/ sector 63;
	end: cyl 1023/ head 254/ sector 63
The data for partition 3 is:
sysid 7 (0x07),(NTFS, OS/2 HPFS, QNX-2 (16 bit) or Advanced UNIX)
    start 31336448, size 122880000 (60000 Meg), flag 0
	beg: cyl 1023/ head 254/ sector 63;
	end: cyl 1023/ head 254/ sector 63
The data for partition 4 is:
<UNUSED>
●おまけ
gzip にて圧縮されたバックアップファイルの確認作業中に、dd の妙な 挙動に気が付きまして、以下 8.1-RELEASE での再現例をご覧ください。

% dd if=/dev/random bs=512 count=2000 | gzip > t.gz
2000+0 records in
2000+0 records out
1024000 bytes transferred in 0.786689 secs (1301658 bytes/sec)

% zcat t.gz | dd bs=512 count=100 | wc -c
100+0 records in
100+0 records out
51200 bytes transferred in 0.001149 secs (44562848 bytes/sec)
   51200          <=== correct

% zcat t.gz | dd bs=512 count=1000 | wc -c
993+7 records in
993+7 records out
511850 bytes transferred in 0.032756 secs (15626102 bytes/sec)
  511850          <=== uum...

% zcat t.gz | dd obs=512 | dd bs=512 count=1000 | wc -c
1000+0 records in
1000+0 records out
512000 bytes transferred in 0.038798 secs (13196525 bytes/sec)
  512000          <=== correct
    [参考]

これって…、しかし dd 使うのに block size に気を使うなんて なんか本末転倒な…。



- * - * -


    win7 より前に FreeBSD がブートされた幸せな子(?)




[2022.9.10 追記]
CF-J10V の HDD ですが、半年ほど前から いわゆる「プチフリ症状」が出始めました。 (読めるまでに何度もリトライが必要なセクタが部分的に出現した感じです) 嫌な予感がしつつも だましだまし使い続けていたのですが、 結局 boot 不能にまで至ってしまいました。
なにか予兆を感じていたのか そのちょっと前に取ってた backup はあったのだけれど、 果たして本当に windows 環境を復元できるのかぁ?
    (HDD の換装自体は このページ を参考に すんなりできました)

使用した環境は
    ・親 FreeBSD マシン は 10.2-RELEASE
    ・boot メディアは FreeBSD-12.2-RELEASE-amd64-memstick.img
と上の記述の当時とは違いますが、考え方やり方は基本同じです。

HDD を換装した後の実際の書き戻しはこんな感じで。

# dmesg
...
ada0: <TOSHIBA MQ01ABF050 AM0P6M> ATA8-ACS SATA 2.x device
ada0: 300.000MB/s transfers (SATA 2.x, UDMA5, PIO 8192bytes)
ada0: 476940MB (976773168 512 byte sectors)
...                             (500GBです、AdvancedFormat らしいですけど…)
# ls /dev/*ada*                                 (さらピンなので)
/dev/ada0                                       (partition/slice は無いですが)
# dd if=/mnt/j10/ada0-0-4096.dd of=/dev/ada0          (最初に MBR を書き戻すと)
# ls /dev/*ada*                                       (デバイスが現れますので)
/dev/ada0     /dev/ada0s1   /dev/ada0s2   /dev/ada0s3

# zcat /mnt/j10/ada0s2.dd.gz | dd of=/dev/ada0s2 bs=64k     (その後)
# zcat /mnt/j10/ada0s1.dd.gz | dd of=/dev/ada0s1 bs=256k    (各 slice 毎に)
# zcat /mnt/j10/ada0s3.dd.gz | dd of=/dev/ada0s3 bs=1M      (書き戻せます)

いやーちゃんと復元できましたよ! 良かったっす (手法が正しいことが初めて実証できた)
そして10年もよくがんばった 日立 HDD ! (ここ 8年間は ほぼ 24時間運転だったのに)
んで 見直したよ Windows 7! (エラーリカバリー系が意外と粘り強いことを知った)


    uratan@miomio.jp
upward