ทำไม Windows 7 BCD ที่ถูกโคลนมีข้อมูลที่ไม่สมบูรณ์ (และดังนั้นจึงป้องกันการบูต)


9

ฉันมีโชคร้ายที่ต้องโคลนกล่อง Windows XP / 7 แบบดูอัลบูตเพื่อแทนที่ฮาร์ดไดรฟ์ที่มีขนาดเล็กกว่า ฉันมีปัญหาอย่างมากในการเริ่มระบบและต้องการที่จะเข้าใจว่าเกิดอะไรขึ้นและถ้าฉันสามารถทำอะไรได้ดีกว่านี้

พื้นหลัง: เครื่องมีไดรฟ์ 750Gb พร้อม 3 พาร์ติชั่น:

  • Windows XP
  • วินโดว 7
  • ข้อมูล

การติดตั้งดั้งเดิมนั้นทำในลักษณะที่ไม่มีพาร์ติชั่นการกู้คืน Windows 7 แยกต่างหาก ฉันหวังว่าความจริงข้อนี้ทำให้สิ่งต่าง ๆ ง่ายขึ้น

ฉันกำลังแทนที่ด้วยไดรฟ์ 80Gb พาร์ติชั่นนั้นหดตัวจากภายใน Windows 7 เพื่อให้เข้ากับดิสก์ขนาดเล็กลง

ฉันใช้GParted(จากPartedMagicLinux LiveCD) เพื่อคัดลอกพาร์ทิชันข้าม ฉันทำเครื่องหมายพาร์ติชัน Windows XP เป็นพาร์ติชันที่ใช้งานอยู่ (เช่นเดียวกับบนดิสก์ดั้งเดิม)

ฉันไม่สามารถใช้CloneZillaหรือทำสำเนาดิสก์ทั้งหมดเนื่องจากการเปลี่ยนจากดิสก์ที่ใหญ่กว่าเป็นดิสก์ที่เล็กกว่า

หลังจากคัดลอกพาร์ติชั่นฉันคัดลอกบูตโหลดเดอร์ด้วยตนเอง (ระวังอย่าคัดลอกตารางพาร์ติชั่น):

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

ฉันนำดิสก์ดั้งเดิมออกตั้งค่าใหม่ดังนั้นจึงเชื่อมต่อทางกายภาพกับดิสก์ดั้งเดิม (IDE channel 1 master) และลองบูท สิ่งนี้แสดงเมนูการบู๊ตสำเร็จ แต่ล้มเหลวเมื่อเลือกตัวเลือกใดตัวเลือกหนึ่ง (มีสองตัว: หนึ่งตัวสำหรับ XP และอีกอันสำหรับ Win7)

ฉันได้ทำการวิจัยพอสมควรซึ่งทำให้ฉันทราบว่าข้อมูลการกำหนดค่าการบูต Windows 7 ไม่ได้มีทุกอย่างที่ควรจะเป็น ผมเทียบผลผลิต BCD unknownจากดิสก์เดิมและใหม่และตั้งข้อสังเกตว่ารายการอุปกรณ์บนหลังได้ ดังนั้นฉันจึงเปลี่ยนพวกเขาให้ตรงกับต้นฉบับ - เช่นนี้:

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

และรีบูต ครั้งนี้ฉันสามารถบูตได้ทั้ง XP และ Win7 ฉันต้องทำการทดสอบเพิ่มเติมเนื่องจากดูเหมือนจะมีความแตกต่างอื่น ๆ ระหว่าง BCD สองตัว แต่ทำการเปลี่ยนแปลงข้างต้นอย่างน้อยก็อนุญาตให้บูตเครื่องได้

ดังนั้นคำถามของฉันคือการถามว่าทำไม BCD บนพาร์ติชันที่ลอกแบบมาจะแตกต่างจากของจริงและเพียงพอเพื่อป้องกันการบูทหรือไม่

และการติดตามถึงสิ่งนั้นก็คือการถามว่าฉันควรจะทำอย่างนี้อีกไหม?

คำตอบ:


13

หลังจากการทำพาร์ติชันที่มีระบบปฏิบัติการ Windows มีความจำเป็นต้องแก้ไขข้อมูลการกำหนดค่าการบู๊ตหากพาร์ติชันที่โคลนไม่อยู่ในตำแหน่งเดียวกันกับดิสก์ที่โคลนตามที่อยู่ในต้นฉบับ

