從一個分割區複製到另一個分割區後使 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 檔案從一個硬碟複製到另一個硬碟?):

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/sda1(複製NTDETECT.COMNTLDR來自64nt檔.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:測試時沒有其他驅動器或U盤連接到筆記型電腦。

答案1

將 sda3 複製到 sda1 後,sda1 上的 Windows 登錄中仍然有一些指向 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 提示符
      • 運行磁碟管理.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 啟動管理員從原始硬碟上的一個分割區遷移到另一個硬碟上的新分割區。令人驚訝的是,如果您在遷移之前有任何 EFS 加密的檔案或資料夾,那麼它們仍然可以在新分割區上訪問,而無需先解密。 DiskMgmt.MSC 現在將新的 Windows 7 分割區顯示為 C:,而舊的 Windows 7 分割區則沒有磁碟機號碼。

一旦啟動到完全獨立於原始硬碟機的新 Windows 7 分割區,您就可以探索如何清理該分割區上的啟動載入程序,將所有內容都指向該分割區,而不是舊的 Windows 7 分割區。如果您像我一樣在新磁碟機上有一個 Windows XP 分割區,那麼您也可以使用 bcdedit 新增一個項目來啟動該分割區。當您確信一切穩定後,您可以擦除舊分區並將其用於其他目的。我真誠地希望這可以幫助其他人完成類似的努力。


遷移後的 W7 磁碟管理:

遷移後的 W7 磁碟管理

相關內容