SSブログ

Windows XPでのAFT対応ディスクの使用 [Windows]

0. 背景


現在、Windows のサブ環境として、Windows XP を Linux とマルチ・ブートできるようにしている。Windows 環境は MS Office 文書の編集くらいにしか使用しないため使用頻度が低く、その障害時用のサブ環境となると使用頻度はさらに低い。
しかし、Windows XP は Windows にしてはディスク使用量が少なく、動作も軽いため、今もインストールしたままにしている。

先日、この Windwows XP が使用するハードディスクに障害が発生し、ハードディスクの交換を行った。AFT 未対応のハードディスクから AFT 対応のハードディスクへの変更である。

そこで、AFT の機能を使用するため、Windows XP のブートセクタを 63 から 2048 に変更したところ、ブートできない状況となってしまった。

現在サポートされている Windows では問題とならないことではあるが、問題の解決に手間取ったため、備忘録として発生事象と対応方法をまとめてみた。


1. 発生事象


ハードディスクの交換後、Windows XP のブートセクタを 63 から 2048 に変更したところ、ブートできなくなった。

[エラーメッセージ]
A disk read error occurred
Press Ctrl + Alt + Delete to restart


・パーティションのサイズ(セクタ数)はハードディスクの交換前と同じである。
・Linux の GRUB から Windows XP をブートしている。
・パーティションの作成、ファイルシステム(NTFS)の作成は Linux 上で実施。
・バックアップ・データのリストアも Linux 上で実施。


2. 原因


C: ドライブ用のパーティションの PBR(Partition Boot Record) にブートセクタの位置情報が保存されており、この値がパーティションの開始セクタと一致していないためである。


3. 対処方法


下記の手順により、PBR の情報を修正する。

(1) 当該パーティションをフォーマットする(FS type: ntfs)。

# mkfs.ntfs /dev/sda1
または
# mkfs.ntfs -f /dev/sda1


-f オプションを指定した場合には、下記のように動作する。
・ボリュームの 0 クリアをしない。
・セクタの異常の有無をチェックしない。
・このため、フォーマットに要する時間を短縮できる。


(2) 上記パーティションのフォーマット直後の PBR を保存する。

# dd if=/dev/sda1 of=/tmp/pbr.dat bs=512 count=1


(3) 上記パーティションにバックアップ・データをリストアする。


今回は、ntfsclone で取得したバックアップ・データを使用する。


(4) 上記パーティションの PBR の先頭 32 バイトを保存したデータで変更する。

# dd if=/tmp/pbr.dat of=/dev/sda1 bs=32 count=1


・PBR の先頭の 32 バイトには、下記のデータが含まれる。
 Jump instruction (3 バイト)
 OEM name (8 バイト)
 BPB: BIOS Parameter Block の一部 (25 バイト中の 21 バイト)
・実際に修正が必要な項目は、下記の通りである。
 BPB の Hidden Sectors (18-21 の 4 バイト) … ブートセクタの位置情報


4. 備考
4-1. NTFS の PBR (512 バイト) のデータ項目


(1) Jump Instruction (3 バイト)

(2) OEM ID (8 バイト)

(3) BPB: BIOS Parameter Block (25 バイト)


(a) 1 セクタ当たりのバイト数 (2 バイト)
(b) 1 クラスタ当たりのセクタ数 (1 バイト)
(c) 予約セクタ (2 バイト)
(d) 常に 0 (3 バイト)
(e) 未使用 (2 バイト)
(f) メディア・ディスクリプタ (1 バイト)
(g) 常に 0 (2 バイト)
(h) 1 トラック当たりのセクタ数 (2 バイト)
(i) ヘッド数 (2 バイト)
(j) Hidden Sectors (4 バイト)
(k) 未使用 (4 バイト)


(4) Extended BPB (48 バイト)


(a) 未使用 (4 バイト)
(b) 総セクタ数 (8 バイト)
(c) $MFT の開始クラスタ番号 (8 バイト)
(d) $MFTMirr の開始クラスタ番号 (8 バイト)
(e) 1 ファイル・レコード・セグメント当たりのクラスタ数 (4 バイト)
(f) 1 インデックス・ブロック当たりのクラスタ数 (4 バイト)
(g) ボリュームのシリアル番号 (8 バイト)
(h) チェックサム (4 バイト)


(5) Bootstrap Code (426 バイト)

(6) End of Sector Marker (2 バイト)


4-2. NTFS の PBR 内の Hidden Sectors (4 バイト) の取得
# dd if=/dev/sda1 of=/tmp/pbr.dat bs=512 count=1
# od -A x -t x -j 28 -N 4 /tmp/pbr.dat


nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。