Tại sao BCD Windows 7 nhân bản chứa dữ liệu không đầy đủ (và do đó, ngăn chặn việc khởi động)?


9

Tôi đã không may phải sao chép một hộp Windows XP / 7 khởi động kép để thay thế ổ cứng của nó bằng một cái nhỏ hơn. Tôi gặp khó khăn lớn khi khởi động nó và muốn hiểu chuyện gì đang xảy ra và liệu tôi có thể làm gì tốt hơn không.

Bối cảnh: máy có ổ đĩa 750Gb với 3 phân vùng trên đó:

  • Windows XP
  • Windows 7
  • Dữ liệu

Việc cài đặt ban đầu được thực hiện theo cách không có phân vùng phục hồi Windows 7 riêng biệt. Tôi hy vọng thực tế này đơn giản hóa mọi thứ phần nào.

Tôi đang thay thế nó bằng một ổ đĩa 80Gb. Các phân vùng đã được thu nhỏ từ bên trong Windows 7 để chúng vừa với đĩa nhỏ hơn.

Tôi đã sử dụng GParted(từ PartedMagicLinux LiveCD) để sao chép các phân vùng trên. Tôi đánh dấu phân vùng Windows XP là phân vùng hoạt động (giống như trên đĩa gốc).

Tôi không thể sử dụng CloneZillahoặc thực hiện toàn bộ bản sao đĩa do quá trình chuyển từ đĩa lớn hơn sang đĩa nhỏ hơn.

Sau khi sao chép các phân vùng, tôi đã sao chép thủ công bộ tải khởi động (chú ý không sao chép bảng phân vùng):

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

Tôi đã gỡ bỏ đĩa gốc, đặt đĩa mới để nó được kết nối vật lý giống như bản gốc (IDE channel 1 master) và thử khởi động. Điều này đã trình bày thành công menu khởi động nhưng không thành công khi chọn một trong hai tùy chọn (có hai: một cho XP và một cho Win7).

Tôi đã thực hiện một số nghiên cứu hợp lý cho phép tôi nhận ra dữ liệu cấu hình khởi động Windows 7 không chứa mọi thứ cần thiết. Tôi đã so sánh đầu ra BCD từ các đĩa gốc và đĩa mới và lưu ý rằng các mục thiết bị trên đĩa sau là unknown. Vì vậy, tôi tự thay đổi chúng để phù hợp với bản gốc - như thế này:

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

và khởi động lại. Lần này tôi có thể khởi động cả XP và Win7. Tôi cần phải thử nghiệm nhiều hơn vì dường như có sự khác biệt khác giữa hai BCD, nhưng thực hiện các thay đổi trên ít nhất là cho phép khởi động.

Vì vậy, câu hỏi của tôi là thực sự hỏi tại sao BCD trên một phân vùng nhân bản sẽ xuất hiện khác với bản gốc, và đủ để ngăn chặn việc khởi động?

Và tiếp theo đó là hỏi tôi có nên làm theo cách này không?

Câu trả lời:


13

Sau khi nhân bản các phân vùng chứa hệ điều hành Windows, cần phải sửa dữ liệu cấu hình khởi động nếu các phân vùng nhân bản không ở cùng một vị trí trên đĩa nhân bản như trên bản gốc.

Cơ chế khởi động Windows, kể từ Windows Vista, lưu trữ cấu hình của nó là "Dữ liệu cấu hình khởi động" (BCD) và điều này đề cập đến các phân vùng, không phải bởi số phân vùng mà bằng chữ ký đĩa và phần bù. Chữ ký đĩa là giá trị 32 bit được nhúng trong Bản ghi khởi động chính. Sao chép 446 byte đầu tiên của sector 0 sẽ sao chép chữ ký đĩa.

Nếu các hoạt động nhân bản dẫn đến các phân vùng đĩa nhân bản có địa chỉ khu vực bắt đầu khác nhau thì các phân vùng ban đầu (rất có thể trừ khi sử dụng bản sao toàn bộ đĩa), thì bản sao đó rất có thể sẽ không khởi động được cho đến khi các biện pháp này được áp dụng.

Về cơ bản, các phần bù ngành cần được cập nhật và, đối với điều này, bạn sẽ cần sử dụng bảng điều khiển khôi phục (điều này có sẵn trên DVD cài đặt Windows 7). Đảm bảo chỉ có ổ đĩa nhân bản được gắn và khởi động từ DVD cài đặt Windows 7. Ở màn hình đầu tiên, lựa chọn ngôn ngữ và nhấn "tiếp theo". Ở màn hình tiếp theo (nơi "cài đặt ngay" được hiển thị), nhấn SHIFT + F10 để nhận dấu nhắc lệnh.

Đầu tiên, xác nhận các ký tự ổ đĩa được đặt đúng chỗ và các phân vùng mà chúng liên quan:

diskpart
list volume
exit

Ngoài ra, nếu bạn cần, xác nhận lại phân vùng hoạt động:

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

Trên hệ thống BIOS, BCD được lưu trữ trong một tệp tại X:\Boot\BCDđó Xlà ký tự ổ đĩa của phân vùng hoạt động (đối với UEFI, nó nằm trong Phân vùng hệ thống EFI). Thông thường ẩn, nó có thể được nhìn thấy với

