从一个分区复制到另一个分区后使 Windows 可启动

从一个分区复制到另一个分区后使 Windows 可启动

我已经从笔记本电脑附带的救援 DVD 中恢复了 Windows7。恢复过程将 SSD 驱动器重新分区为出厂默认设置,但我想更改这一点。更确切地说,恢复完成后,分区如下:

root@ubuntu:~# fdisk -l /dev/sda

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048   419432447   209715200   27  Hidden NTFS WinRE
/dev/sda2   *   419432448   419637247      102400    7  HPFS/NTFS/exFAT
/dev/sda3       419637248   839067647   209715200    7  HPFS/NTFS/exFAT

评论:

  • /dev/sda2是一个具有bootmgr和 的小分区Boot
  • Windows7 安装在 上,但该分区上/dev/sda3没有。bootmgr

现在我想将 Windows7 从 复制/dev/sda3/dev/sda1并使其可启动。由于分区大小相同,因此在 Linux 中这非常简单:

root@ubuntu:~# dd if=/dev/sda3 of=/dev/sda1 bs=4096

之后我改变了分区类型:

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048   419432447   209715200    7  HPFS/NTFS/exFAT
/dev/sda2   *   419432448   419637247      102400    7  HPFS/NTFS/exFAT
/dev/sda3       419637248   839067647   209715200    7  HPFS/NTFS/exFAT

然后我重新启动了。Windows7 从/dev/sda3(变为C:)启动并/dev/sda1变为D:。现在我让 Windows7 复制为可启动的(参见使用 BCDBoot 将我的 Windows 7 启动盘从 D 切换到 C是否可以将所有 Windows 7 文件从一个 HD 复制到另一个 HD ?):

C:\> bcdboot d:\windows /s d:
Boot files successfully created.

C:\> bootsect /nt60 d: /mbr
Target volumes will be updated with BOOTMGR compatible bootcode.
F: (\\?\Volume{b6e65e71-6179-11e5-82c7-806e6f6e6963})
Successfully updated NTFS filesystem bootcode.
\??\PhysicalDrive0
Successfully updated disk bootcode.
Bootcode was successfully updated on all targeted volumes.

再检查一遍:

C:\> bcdedit

Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
description             Windows Boot Manager
locale                  en-US
inherit                 {globalsettings}
default                 {current}
resumeobject            {0b9ac05e-6182-11e5-b742-8dbb81fd6d74}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 30

Windows Boot Loader
-------------------
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.exe
description             Windows 7
locale                  en-US
inherit                 {bootloadersettings}
recoverysequence        {0b9ac060-6182-11e5-b742-8dbb81fd6d74}
recoveryenabled         Yes
osdevice                partition=C:
systemroot              \Windows
resumeobject            {0b9ac05e-6182-11e5-b742-8dbb81fd6d74}
nx                      OptIn

C:\> bcdedit /store D:\Boot\BCD

Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  partition=D:
description             Windows Boot Manager
locale                  en-us
inherit                 {globalsettings}
default                 {default}
resumeobject            {f38db522-680d-11e5-829a-18f46ae2d7b0}
displayorder            {default}
toolsdisplayorder       {memdiag}
timeout                 30

Windows Boot Loader
-------------------
identifier              {default}
device                  partition=D:
path                    \windows\system32\winload.exe
description             Windows 7
locale                  en-us
inherit                 {bootloadersettings}
osdevice                partition=D:
systemroot              \windows
resumeobject            {f38db522-680d-11e5-829a-18f46ae2d7b0}
nx                      OptIn
detecthal               Yes

在我启动 Linux 并将分区标记为可启动后(可以在 Windows 上执行此操作,但我使用我熟悉的工具):

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   419432447   209715200    7  HPFS/NTFS/exFAT
/dev/sda2       419432448   419637247      102400    7  HPFS/NTFS/exFAT
/dev/sda3       419637248   839067647   209715200   27  Hidden NTFS WinRE

内容/dev/sda1如下(再检查一下):

root@ubuntu:~# ls -l /mnt/sda1
total 10749077
drwxrwxrwx 1 root root       4096 Sep 25 06:11 Boot
-rwxrwxrwx 1 root root     383786 Nov 20  2010 bootmgr
drwxrwxrwx 1 root root          0 Sep 23 21:50 Config.Msi
lrwxrwxrwx 2 root root         60 Jul 14  2009 Documents and Settings -> /mnt/sda1/Users
-rwxrwxrwx 1 root root 4717092864 Sep 23 21:50 hiberfil.sys
-rwxrwxrwx 1 root root 6289461248 Sep 23 21:50 pagefile.sys
drwxrwxrwx 1 root root          0 Jul 14  2009 PerfLogs
drwxrwxrwx 1 root root       4096 Sep 23 20:35 ProgramData
drwxrwxrwx 1 root root       8192 Sep 23 21:26 Program Files
drwxrwxrwx 1 root root      12288 Sep 23 21:12 Program Files (x86)
drwxrwxrwx 1 root root       4096 Sep 22 22:00 $Recycle.Bin
drwxrwxrwx 1 root root      20480 Sep 23 21:50 System Volume Information
drwxrwxrwx 1 root root       4096 Sep 23 21:05 Temp
drwxrwxrwx 1 root root          0 Sep 23 21:50 Update
drwxrwxrwx 1 root root       4096 Sep 22 21:58 Users
-rwxrwxrwx 1 root root       4112 Jul 19  2011 version
drwxrwxrwx 1 root root      24576 Sep 23 21:02 Windows

