Cần gì cập nhật khi di chuyển phân vùng Windows 7 (hoặc Vista) có thể khởi động?


9

Khi tôi di chuyển một phân vùng NTFS có thể khởi động với Windows trên nó sang một khối bù khác, cần cập nhật gì để làm cho nó có thể khởi động lại?

Bối cảnh: Tôi dự định viết một chương trình thực hiện các hành động cần thiết , đó là lý do tại sao tôi không tìm kiếm hướng dẫn cách sử dụng các công cụ của Microsoft bằng cách khởi động từ Windows DVD. Thay vào đó, tôi cần làm thế nào để tự sửa đổi những thứ này, để tôi có thể viết một giải pháp dễ dàng hơn cho người dùng PC trung bình khi anh ấy muốn chuyển hệ thống Windows của mình sang một đĩa cứng lớn hơn.

Cụ thể, đây là những gì tôi đã thử:

Tôi có một đĩa có nhiều phân vùng, một trong số đó là phân vùng NTFS có Windows và đĩa sử dụng khối MBR cũ đơn giản 0 cho bố cục phân vùng (không quá 4 phân vùng).

Bây giờ tôi định dạng và phân vùng một đĩa mới, lớn hơn. Ở đó tôi dành chỗ cho phân vùng NTFS và sao chép nội dung từ phân vùng Windows NTFS của đĩa cũ vào. Và tôi làm cho phân vùng "hoạt động".

Tuy nhiên, khi tôi cố gắng khởi động từ đĩa này, tôi nhận được thông báo "lỗi đọc" ngay lập tức và quá trình khởi động dừng lại, văn bản chính xác là:

  A disk read error occurred
  Press Ctrl+Alt+Del to restart

Tôi đã xác minh rằng cả hai đĩa có cùng mã vùng khởi động trong khối 0.

Dường như với tôi rằng một cái gì đó khác có thể cần cập nhật. Tôi đoán rằng ở đâu đó có một tham chiếu khối tuyệt đối mà tôi cần cập nhật, có thể chỉ đến trình tải cấp tiếp theo hoặc tới kernel NT.

Cập nhật: Tôi tìm thấy này bài viết sẽ khá vào chiều sâu của những gì tôi muốn biết. Tuy nhiên, nó nói để sửa đổi boot.ini, nhưng tôi đã cài đặt Windows 7 ở đây, nơi những thứ đó dường như đã thay đổi: Không có boot.ini mà là một thư mục có tên System Volume Information với GUID và các dữ liệu khác có liên quan đến vấn đề của tôi . Tiếp tục đào ...

Cập nhật 2: Nhờ trang web có giao diện khủng khiếp nhưng rất nhiều thông tin của starman , tôi đã có thể tìm ra bước đầu tiên: Khu vực khởi động NTFS có một trường dành cho các khu vực "ẩn". Feld này phải chứa số khu vực của khu vực khởi động. Điều này giải quyết thông báo "đọc lỗi". Tuy nhiên, bây giờ, tôi nhận được lỗi "BOOTMGR bị thiếu". Có vẻ như có một nơi khác phải điều chỉnh số khối, nhưng tôi không thể tìm thấy bất cứ điều gì trong danh sách mã về điều này.

Tôi tìm thấy rất nhiều trang web trợ giúp đề xuất các công cụ Windows để khắc phục sự cố "BOOTMGR bị thiếu" này, nhưng dường như không ai biết những gì diễn ra sau hậu trường. Kiểu như đề nghị cài đặt lại Windows khi có một chút vấn đề với nó. Ít nhất, các bản sửa lỗi đó dường như hoạt động, chủ yếu liên quan đến các công cụ Bcdedit và Bootrec. Bây giờ, ai biết những gì họ làm, đặc biệt là sau này, liên quan đến một phân vùng di chuyển?