dir /AH X:\Boot

Nó có thể được sao lưu như thế này:

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

và khôi phục

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

Nếu một đĩa có nhiều hệ điều hành trên đó, có thể có nhiều BCD. BCD hoạt động là một trong tại \Boot\BCDphân vùng được đánh dấu là hoạt động - phân vùng hoạt động . Để liệt kê nội dung của nó (theo thứ tự tăng dần về độ dài :)

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

Để sửa lỗi BCD hoạt động, hãy thiết lập các ký tự ổ đĩa cho các phân vùng chính xác và thực hiện:

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:

hoặc, để sửa lỗi BCD khác (tại "X: \ boot \ bcd" trong các ví dụ này):

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:

Ví dụ: hệ thống của tôi có XP và 7 và chúng hiển thị XP là bật C:và 7 đang bật D:và phân vùng hoạt động là C:. sau đó BCD hoạt động sẽ ở c:\boot\BCD. Trình quản lý khởi động sẽ được tìm thấy tại C:\bootmgrvà chẩn đoán bộ nhớ sẽ ở C:\boot\memtest.exe, Các lệnh bắt buộc sẽ là:

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:

Với những thay đổi đó, khởi động lại máy tính (Nhấn Alt-F4 sẽ đạt được điều này) và xóa DVD cho phép hệ thống khởi động thành công.

Đọc thêm:

(một bản sao toàn bộ đĩa không nên chịu những vấn đề này vì bố cục phân vùng trên bản sao phải giống hệt như bản gốc)


Lưu ý rằng bcdbootcung cấp một cách dễ dàng hơn để tạo lại một mục khởi động, nhưng tôi không chắc nó sẽ phù hợp trong kịch bản khởi động kép XP / W7.
Harry Johnston

Tôi thích câu trả lời của bạn, nhưng bạn có thể vui lòng làm sạch nó một chút không? Tôi nghĩ rằng có rất nhiều thông tin không liên quan (chẳng hạn như các lệnh ví dụ, khi bạn có lệnh thực tế ngay sau đó, v.v.).
Bigbio2002

Tôi rất vui vì bạn thích anser nhưng tôi không nghĩ có nhiều thông tin không liên quan trong đó. Tôi có một lời giải thích chung cộng với một ví dụ thực tế ở cuối, điều này thực sự minh họa cách xác định các phân vùng qua từng mục cần thay đổi. Tôi cần tất cả các kiến ​​thức trên để sửa chữa hệ thống nhân bản của mình và, vì vậy, đã trình bày nó như một câu trả lời đầy đủ để cung cấp càng nhiều thông tin cho người khác.
starfry

8

Theo tài liệu không chính thức này về nội bộ BCD , các phân vùng trong kho BCD thực sự được xác định bằng chữ ký đĩa và phần bù phân vùng. Bạn đã sao chép chữ ký đĩa (byte MBR 440 440443), nhưng rất có thể đã thay đổi bù trừ phân vùng khi đặt phân vùng trên một đĩa nhỏ hơn, do đó BOOTMGR không còn có thể tìm thấy các phân vùng này.


Điều đó thú vị và chắc chắn giải thích lý do tại sao nó không hoạt động - phần bù phân vùng chắc chắn sẽ khác. Tại sao-oh-tại sao điều này không chính thức hơn tài liệu là đoán của bất cứ ai! Có cách nào được chấp nhận (chính thức hoặc không chính thức) để "sửa chữa" cái này trên đĩa nhân bản không?
starfry

Tôi cho rằng cách chính thức là khởi động từ một đĩa sửa chữa hệ thống đã được chuẩn bị trước đó (hoặc phương tiện cài đặt thực sự, nếu bạn có nó và không phải là phương tiện khôi phục DOEM) và chạy Startup Repair ; Nếu thất bại, hãy cài đặt lại hệ điều hành OS. Không chắc chắn liệu Startup Repair cũng sẽ phục hồi XP trong trường hợp của bạn hay không.
Serge Vlasov

@starfry Có nhiều trình soạn thảo BCD ngoài kia, bao gồm cả dòng lệnh tích hợp một ( bcdedit). Tôi ủng hộ Visual BCD Editor. Nếu bạn có thể vào môi trường Windows, Visual BCD giúp cài đặt thiết bị khởi động khá dễ dàng. Bạn có thể làm tương tự từ DVD khởi động bằng cách mở dấu nhắc lệnh (tôi nghĩ đó là F11 hoặc một cái gì đó) và sử dụng bcdeditở đó. Tôi khuyên bạn nên chống lại Sửa chữa hệ thống nếu bạn cảm thấy tự sửa nó, vì tôi đã sửa chữa hệ thống xóa môi trường khôi phục trên đĩa trước đó.
Bob

Cảm ơn sergey và @bob. Tôi đã chấp nhận câu trả lời này vì nó khiến tôi hoàn toàn hiểu chuyện gì đang xảy ra. Tôi đã ghi lại những gì tôi biết bây giờ trong một câu trả lời riêng biệt.
starfry

xin lỗi vì sự thiếu hiểu biết của tôi, nhưng nếu @starfry là byte để sao chép byte qua sda (không phải sda1 phân vùng), nhưng sda toàn bộ ổ đĩa, thì tại sao phân vùng lại khác?
barlop
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.