看起来不错。不幸的是,当我启动时,我得到了Bootmgr is missing. Press Ctrl+Alt+Del to restart

我已经安装 Grub 到/dev/sda1(覆盖默认引导加载程序):

grub-install --force --no-floppy --boot-directory=/mnt/sda1/Boot /dev/sda1

内容如下/mnt/sda1/Boot/grub/grub.cfg

menuentry "Windows 7" {
    insmod ntfs
    insmod ntldr
    ntldr (hd0,msdos1)/bootmgr
}

Grub 正确地将控制权传递给了bootmgr,但它始终从 启动/dev/sda3。当我删除分区时/dev/sda3初始启动屏幕显示了,但是什么也没有发生(启动只是挂起)。

接下来我安装ntldr/dev/sda1NTDETECT.COM复制NTLDR64nt文件.zip)具有“本机”引导扇区:

C:\> bootsect /nt52 d:

和这个boot.ini

[Boot Loader]
timeout=30
Default=multi(0)disk(0)rdisk(0)partition(1)\Windows

[Operating Systems]
multi(0)disk(0)rdisk(0)partition(1)\Windows="Windows 7 (boot.ini)" /fastdetect

启动后显示“发生磁盘读取错误”。SSD 驱动器肯定不太可能出现这样的故障,所以我认为问题在于启动字节码/逻辑无法正确处理驱动器的寻址/布局。我已经安装了 Grub(如上所述),配置如下:

menuentry "Windows 7" {
    insmod ntfs
    insmod ntldr
    ntldr (hd0,msdos1)/ntldr
}

然后我就可以看到如上所示的菜单了boot.ini。当我继续时,计算机重新启动,没有任何错误消息(所以我陷入了困境)。

如何修复该问题?欢迎任何从第一个分区启动 Windows 的解决方案。

我检查过的有关该主题的其他帖子:

PS:测试时,请勿将其他驱动器或 USB 记忆棒连接到笔记本电脑。

答案1

将 sda3 复制到 sda1 后,Windows 注册表中 sda1 上仍有一些“指针”指向 sda3。检查 HKLM\SYSTEM\MountedDevices\DosDevices\C: 和 D: 的内容是否指向正确的分区。(\DosDevices\C: 值是分区签名 - 应该是 sda1 的签名)

为 sda1 创建启动文件:(当启动到 sda3 映射到 c: 时,sda1 映射到 d:)

  1. bootsect /nt60 d: /mbr - 设置 sda1 分区引导代码(将 Windows 引导代码写入 MBR 无害)

  2. bcdboot d:\windows /sd: - 在 sda1 上创建 BCD

您不必编辑 sda2 上现有的系统 BCD 和 sda1 上的 BCD!!!

最后将活动分区更改为 sda1。

重启。

如何将 Windows 7 启动文件移动到另一个驱动器/分区求助。

答案2

我写下了一些解决这个问题的步骤,对我来说很有用,所以我希望它也能帮助未来的读者,甚至可能对 OP 也有帮助,尽管已经有一段时间了。