กลไกการบูต Windows ตั้งแต่ Windows Vista จะเก็บการกำหนดค่าเป็น "Boot Configuration Data" (BCD) และสิ่งนี้อ้างถึงพาร์ติชันไม่ใช่โดยหมายเลขพาร์ติชัน แต่โดยดิสก์ลายเซ็นและเซกเตอร์เซกเตอร์ ลายเซ็นดิสก์เป็นค่า 32 บิตที่ฝังอยู่ใน Master Boot Record การคัดลอก 446 ไบต์แรกของเซกเตอร์ 0 จะเป็นการคัดลอกดิสก์ลายเซ็น

หากกิจกรรมการโคลนส่งผลให้พาร์ติชันดิสก์ที่โคลนที่มีที่อยู่เริ่มต้นแตกต่างจากเดิมที่อยู่ (น่าจะสูงยกเว้นว่ามีการใช้ทั้งดิสก์โคลน) จากนั้นโคลนจะไม่สามารถบูตได้จนกว่าจะมีการแก้ไขเหล่านี้

โดยทั่วไปเซกเตอร์ออฟเซ็ตจำเป็นต้องได้รับการอัปเดตและสำหรับสิ่งนี้คุณจะต้องใช้คอนโซลการกู้คืน (ซึ่งมีให้ใน DVD ติดตั้ง Windows 7) ตรวจสอบให้แน่ใจว่ามีการเชื่อมต่อไดรฟ์โคลนแล้วและทำการบูตจากแผ่นดีวีดี Windows 7 เท่านั้น ที่หน้าจอแรกเลือกภาษาและกด "ถัดไป" ที่หน้าจอถัดไป (ที่ "ติดตั้งทันที" ปรากฏขึ้น) กด SHIFT + F10 เพื่อรับพรอมต์คำสั่ง

ขั้นแรกให้ยืนยันตัวอักษรของไดรฟ์ที่มีอยู่และพาร์ติชันที่เกี่ยวข้อง:

diskpart
list volume
exit

นอกจากนี้หากคุณต้องการให้ยืนยันพาร์ติชันที่ใช้งานอีกครั้ง:

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

บนระบบ BIOS BCD จะถูกเก็บไว้ในไฟล์X:\Boot\BCDที่Xมีอักษรชื่อไดรฟ์ของพาร์ติชันที่ใช้งานอยู่ (สำหรับ UEFI นั้นอยู่ในพาร์ติชันระบบ EFI) ปกติซ่อนอยู่ก็สามารถมองเห็นได้ด้วย

dir /AH X:\Boot

สามารถสำรองข้อมูลดังนี้:

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

และเรียกคืน

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

หากดิสก์มีระบบปฏิบัติการหลายระบบอาจมีหลาย BCD BCD ใช้งานเป็นหนึ่งในที่\Boot\BCDบนพาร์ติชันที่ถูกทำเครื่องหมายที่ใช้งาน - เดอะพาร์ทิชันที่ใช้งาน เพื่อแสดงเนื้อหาของมัน (เพื่อเพิ่มความฟุ่มเฟื่อย :)

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

ในการแก้ไข BCD ที่ใช้งานอยู่ให้สร้างตัวอักษรของไดรฟ์สำหรับพาร์ติชันที่ถูกต้องและทำ:

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:

หรือเพื่อแก้ไข BCD อื่น (ที่ "X: \ boot \ bcd" ในตัวอย่างเหล่านี้):

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:

ยกตัวอย่างเช่นระบบของฉันที่มี XP และ 7 และพวกเขาแสดง XP เป็นอยู่บนC:และ 7 เป็นบนและพาร์ติชันที่ใช้งานคือD: C:แล้ว BCD c:\boot\BCDใช้งานจะอยู่ที่ ตัวจัดการการบูตจะอยู่ที่C:\bootmgrและการวิเคราะห์หน่วยความจำจะอยู่ที่C:\boot\memtest.exeคำสั่งที่ต้องการจะเป็น:

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:

เมื่อมีการเปลี่ยนแปลงเหล่านี้การรีบูตเครื่องคอมพิวเตอร์ (การกด Alt-F4 จะทำให้บรรลุผลสำเร็จ) และการถอด DVD ทำให้ระบบสามารถบู๊ตได้สำเร็จ

อ่านเพิ่มเติม:

(โคลนทั้งดิสก์ไม่ควรประสบปัญหาเหล่านี้เนื่องจากเลย์เอาต์พาร์ติชันบนสำเนาควรเหมือนกันทุกประการ)


โปรดทราบว่าbcdbootมีวิธีที่ง่ายกว่าในการสร้างรายการบูตขึ้นใหม่ แต่ฉันไม่แน่ใจว่ามันจะเหมาะสมในสถานการณ์การบูตดูอัลบูต XP / W7
Harry Johnston

