Tôi có thể tìm hiểu thêm về cách sử dụng lệnh GRUB `ntldr` (mô-đun?)


16

Gần đây tôi tình cờ thấy ntldrmô-đun GRUB .

Rõ ràng một trong những điều nó có thể được sử dụng là một giải pháp thay thế chainloaderđể khởi động các phiên bản Windows> = 6.0 của Windows như trong ví dụ dưới đây. (Rất tiện dụng nếu Volume Boot Record cho phân vùng Windows, uh, bị hỏng.)

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
}

Tôi có thể tìm hiểu thêm về cách sử dụng chỉ thị khởi động này? Tôi không thấy nó được liệt kê khi tôi xem phiên bản HTML của hướng dẫn GNU GRUB .


Trả lời câu trả lời của ckhan

Cảm ơn rât nhiều! Tôi đã quyết định khá nhiều về việc tôi sẽ phải thử đào mã nguồn để tìm hiểu thêm về ntldrlệnh / mô-đun GRUB . Nhưng bạn đã làm một công việc tốt hơn nhiều so với tôi sẽ có.

Tôi sẽ không bao giờ có thể nhìn vào kho lưu trữ email để xem những gì thảo luận về thiết kế mà người viết mã có thể có. Phương pháp đó nghe có vẻ rất hữu ích trong tương lai. Cảm ơn đã đề cập đến nó.

Suy nghĩ của tôi về ntldrhỗ trợ GRUB

  1. Mặc dù tôi không thực sự chắc chắn sự khác biệt có ý nghĩa như thế nào, ntldrlà một mô-đun, không phải là một lệnh. Hoặc có lẽ một lệnh được tải động nếu bạn muốn.

    Theo liên kết mã nguồn của bạn và nhìn vào các dòng 152 ( GRUB_MOD_INIT) và 159 ( GRUB_MOD_FINI), bạn có thể thấy mã để tải và ... Tôi đoán là ... dỡ bỏ mô-đun.

    GRUB rõ ràng thực hiện nhiều chức năng mà bạn có thể nghĩ là " lệnh " dưới dạng các mô-đun. Sự khác biệt duy nhất trong cách sử dụng mà tôi biết là trước khi sử dụng mô-đun, người ta phải đảm bảo rằng nó đã được tải bằng lệnh insmod ntldr.

    Ngoài ra: Tôi luôn tự hỏi tại sao GRUB không hỗ trợ reboot. Hóa ra lệnh tồn tại, nhưng nó là một mô-đun. Nếu reboottrả về unknown command, thìinsmod rebootcho phép GRUB "nhớ" rebootlệnh.

    Ngoài ra: Khi nào và tại sao GRUB có thể " dỡ " một mô-đun, tôi chưa có ý tưởng nào. Có lẽ nó là kết quả của một cái gì đó tương tự như " bộ sưu tập rác " ?? Tôi đã nhận thấy rằng một khi đã tải các mô-đun dường như vẫn tồn tại, ngay cả sau khi một hệ thống được tắt và khởi động lại. Tất nhiên, bạn không thể phụ thuộc vào điều đó, nhưng dường như đó là cách nó thường hoạt động trong thực tế.
  2. Thật thú vị khi họ dựa ntldrvào chainloader. Tôi đã không nhìn vào chainloader.cmã. Tôi đoán có lẽ nó cũng thực hiện tải lại trong chế độ thực 16 bit của Intel ?

    Tôi khá vui vì họ đã không thực hiện ntldrnhư một tùy chọn chainloader. Tôi đồng ý với Vladimir. Dù điểm tương đồng dưới vỏ bọc là gì, cú pháp sử dụng rất khác nhau. Cách tiếp cận hiện tại là ít bùn hơn.
  3. Thật thú vị khi thấy sự thiếu nhiệt tình rõ ràng khi thêm lệnh này vào GRUB. Rõ ràng các nhà phát triển GRUB nghĩ rằng thiệt hại cho Bản ghi khởi động phân vùng Windows (PBR) là rất khó xảy ra. Tuy nhiên, tôi có thể phác thảo cách thực hiện trong khi cài đặt đủ bình thường.

    Bắt đầu bằng cách giả sử người dùng đã cài đặt Windows trên hệ thống của họ. Bây giờ họ cài đặt Ubuntu (12.04 LTS) " cùng với " Windows. Tại một thời điểm trong quá trình cài đặt Ubuntu, rõ ràng họ có thể quyết định nơi họ muốn GRUB được cài đặt. Vì lý do tôi không thể bắt đầu đoán, một số trong số họ quyết định cài đặt GRUB vào phân vùng Windows được cài đặt.

    Quá trình cài đặt hoàn tất và họ có thể khởi động Ubuntu thành công. Tuy nhiên, khi họ cố gắng khởi động Windows bằng cách chọn mục trong menu GRUB, Windows không khởi động. Thay vì cố gắng khởi động Windows với GRUB chỉ hiển thị lại menu GRUB?

    Tại sao? Chà, rõ ràng khi họ bầu chọn cài đặt GRUB vào phân vùng windows, phần thực sự đã xảy ra là PBR cho phân vùng Windows được ghi đè bằng PBR của GRUB. Vì vậy, chainloader +1không tải chuỗi bộ tải khởi động Windows, mà thay vào đó tải lại GRUB.

    IMO, cách nhanh nhất an toàn nhất để cho phép người dùng khởi động Windows trong tình huống đó là sử dụng tính năng mới của GRUB ntldr. Tôi tự hỏi nếu điều này sẽ được các nhà phát triển quan tâm. Tôi hy vọng họ đã không lường trước được kịch bản này.

