web-dev-qa-db-ja.com

LinuxからWindows7ブートセクターを復元する方法

Windows 7とUbuntuをデュアルブートするラップトップを持っていますが、Windowsを起動しなくなりました。 Windowsパーティションのブートセクター(MBRではなくパーティションの先頭!)が壊れていると確信しています。 Linuxから復元するにはどうすればよいですか?

(ラップトップにはDVDドライブがありません。前回、何度か試行したので、WindowsインストールUSBを作成したくありません。また、Windowsインストーラーは、ブートセクターだけでなく、MBRも上書きし、強制終了します。 GRUBなので、後でUbuntuを修正する必要があります。)


詳細:

パーティションのレイアウトは次のとおりです。

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1              54   151129367    75564657    5  Extended
/dev/sda2       151129368   302247179    75558906    7  HPFS/NTFS/exFAT
/dev/sda3   *   302247180   312497351     5125086    c  W95 FAT32 (LBA)
/dev/sda4       312497352   312578243       40446   ef  EFI (FAT-12/16/32)
/dev/sda5             108     4194827     2097360   82  Linux swap / Solaris
/dev/sda6         4194882   151129367    73467243   83  Linux

sda1は、Linux(sda4、sda5、およびsda6)を含む拡張パーティションです。 sda3はリカバリパーティションです(変更されたWindows XPのようです)。 sda2はWindows7パーティション(NTFS)です。 Linuxからマウントできますが、すべてがそこにあるようです。

GrubはWindows7を起動できません。起動メニューには“Windows”(おかしな引用符に注意)というエントリが含まれており、もちろん失敗して(hd0,1) = sda1を起動しようとします。 手動で sda3を起動できますが、それは意味がありません。

Sda2(Windows 7)を起動しようとすると、「NTLDRが見つかりません」というメッセージが表示されます。 Windows 7はNTLDRを使用せず、BOOTMGRを使用するため、これは奇妙です。これがどのように中断されたかは覚えていませんが(しばらく前に発生しました)、そのパーティションに間違ったブートセクタをインストールしようとした回復ツールがあると思います。これは、パーティションの始まりがどのように見えるかです。

$ Sudo dd if=/dev/sda2 bs=512 count=1 | hd
00000000  eb 52 90 4e 54 46 53 20  20 20 20 00 02 08 00 00  |.R.NTFS    .....|
00000010  00 00 00 00 00 f8 00 00  36 00 d6 00 18 0d 02 09  |........6.......|
00000020  00 00 00 00 80 00 80 00  f3 df 01 09 00 00 00 00  |................|
[...]
00000170  b4 01 8b f0 ac 3c 00 74  09 b4 0e bb 07 00 cd 10  |.....<.t........|
00000180  eb f2 c3 0d 0a 41 20 64  69 73 6b 20 72 65 61 64  |.....A disk read|
00000190  20 65 72 72 6f 72 20 6f  63 63 75 72 72 65 64 00  | error occurred.|
000001a0  0d 0a 4e 54 4c 44 52 20  69 73 20 6d 69 73 73 69  |..NTLDR is missi|
000001b0  6e 67 00 0d 0a 4e 54 4c  44 52 20 69 73 20 63 6f  |ng...NTLDR is co|
[...]

Update-grubとboot-repairを試しても無駄だったと言わざるを得ません。 Grubがインストールされ、正しく機能しています。問題は、GrubによってチェーンロードされるWindowsローダーです。必要なのは、Linuxの場合はbootsect /nt60 C:のようなもの、またはブートローダーのクリーンコピーをパーティションに取得する方法です。何か案は?

3
jdm

私がこれを長い間試してきたのはおかしいです、そしてここに投稿した直後に解決策を見つけました。私はWindows7 RecoveryUSBスティックに出くわしました。

  1. スティックから起動します。 USBポートのスティックでコールドブートを実行する必要がありました。そうしないと、PCがそれを認識しませんでした。次に、grubに(hd1)から起動するように指示する必要がありました。

  2. リカバリディスクはものを修復するために提供するかもしれませんが、それは私にとってはうまくいきませんでした。

  3. コマンドプロンプトを開始し、次の手順を実行します。

    ブートローダーをコピーします。 X:はリカバリドライブ、C:はラップトップのパーティションです。

    copy x:\windows\boot\pcat\bootmgr c:\bootmgr
    attrib +s +h c:\bootmgr
    

    それが機能しない場合は、最初にbootmgrを削除する必要があります。

    c:
    attrib -s -h bootmgr
    del bootmgr
    
  4. ブートローダーを正しくインストールします。 X:\windows\system32からの呼び出し:

    bootsect /nt60 c:
    bootrec /fixboot
    

    2行目は適切な測定のためのものであり、必要かどうかはわかりません。 bootrect /fixmbrを実行しないでください。これにより、GRUBが上書きされます。

今は機能する可能性がありますが、機能しない場合は、ブートメニューデータ(BCD)を再作成する必要があります。回復プロンプトから:

attrib -s -h C:\boot
ren C:\boot C:\bootbak
bootrec /rebuildbcd

ここで再起動します。 grubに(hd0,2)またはWindowsパーティションが何であれから起動するように指示すると、動作するはずです。 grub-updateの後、Windows7が再びメニューに正しく表示されます。

リソース:

1
jdm