ฉันชอบคำตอบของคุณ แต่คุณช่วยทำความสะอาดหน่อยได้ไหม? ฉันคิดว่ามีข้อมูลที่ไม่เกี่ยวข้องมากมาย (เช่นคำสั่งตัวอย่างเมื่อคุณมีคำสั่งจริงหลังจากนั้นเป็นต้น)
Bigbio2002

ฉันดีใจที่คุณชอบ anser แต่ฉันไม่คิดว่ามีข้อมูลที่ไม่เกี่ยวข้องมากมายในนั้น ฉันมีคำอธิบายทั่วไปรวมถึงตัวอย่างจริงหนึ่งตัวอย่างในตอนท้ายซึ่งแสดงให้เห็นถึงวิธีการกำหนดพาร์ติชั่นในแต่ละรายการที่จำเป็นต้องเปลี่ยน ฉันต้องการความรู้ทั้งหมดข้างต้นเพื่อแก้ไขระบบโคลนของฉันและดังนั้นจึงเสนอเป็นคำตอบแบบเต็มเพื่อให้ข้อมูลแก่ผู้อื่น
starfry

8

ตามเอกสารที่ไม่เป็นทางการของ BCD internalsพาร์ติชันในที่เก็บ BCD จะถูกระบุโดยลายเซ็นดิสก์จริงและพาร์ติชันออฟเซ็ต คุณคัดลอกดิสก์ลายเซ็น (MBR ไบต์ 440–443) แต่มีแนวโน้มที่จะเปลี่ยนพาร์ติชันเมื่อทำการวางพาร์ติชันบนดิสก์ที่มีขนาดเล็กลงดังนั้น BOOTMGR จึงไม่สามารถหาพาร์ติชันเหล่านี้ได้อีกต่อไป


นั่นน่าสนใจและอธิบายอย่างแน่นอนว่าทำไมมันไม่ทำงาน - พาร์ติชันออฟเซ็ตจะแตกต่างกันอย่างแน่นอน ทำไม - ทำไม - นี่ไม่ใช่เอกสารที่เป็นทางการมากกว่านี้คือทุกคนเดา! มีวิธีที่ยอมรับ (เป็นทางการหรือไม่เป็นทางการ) ในการ "ซ่อมแซม" สิ่งนี้บนดิสก์ที่ลอกแบบมาหรือไม่?
starfry

ฉันคิดว่าวิธีที่เป็นทางการคือ“ บูตจากแผ่นดิสก์การซ่อมแซมระบบที่เตรียมไว้ก่อนหน้านี้(หรือสื่อการติดตั้งจริงถ้าคุณมีและไม่ใช่สื่อสำหรับการกู้คืน DOEM) และเรียกใช้Startup Repair ; หากไม่สำเร็จให้ติดตั้งระบบปฏิบัติการใหม่” ไม่แน่ใจว่า Startup Repair จะกู้คืน XP ในกรณีของคุณหรือไม่
Sergey Vlasov

@starfry มีผู้แก้ไข BCD จำนวนมากอยู่ที่นั่นรวมถึงบรรทัดคำสั่งในตัวหนึ่ง ( bcdedit) ฉันชอบ Visual BCD Editor ด้วยตัวเอง หากคุณสามารถเข้าสู่ระบบ Windows, Visual BCD ทำให้การตั้งค่าอุปกรณ์บูตค่อนข้างง่าย คุณสามารถทำเช่นเดียวกันจากแผ่นดีวีดีบูตโดยเปิดพร้อมท์คำสั่ง (ฉันคิดว่ามันเป็น F11 หรือบางอย่าง) และใช้งานที่bcdeditนั่น ฉันจะแนะนำกับการซ่อมแซมระบบถ้าคุณรู้สึกถึงการแก้ไขด้วยตนเองเนื่องจากฉันมีการซ่อมแซมระบบลบสภาพแวดล้อมการกู้คืนบนดิสก์ก่อน
Bob

ขอบคุณ sergey และ @bob ฉันยอมรับคำตอบนี้เพราะมันทำให้ฉันเข้าใจสิ่งที่เกิดขึ้น ฉันได้บันทึกสิ่งที่ฉันรู้แล้วในคำตอบแยกต่างหาก
starfry

แก้ตัวความไม่รู้ของฉัน แต่ถ้า @starfry เป็นไบต์สำหรับการคัดลอกผ่าน sda (ไม่ใช่ sda1 พาร์ติชัน) แต่ sda ไดรฟ์ทั้งหมดแล้วทำไมพาร์ทิชันที่แตกต่างกันจะแตกต่างกันอย่างไร
barlop
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.