我曾经将 Windows 7 从较小、较慢的硬盘上的一个分区迁移到 Dell OptiPlex 780 MT 中较快的硬盘分区的过程

  1. 获取 USB 闪存盘
    • 建议 32 GB 以上
    • 我使用了 Amazon Smiles,这样我就可以在购物时向慈善机构捐款
  2. 在其中一个可启动的 USB 闪存驱动器上创建系统救援 CD
    • 自从我上次使用它以来,它已经变得非常大,需要 16 GB 以上
    • 使用 Rufus 在 Windows 中按照 SysResc CD 说明进行操作
  3. 将卷缩小到最小大小,在操作系统分区上留下约 40 GB 的可用空间
    • 目标是在新硬盘上有足够的未分配空间,以匹配或超过原始 Windows 7 分区的大小
    • 将分区中的数据备份/移动到 USB 闪存驱动器或其他外部驱动器
    • 运行磁盘清理和碎片整理
    • W7 中的 DiskMgmt.MSC 现在可用于扩展/缩小卷
  4. 启动系统救援 CD
    • 警告:如果您的 BIOS 系统和管理员密码使用大写字母,则 System Rescue CD 会认为您正在尝试自定义启动它。它会将您留在 LILO 样式的 Boot: 提示符下,没有任何启动说明、帮助、命令等。我清除了 BIOS 系统密码,以便它能够进入默认启动菜单
    • 启动成功后,运行startx进入 GUI
      • 运行 GPartEd
        • 转到当前安装 Windows 7 的较慢的旧驱动器,并复制 Windows 分区
        • 转到具有未分配空间的新更快驱动器,然后粘贴复制的分区
        • 该操作可能需要几分钟,具体取决于您的硬件,但会提供进度条
        • 将复制的 Windows 7 分区标记为活动
      • 进入终端/命令窗口
        • 运行testdisk并创建/重置新 Windows 7 分区的启动扇区(不知道这一步是否必要,但我就是这么做的)
          • Google 使用 testdisk 恢复分区上的引导扇区
        • 使用以下方法创建 /mnt/Dell 和 /mnt/Win7 文件夹mkdir
          • 当你下次启动系统救援 CD/USB 时,这些将会消失
        • mount使用命令 将旧的 Dell Recovery 分区挂载到 /mnt/Dell
          • mount /dev/hdb1 /mnt/Dell
        • 将新的 Windows 7 分区挂载到 /mnt/Win7
          • mount /dev/hda4 /mnt/Win7
        • 将 Windows 引导加载程序文件复制到新的 Windows 7 分区
          • 使用以下方式创建 /mnt/Win7/Boot 文件夹mkdir
          • cp使用命令将 /mnt/Dell/bootmgr 复制到 /mnt/Win7/
          • cp /mnt/Dell/boot.sdi /mnt/Win7/
          • cp /mnt/Dell/Boot/BCD /mnt/Win7/Boot/
          • 您也可以复制 /Boot/BCD.LOG 文件,但不确定是否有必要
          • 请记住,此启动配置仍指向旧的 Windows 7 启动和系统分区。需要对其进行编辑以指向新的 Windows 7 启动和系统分区(在我的情况下是同一个)
  5. 启动到 BIOS
    • 将启动设备从旧驱动器更改为新驱动器
    • 或者,你可以使用启动菜单从新的 Windows 7 分区成功启动
  6. 启动至 Windows 7
    • 由于它指向旧的启动和系统分区,因此它仍在旧硬盘上工作
    • C: 盘是旧系统
    • 以管理员身份打开 Cmd 提示符
      • 运行DiskMgmt.MSC
        • 如果新的 Windows 7 分区尚未分配驱动器号,请为其指定一个驱动器号(在我的情况下为 G:)
      • 导航到 G:\Boot 目录
        • G:
        • cd Boot
      • 使用以下方式显示新分区上的启动配置bcedit /store BCD
        • 记下当前的旧启动 GUID(在我的情况下为 {d57db94d-450e-11e5-a383-b8ac6f1ac098})
      • 编辑新复制的启动配置以添加新的 Windows 7 分区
        • 参考添加启动项
        • bcdedit /store /copy {d57db94d-450e-11e5-a383-b8ac6f1ac098} /d "Win7 Debug"
          • 新的 W7 分区 GUID 现在为 {c15e345e-9c47-11ea-a7d8-b8ac6f1ac098}
        • bcdedit /store BCD /enum /v(查看 GUID 以供参考)
        • 参考如何将 Windows 7 启动文件 bootmgr 移动到其他驱动器(非常感谢 red.october 在此网站上发布他的问题和答案!)
        • bcdedit /store BCD /set {bootmgr} device partition=G:
        • 在我的案例中采取的其他步骤
          • bcdedit /store BCD /set {c15e345e-9c47-11ea-a7d8-b8ac6f1ac098} device partition=G:
          • bcdedit /store BCD /set {c15e345e-9c47-11ea-a7d8-b8ac6f1ac098} osdevice partition=G:
          • bcdedit /store BCD /displayorder {c15e345e-9c47-11ea-a7d8-b8ac6f1ac098} {d57db94d-450e-11e5-a383-b8ac6f1ac098}
          • (可选)将新的启动分区设为默认分区
            • bcdedit /default {c15e345e-9c47-11ea-a7d8-b8ac6f1ac098}
  7. 重新启动至系统救援 CD/USB
    • 使用 GPartEd 将旧的 Windows 7 分区标记为隐藏
    • 取消标记旧 Dell System Recovery 分区上的启动标志
  8. 在新驱动器上重新启动到 Windows 7

如果您没有犯任何错误,并且在任何步骤中都没有遇到任何困难或错误,那么您就和我一样,成功地将 Windows 7 分区和 Windows 7 启动管理器从原始硬盘上的一个分区迁移到另一个硬盘上的新分区,而无需使用 Windows 7 恢复盘(OEM 经销商不会随 PC 提供此恢复盘),也无需使用可疑的第三方应用程序。令人惊喜的是,如果您在迁移之前有任何 EFS 加密的文件或文件夹,那么它们仍然可以在新分区上访问,而无需先解密。DiskMgmt.MSC 现在将新的 Windows 7 分区显示为 C:,而旧的 Windows 7 分区没有驱动器号。

一旦启动到完全独立于原始硬盘的新 Windows 7 分区,您就可以探索如何清理该分区上的引导加载程序,将所有内容指向它,而不是旧的 Windows 7 分区。如果您像我一样在新驱动器上有一个 Windows XP 分区,那么您也可以使用 bcdedit 添加一个条目来启动它。在您确信一切稳定后,您可以擦除旧分区并将其用于其他目的。我真心希望这能帮助其他人完成类似的努力。


迁移后的 W7 磁盘管理:

迁移后的 W7 磁盘管理

相关内容