Cập nhật 3: Sau nhiều lần thử và lỗi, tôi tin rằng giải pháp này nằm trong tệp đăng ký BCD-Template , thường nằm trong \ Windows \ System32 \ config. Nếu tôi nhận được cập nhật này bằng lệnh "bcdboot", Windows sẽ khởi động từ nó. Bây giờ tôi đang ở giữa để tìm ra thông tin nào mà sổ đăng ký này có liên quan đến câu hỏi trên. Bất kỳ con trỏ đến nội dung của đăng ký này đều được chào đón.

Cập nhật 4: Hóa ra trong khi tệp BCD-Template được viết lại và có nội dung nhị phân khác với phiên bản trước, các giá trị bên trong không thay đổi. Vì vậy, nó phải là một cái gì đó khác mà bcdboot.exe viết. Trước đây tôi đã kiểm tra xem nó có thay đổi 32 khối khởi động đầu tiên của phân vùng không, nhưng chúng dường như không thay đổi. Bản đồ Parititon cũng không được thay đổi. Vì vậy, bcdboot sửa đổi gì ngoài đăng ký BCD? Bất kỳ lời khuyên về làm thế nào tôi có thể theo dõi điều đó? Có công cụ cấp thấp nào chỉ cho tôi biết tập tin nào ghi vào chương trình không?

Cập nhật 5: Câu trả lời dường như là: c: \ Boot \ BCD cũng được thay đổi và đó dường như là tệp chính cho quy trình của người quản lý khởi động. Tôi sẽ điều tra việc này sau ...

Cập nhật 6: Có vẻ như là một chi tiết quan trọng mà tôi đã có hai phân vùng ban đầu được tạo khi tôi cài đặt Windows 7: Một phân vùng nhỏ gồm 204800 cung có vẻ là phân vùng bootstrap, tiếp theo là phân vùng thực, lớn, chứa hệ thống Windows ( ổ C :). Khi tôi cố gắng chuyển cài đặt này sang một đĩa mới, lớn hơn, tôi đã giữ nguyên hai phân vùng trên ổ đĩa mới, mặc dù chúng kết thúc ở một độ lệch khác nhau. Điều này một mình dẫn đến thông báo "BOOTMGR bị thiếu". Kể từ đó, tôi chỉ sử dụng bcdboot.exe trên phân vùng Windows, đã thêmtệp \ Boot \ BCD trên phân vùng đó. Tập tin đó (và thư mục) ban đầu chỉ tồn tại trên phân vùng nhỏ hơn. Do đó, vấn đề này có thể phức tạp hơn trong trường hợp của tôi khi một phân vùng (bộ căng dây khởi động) được chuyển đến một phân vùng khác (phân vùng chứa HĐH), trong khi những người khác có thể chỉ phải xử lý một phân vùng chứa cả hai và có thể có giải pháp đơn giản hơn

Cập nhật 7: Tìm thấy thêm một chi tiết: Tệp \ Boot \ BCD ghi lại số sê-ri của MBR. Nếu số đó không khớp, hệ thống sẽ không khởi động. Tiếp theo tôi sẽ kiểm tra nếu có một tham chiếu khối tuyệt đối được lưu trữ trong đó.


Chỉ cần tự hỏi, bạn đã chắc chắn rằng phân vùng hệ thống ẩn được di chuyển chính xác?
Colum

Bạn muốn nói đến phân vùng ẩn nào? Tôi vừa thêm bản cập nhật # 6 nói về phân vùng khởi động thêm, và vâng, tôi cũng đã di chuyển nó. Ngoài ra còn có một khu vực "ẩn" khác giữa MBR và bắt đầu phân vùng Windows, nhưng điều đó không liên quan gì - đó chỉ là một đốm dữ liệu (trong trường hợp của tôi: Phân vùng HFS + khi tôi di chuyển cài đặt Boot Camp tại đây). Những thứ duy nhất liên quan phải là: Bản đồ phân vùng (MBR cộng với GUID ánh xạ phân vùng sau đó) và hai phân vùng Windows có liên quan (trình khởi chạy nhỏ và phân vùng C:). Tôi cập nhật tất cả đúng, tất nhiên. :)
SuperTempel

