ฉันจะเรียนรู้เพิ่มเติมเกี่ยวกับวิธีใช้คำสั่ง GRUB `ntldr` (โมดูลได้อย่างไร)


16

ฉันเพิ่งเจอntldrโมดูลด้วง

เห็นได้ชัดว่าหนึ่งในสิ่งที่สามารถใช้เป็นทางเลือกในchainloaderการบูต NT> = 6.0 รุ่นของ Windows ดังตัวอย่างด้านล่าง (มีประโยชน์มากถ้า Volume Boot Record สำหรับพาร์ติชัน Windows คือเอ่อเสียหาย)

menuentry "Windows 7 (bootmgr on /dev/sda1)" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    insmod ntldr
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 1EA0019AA0017A13
    ntldr ($root)/bootmgr
}

ฉันจะเรียนรู้เพิ่มเติมเกี่ยวกับวิธีใช้คำสั่งการบูตนี้ได้จากที่ใด ฉันไม่เห็นมันระบุไว้เมื่อผมมองในรูปแบบ HTMLของคู่มือ GNU ด้วง


กำลังตอบกลับคำตอบของ ckhan

ขอบคุณมาก! ฉันตัดสินใจแล้วว่าจะลองขุดผ่านซอร์สโค้ดเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับntldrคำสั่ง / โมดูลของGRUB แต่คุณทำได้ดีกว่าที่ฉันคิด

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

ความคิดของฉันเกี่ยวกับntldrการสนับสนุนด้วง

  1. ในขณะที่ฉันไม่แน่ใจจริงๆว่าความแตกต่างมีความหมายมากแค่ไหนntldrคือโมดูลไม่ใช่คำสั่ง หรืออาจเป็นคำสั่งที่โหลดแบบไดนามิกหากคุณต้องการ

    ตามลิงค์ซอร์สโค้ดของคุณและดูที่บรรทัด 152 ( GRUB_MOD_INIT) และ 159 ( GRUB_MOD_FINI) คุณสามารถดูโค้ดที่จะโหลดและ ... ฉันคาดเดา ... ยกเลิกการโหลดโมดูล

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

    นอกเหนือ:rebootฉันมักจะสงสัยว่าทำไมด้วงไม่สนับสนุน มันเปิดออกคำสั่งที่มีอยู่ แต่มันเป็นโมดูล ถ้าrebootกลับunknown commandมาแล้วinsmod rebootอนุญาตให้ GRUB "จำ" rebootคำสั่ง

    นอกเหนือ:เมื่อไหร่และเพราะเหตุใด GRUB อาจ " ยกเลิกการโหลด " โมดูลฉันยังไม่รู้เลย อาจเป็นผลของสิ่งที่คล้ายกับ " การรวบรวมขยะ " หรือ ฉันสังเกตว่าเมื่อโหลดโมดูลดูเหมือนจะยังคงอยู่แม้หลังจากระบบปิดและรีบูต แน่นอนว่าคุณไม่สามารถพึ่งพาสิ่งนั้นได้ แต่ดูเหมือนจะเป็นวิธีที่ใช้งานได้จริงในทางปฏิบัติ
  2. เป็นที่น่าสนใจว่าพวกเขาขึ้นอยู่บนntldr chainloaderฉันไม่ได้ดูchainloader.cรหัส ฉันเดาว่าคงเป็นไปได้หรือไม่ที่การย้ายที่โหลดในโหมดจริงของ Intel 16 บิต?

    ผมรู้สึกค่อนข้างดีใจที่พวกเขาไม่ได้ใช้เป็นตัวเลือกของntldr chainloaderฉันเห็นด้วยกับ Vladimir ไม่ว่าความคล้ายคลึงกันภายใต้หน้าปกจะเป็นอย่างไรไวยากรณ์การใช้งานแตกต่างกันมาก วิธีการปัจจุบันเป็น kludgy น้อยกว่า
  3. นอกจากนี้ยังเป็นที่น่าสนใจที่จะเห็นการขาดความกระตือรือร้นที่ชัดเจนในการเพิ่มคำสั่งนี้ลงในด้วง เห็นได้ชัดว่านักพัฒนา GRUB คิดว่าความเสียหายต่อ Windows Partition Boot Record (PBR)นั้นไม่น่าเป็นไปได้ อย่างไรก็ตามฉันสามารถร่างวิธีการทำในระหว่างการติดตั้งพอปกติ

    เริ่มต้นโดยสมมติว่าผู้ใช้ติดตั้ง Windows ไว้ในระบบของพวกเขา ตอนนี้พวกเขาติดตั้ง Ubuntu (12.04 LTS) " ข้าง " Windows ณ จุดหนึ่งระหว่างการติดตั้ง Ubuntu พวกเขาสามารถตัดสินใจได้อย่างชัดเจนว่าต้องการให้ติดตั้ง GRUB ไว้ที่ใด ด้วยเหตุผลที่ฉันไม่สามารถคาดเดาได้บางคนตัดสินใจติดตั้ง GRUB ลงในพาร์ติชันที่ติดตั้ง Windows

    การติดตั้งเสร็จสมบูรณ์และพวกเขาสามารถเริ่มต้น Ubuntu ได้สำเร็จ อย่างไรก็ตามเมื่อพวกเขาพยายามเริ่ม Windows โดยเลือกรายการในเมนู GRUB Windows จะไม่เริ่มทำงาน แทนที่จะพยายามเริ่ม Windows ด้วย GRUB เพียงแสดงเมนู GRUB อีกครั้งหรือไม่

    ทำไม? เห็นได้ชัดว่าเมื่อพวกเขาเลือกที่จะติดตั้ง GRUB ลงในพาร์ติชั่น Windows ของสิ่งที่เกิดขึ้นจริงคือ PBR สำหรับพาร์ติชัน Windows นั้นเขียนทับด้วย PBR ของ GRUB ดังนั้นchainloader +1ไม่ได้โหลด bootloader ของ Windows แต่ให้โหลด GRUB แทน

    IMO ที่ปลอดภัยที่สุดอย่างรวดเร็ววิธีที่จะช่วยให้ผู้ใช้ Windows ntldrบูตในสถานการณ์ที่คือการใช้ด้วงใหม่ ฉันสงสัยว่าสิ่งนี้จะเป็นที่สนใจของนักพัฒนาหรือไม่ ฉันคาดหวังว่าพวกเขาจะไม่คาดการณ์สถานการณ์นี้