Tôi tự hỏi những bộ tải khởi động nào khác ngoài Windows, ntldrvà lệnh bootmgrGRUB ntldrcó thể tải được không?


1
Công cụ tuyệt vời! Tôi thực sự nghĩ rằng bạn nên bỏ một dòng trong danh sách gửi thư của grub-devel và yêu cầu họ xem qua câu hỏi này và có thể đưa ra một số câu hỏi chưa được trả lời và / hoặc sửa một số giả định của chúng tôi. Cảm ơn vì đã mở câu hỏi ngay từ đầu!
ckhan

Câu trả lời:


14

Nghiên cứu tính năng không có giấy tờ

Bạn nói đúng ntldrlệnh (đó là lệnh, không phải mô-đun) không được ghi lại. Vì vậy, đó là một lý do tuyệt vời cho một số cuộc phiêu lưu trong khảo cổ học mã .

Bất cứ khi nào tôi tìm thấy một tính năng không có giấy tờ, điều đầu tiên cần làm là kiểm tra nguồn.

  • Nguồn tin từ Savannah git repo cho thấy nó đã được sáp nhập vào dòng chính vào tháng 8 năm 2010.

  • Chi nhánh nguồn dường như không còn nữa, nhưng bạn vẫn có thể thấy nó ra đời vào đầu năm đó , vào tháng 4 năm 2010. Nhận xét đăng ký, từ "Vladimir 'phcoder' Serbinenko" là

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

Nó dựa rất chặt vào chainloaderlệnh, đến mức tên tệp trong bình luận tiêu đề vẫn chưa được cập nhật.

Bây giờ chúng tôi có một đăng ký chính xác và tên, chúng tôi có thể kiểm tra lưu trữ thư. Bạn có thể thấy nơi các nhà phát triển đã thảo luận về việc thêm tính năng này một năm trước trong danh sách gửi thư của nhà phát triển :

Một số trích đoạn có liên quan từ chủ đề đó:

Robert Millan Bản vá này thực hiện một trình tải cho ngữ nghĩa khởi động NTLDR (giống nhau trong BootMGR, do đó cả hai đều được hỗ trợ)

Robert Millan Nếu chúng ta muốn tính năng này, tôi nghĩ rằng nó nên là một tùy chọn trong trình tải chuỗi hơn là một lệnh độc lập. Nó gần giống như trình tải chuỗi thực sự, điểm khác biệt duy nhất là ntldr được tải sau PBR bởi GRUB thay vì bởi chính PBR.

Vladimir Serbinenko Tôi không nghĩ nó có vấn đề gì vì ntldr chỉ sử dụng PBR này làm siêu khối để xác định phân vùng. Vì vậy, tôi thà coi việc tải này là một trường hợp đặc biệt của việc chuyển $ root, chỉ là hình thức của nó hơi kỳ lạ

Yves Blusseau Về lệnh, tôi nghĩ rằng nó sẽ đơn giản hơn cho người dùng nếu chúng ta chỉ có một lệnh: chainloader (như trong grub4dos) sẽ cố gắng phát hiện loại bộ nạp khởi động. Đây chỉ là ý kiến ​​cá nhân của tôi.

Vladimir Serbinenko Tôi không đồng ý với điều này. chainloader và ntldr không chia sẻ cùng một cú pháp: chainloader mong đợi một trình khởi động trong khi ntldr mong đợi một tệp ntldr ot bootmgr. GRUB2 được thực hiện để phá vỡ các quyết định thiết kế tồi của GRUB1, một trong số chúng là lệnh "kernel". GRUB4DOS theo GRUB1 về chủ đề này.

Robert Millan Được rồi. Hãy làm cho nó một lệnh riêng biệt. Tôi nghĩ rằng nó vẫn nên chia sẻ mã với chainloader.c mặc dù (với một số ifdefs).

Trả lời câu hỏi của bạn

Sau khi xem qua tất cả những điều đó, chúng ta biết gì về cách sử dụng nó?

  • Nó dựa trên chainloader.

  • Nó cần một đối số duy nhất: tệp để mở.

  • Nó tránh bản ghi khởi động phân vùng: vì vậy nó có thể bỏ qua tham nhũng ở đó. Xem bài đăng này chi tiết làm thế nào họ đã thử nghiệm điều đó.

  • Đó là chỉ khoảng 160 dòng mã , bạn có thể thấy không có nhiều khác ở đó.

Hy vọng điều này là hữu ích!

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.