Chắc chắn hầu hết các công cụ quan trọng được lưu trữ trong \BCD\Boot, và bạn thường muốn chỉnh sửa đó với bcdedit.exe, không bcdboot. Và đúng, phân vùng riêng để khởi động (chỉ được yêu cầu khi bạn sử dụng tính năng mã hóa toàn bộ đĩa, vì mã giải mã sau đó phải được lưu trữ bên ngoài phân vùng cửa sổ chính) nếu nó tồn tại.
Ben Voigt

@ . Tất cả những gì tôi muốn cập nhật là bất kỳ số tham chiếu ID và số đĩa cố định nào, mà không cần sử dụng bất kỳ tệp thực thi Windows nào, nếu có thể.
SuperTempel

1
Không phải là một câu hỏi lập trình. Đây là kiến ​​thức tên miền về bộ tải khởi động Windows.
không ai

Câu trả lời:


1

Cách dễ hơn?

Đặt đĩa cài đặt Windows Vista hoặc Windows 7 vào ổ đĩa, sau đó khởi động máy tính.
Bấm một phím khi bạn được nhắc.
Chọn một ngôn ngữ, thời gian, tiền tệ, bàn phím hoặc phương thức nhập liệu, sau đó bấm Tiếp theo.
Nhấp vào Sửa chữa máy tính của bạn.
Bấm vào hệ điều hành mà bạn muốn sửa chữa, rồi bấm Tiếp theo.
Trong hộp thoại Tùy chọn khôi phục hệ thống, bấm vào Dấu nhắc lệnh.
Nhập Bootrec.exe, sau đó nhấn ENTER.

Tùy chọn
Bootrec.exe Công cụ Bootrec.exe hỗ trợ các tùy chọn sau. Sử dụng tùy chọn phù hợp với tình huống của bạn.

Lưu ý Nếu việc xây dựng lại BCD không giải quyết được vấn đề khởi động, bạn có thể xuất và xóa BCD, sau đó chạy lại tùy chọn này. Bằng cách này, bạn chắc chắn rằng BCD được xây dựng lại hoàn toàn.

Để thực hiện việc này, hãy nhập các lệnh sau tại dấu nhắc lệnh Windows RE:
bcdedit / export C: \ BCD_Backup
c:
cd boot
attrib bcd -s -h -r
ren c: \ boot \ bcd bcd.old
bootrec / RebuildBcd

hoặc / FixMbr hoặc / FixBoot hoặc / ScanOs hoặc / RebuildBcd tùy theo tình huống.

Xem: Support.Microsoft.com để biết thêm chi tiết.


1
Cảm ơn bạn đã cố gắng giúp đỡ, nhưng những gì bạn nói là kiến ​​thức tiêu chuẩn, như bạn chỉ ra. Tôi đặc biệt cần thông tin "những gì đang diễn ra" để thực hiện điều này trong chương trình bằng văn bản của riêng tôi, chứ không phải bằng cách sử dụng phần mềm của Microsoft, điều này vẫn khó xử lý đối với người dùng tầm thường. Tôi muốn có thể cung cấp giải pháp cho người dùng Mac khi cài đặt Boot Camp, trong trường hợp anh ta cần chuyển cái này sang đĩa khác. Và như một tác dụng phụ của điều đó, nó cũng sẽ giúp bất kỳ người dùng Windows nào khác, vì các tác vụ sẽ giống nhau.
SuperTempel

Nếu tôi đang cố gắng làm điều đó ... Tôi sẽ lấy đĩa trước và sau và so sánh nhị phân giữa hai cái. Chúc may mắn.
Essobi

Tôi đi trước bạn, một lần nữa. Hãy xem, tôi là tác giả của iBored, vì vậy tôi biết cách làm những việc như thế và tin tôi đi, tôi đã thử. Tuy nhiên, định dạng mới quá khó hiểu đối với tôi và đó là lý do tại sao tôi hỏi câu hỏi này ở đây.
SuperTempel
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.