ฉันสงสัยว่า bootloaders อื่นนอกเหนือจากตัว Windows ntldrและคำสั่งbootmgrGRUB ntldrอาจโหลดได้หรือไม่


1
สิ่งที่ยอดเยี่ยม! ฉันคิดว่าคุณควรวางสายในรายชื่อผู้รับจดหมาย Grub-Devel และขอให้พวกเขาดูคำถามนี้และอาจจะพูดถึงในคำถามที่ยังไม่ได้ตอบและ / หรือแก้ไขสมมติฐานบางอย่างของเรา ขอบคุณที่เปิดคำถามตั้งแต่แรก!
ckhan

คำตอบ:


14

ค้นคว้าคุณสมบัติที่ไม่มีเอกสาร

คุณถูกntldrคำสั่ง (เป็นคำสั่งไม่ใช่โมดูล) ไม่มีการบันทึกไว้ ดังนั้นจึงเป็นข้ออ้างที่ดีสำหรับการผจญภัยบางอย่างใน รหัสโบราณคดี

เมื่อใดก็ตามที่ฉันพบคุณลักษณะที่ไม่มีเอกสารสิ่งแรกที่ต้องทำคือตรวจสอบแหล่งที่มา

  • แหล่งที่มาที่repo คอมไพล์สะวันนา แสดงให้เห็นว่ามันถูกรวมเข้ากับสายหลักในเดือนสิงหาคม 2010

  • สาขาที่มาดูเหมือนจะไม่มาก แต่คุณยังสามารถเห็นมันเข้ามาอยู่ก่อนหน้าของปีในเดือนเมษายน 2010 ความคิดเห็นเช็คอินจาก "Vladimir 'phcoder' Serbinenko" เดิมคือ

    ntldr support. (based on information from nyu but no code from him)
    

