web-dev-qa-db-ja.com

複製されたWindows7 BCDに不完全なデータが含まれている(したがって、起動できない)のはなぜですか?

ハードドライブを小さいものに交換するために、デュアルブートのWindows XP/7ボックスのクローンを作成する必要があるという不幸がありました。起動するのに非常に苦労しました。何が起こっているのか、そしてもっと良いことができるかどうかを理解したいと思います。

背景:マシンには、3つのパーティションを持つ750Gbドライブがあります。

  • Windows XP
  • Windows 7
  • データ

元のインストールは、個別のWindows7リカバリパーティションがないように行われました。この事実が物事をいくらか単純化することを願っています。

80Gbドライブに交換します。パーティションは、Windows 7内から既に縮小されているため、小さいディスクに収まります。

GPartedPartedMagic Linux LiveCDから)を使用して、パーティションをコピーしました。 Windows XPパーティションをアクティブパーティションとしてマークします(元のディスクと同じ)。

大きいディスクから小さいディスクに移行したため、CloneZillaを使用することも、ディスク全体をコピーすることもできませんでした。

パーティションをコピーした後、ブートローダーを手動でコピーしました(パーティションテーブルをコピーしないように注意してください)。

$ dd if=/dev/sda of=/dev/sdb bs=446 count=1

元のディスクを取り外し、元のディスク(IDEチャネル1マスター)と同じように物理的に接続されるように新しいディスクを設定して、起動してみました。これにより、ブートメニューが正常に表示されましたが、いずれかのオプションを選択しても失敗しました(1つはXP用、もう1つはWin7用)です)。

私はかなりの調査を行った結果、Windows7のブート構成データに必要なものがすべて含まれているわけではないことがわかりました。元のディスクと新しいディスクからのBCD出力を比較したところ、後者のデバイスエントリはunknownであることがわかりました。だから私は手動でそれらをオリジナルと一致するように変更しました-このように:

$ bcdedit /set {ntldr} device partition=C:
$ bcdedit /set {default} device partition=D:
$ bcdedit /set {default} osdevice partition=D:

そして再起動しました。今回はXPとWin7の両方を起動できました。2つのBCDの間に他の違いがあるように見えるので、さらにテストを行う必要がありますが、上記の変更を行うと、少なくとも起動が可能になります。

だから私の質問は、クローンされたパーティションのBCDが元のパーティションとは異なって見える理由、そして起動を防ぐのに十分な理由を尋ねることです。

そして、それに対するフォローアップは、私がこれを別の方法で行うべきかどうかを尋ねることです。

9
starfry

Windowsオペレーティングシステムを含むパーティションのクローンを作成した後、クローンされたパーティションが元のパーティションとまったく同じ位置にない場合は、ブート構成データを修正する必要があります。

Windows Vista以降のWindowsブートメカニズムは、その構成を「ブート構成データ」(BCD)として保存します。これは、パーティション番号ではなく、ディスク署名とセクターオフセットによってパーティションを参照します。ディスク署名は、マスターブートレコードに埋め込まれた32ビット値です。セクター0の最初の446バイトをコピーすると、ディスク署名がコピーされます。

クローン作成アクティビティの結果、クローン作成されたディスクパーティションの開始セクターアドレスが元のアドレスと異なる場合(ディスク全体のクローンが使用されていない場合を除く)、これらの対策が適用されるまでクローンは起動に失敗する可能性があります。

基本的に、セクターオフセットを更新する必要があります。そのためには、回復コンソールを使用する必要があります(これは、Windows 7インストールDVDで入手できます)。クローンドライブのみが接続されていることを確認し、Windows7インストールDVDから起動します。最初の画面で言語を選択し、「次へ」をクリックします。次の画面(「今すぐインストール」が表示されている)で、Shift + F10を押してコマンドプロンプトを表示します。

まず、配置されているドライブ文字とそれらが関連するパーティションを確認します。

diskpart
list volume
exit

また、必要に応じて、アクティブなパーティションを再確認します。

diskpart
select disk 0
select part 1
detail part
select part 2
detail part
... and so-on
exit

BIOSシステムでは、BCDはX:\Boot\BCDのファイルに保存されます。ここで、Xはアクティブパーティションのドライブ文字です(UEFIの場合はEFIシステムパーティションにあります)。通常は隠されていますが、

dir /AH X:\Boot

次のようにバックアップできます。

bcdedit /export X:\path\to\bcd\backup

復元しました

bcdedit /import X:\path\to\bcd\backup

ディスクに複数のオペレーティングシステムが搭載されている場合は、複数のBCDが存在する可能性があります。アクティブなBCDは、アクティブとしてマークされているパーティションの\Boot\BCDにあるものです-アクティブなパーティション。その内容をリストするには(冗長性の昇順:)

bcdedit
bcdedit /enum
bcdedit /enum ALL
bcdedit /enum ALL /v

アクティブなBCDを修正するには、正しいパーティションのドライブ文字を確立し、次の手順を実行します。

bcdedit /set {default} osdevice partition=X:
bcdedit /set {default} device partition=X:
bcdedit /set {bootmgr} device partition=X:
bcdedit /set {memdiag} device partition=X:
bcdedit /set {ntldr} device partition=X:

または、別のBCDを修正するには(これらの例では「X:\ boot\bcd」にあります):

bcdedit /store X:\boot\bcd /set {default} osdevice partition=X:
bcdedit /store X:\boot\bcd /set {default} device partition=X:
bcdedit /store X:\boot\bcd /set {bootmgr} device partition=X:
bcdedit /store X:\boot\bcd /set {memdiag} device partition=X:
bcdedit /store X:\boot\bcd /set {ntldr} device partition=X:

たとえば、XPと7があり、XPはC:にあり、7はD:にあると表示されます。アクティブなパーティションはC:です。アクティブなBCDはc:\boot\BCDにあります。ブートマネージャはC:\bootmgrにあり、メモリ診断はC:\boot\memtest.exeにあります。コマンドは次のようになります。

bcdedit /set {ntldr} device partition=C:
bcdedit /set {memdiag} device partition=C:
bcdedit /set {bootmgr} device partition=C:
bcdedit /set {default} device partition=D:
bcdedit /set {default} osdevice partition=D:

これらの変更により、コンピューターを再起動し(Alt-F4を押すとこれが実現します)、DVDを取り外すと、システムが正常に起動しました。

参考文献:

(コピーのパーティションレイアウトは元のパーティションとまったく同じである必要があるため、ディスク全体のクローンでこれらの問題が発生することはありません)

13
starfry

BCD内部に関するこの非公式ドキュメント によると、BCDストア内のパーティションは、実際にはディスク署名とパーティションオフセットによって識別されます。ディスク署名(MBRバイト440〜443)をコピーしましたが、パーティションを小さいディスクに配置するときにパーティションオフセットが変更された可能性が高いため、BOOTMGRはこれらのパーティションを見つけることができなくなりました。

8
Sergey Vlasov