มันขึ้นอยู่กับchainloaderคำสั่งอย่างใกล้ชิดมากดังนั้นชื่อไฟล์ในความคิดเห็นส่วนหัวยังคงไม่ได้รับการปรับปรุง

ตอนนี้เรามีการตรวจสอบที่แน่นอนและชื่อเราสามารถตรวจสอบจดหมายเหตุ คุณสามารถดูว่านักพัฒนามีการพูดคุยเกี่ยวกับการเพิ่มคุณสมบัตินี้ในปีก่อนหน้าใน รายชื่อผู้รับจดหมาย grub-devel :

ข้อความที่ตัดตอนมาบางส่วนที่เกี่ยวข้องจากหัวข้อนั้น:

Robert Millanแพทช์นี้ใช้ตัวโหลดสำหรับ semantics สำหรับบูต NTLDR (ซึ่งเหมือนกันใน BootMGR ดังนั้นทั้งคู่จึงรองรับ)

Robert Millanถ้าเราต้องการฟีเจอร์นี้ฉันคิดว่ามันควรจะเป็นตัวเลือกใน chainloader มากกว่าคำสั่งแบบสแตนด์อโลน มันเกือบจะเหมือนกับ chainloader จริงๆความแตกต่างเพียงอย่างเดียวคือ ntldr จะโหลดหลังจาก PBR โดย GRUB แทนที่จะเป็น PBR โดยตัวมันเอง

Vladimir Serbinenkoฉันไม่คิดว่าจะมีปัญหาใด ๆ เนื่องจาก ntldr ใช้ PBR นี้เป็น superblock เพื่อระบุพาร์ติชันเท่านั้น ดังนั้นฉันคิดว่าการโหลดนี้เป็นกรณีพิเศษในการส่ง $ รูทรูปแบบของมันค่อนข้างแปลก

Yves Blusseauเกี่ยวกับคำสั่งฉันคิดว่ามันจะง่ายกว่าสำหรับผู้ใช้ถ้าเรามีเพียงหนึ่งคำสั่ง: chainloader (เช่นใน grub4dos) ที่จะพยายามตรวจสอบชนิดของ bootloader นี่เป็นเพียงความเห็นส่วนตัวของฉัน

Vladimir Serbinenkoฉันไม่เห็นด้วยกับสิ่งนี้ chainloader และ ntldr ไม่ได้ใช้ไวยากรณ์ร่วมกัน: chainloader คาดหวัง bootsector ในขณะที่ ntldr คาดว่าไฟล์ ntldr ot bootmgr GRUB2 ทำเพื่อทำลายการตัดสินใจออกแบบที่ไม่ดีของ GRUB1 ซึ่งหนึ่งในนั้นคือคำสั่ง "kernel" GRUB4DOS ติดตาม GRUB1 ในหัวข้อนี้

Robert Millanเอาล่ะ มาทำให้เป็นคำสั่งแยกกัน ฉันคิดว่ามันควรจะยังคงใช้รหัสร่วมกับ chainloader.c แม้ว่า (กับบาง ifdefs)

ตอบคำถามของคุณ

หลังจากอ่านข้อความทั้งหมดเรารู้อะไรเกี่ยวกับวิธีการใช้

  • มันขึ้นอยู่กับ chainloader

  • ใช้อาร์กิวเมนต์ตัวเดียวคือไฟล์ที่จะเปิด

  • มันหลีกเลี่ยงการบันทึกการบูตพาร์ติชัน: ดังนั้นจึงสามารถหลีกเลี่ยงความเสียหายที่นั่น ดูโพสต์นี้ซึ่งมีรายละเอียดวิธีการทดสอบ

  • มันมีโค้ดเพียง 160 บรรทัดเท่านั้นคุณจะเห็นว่ามีอะไรไม่มากนัก

หวังว่านี่จะเป็นประโยชน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.