Di mana saya dapat mempelajari lebih lanjut tentang cara menggunakan perintah GRUB `ntldr` (modul?)

16

Saya baru-baru ini menemukan ntldrmodul GRUB .

Rupanya salah satu hal yang dapat digunakan adalah sebagai alternatif chainloaderuntuk mem-boot Windows NT = = 6.0 versi seperti pada contoh di bawah ini. (Sangat berguna jika Volume Boot Record untuk partisi Windows, eh, rusak.)

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
}

Di mana saya dapat mempelajari lebih lanjut tentang bagaimana arahan boot ini dapat digunakan? Saya tidak melihatnya terdaftar ketika saya melihat versi HTML dari manual GNU GRUB .


Membalas jawaban ckhan

Terima kasih banyak! Saya sudah cukup banyak memutuskan bahwa saya harus mencoba menggali kode sumber untuk mempelajari lebih lanjut tentang ntldrperintah / modul GRUB . Tetapi Anda telah melakukan pekerjaan yang jauh lebih baik daripada saya.

Tidak pernah terpikir oleh saya untuk melihat arsip email untuk melihat diskusi desain apa yang dimiliki orang yang menulis kode. Metode itu kedengarannya bisa sangat membantu di masa depan. Terima kasih telah menyebutkannya.

Pikiranku tentang ntldrdukungan GRUB

  1. Meskipun saya tidak begitu yakin seberapa besar perbedaannya, ntldrmodul, bukan perintah. Atau mungkin perintah yang dimuat secara dinamis jika Anda mau.

    Mengikuti tautan kode sumber dan melihat baris 152 ( GRUB_MOD_INIT) dan 159 ( GRUB_MOD_FINI) Anda dapat melihat kode untuk dimuat dan ... Saya kira ... bongkar modul.

    GRUB rupanya mengimplementasikan banyak fungsi yang Anda anggap " perintah " sebagai modul. Satu-satunya perbedaan dalam penggunaan yang saya ketahui adalah bahwa sebelum menggunakan modul kita harus memastikan telah dimuat dengan perintah insmod ntldr.

    Selain itu: Saya selalu bertanya-tanya mengapa GRUB tidak mendukung reboot. Ternyata perintah itu ada, tetapi itu adalah modul. Jika rebootkembali unknown command, makainsmod rebootmemungkinkan GRUB untuk "mengingat" rebootperintah.

    Selain itu: Kapan dan mengapa GRUB mungkin " menurunkan " modul, saya belum tahu. Mungkin itu adalah hasil dari sesuatu yang mirip dengan " pengumpulan sampah " ?? Saya telah memperhatikan bahwa sekali memuat modul-modul tampaknya tetap, bahkan setelah sistem dimatikan dan reboot. Tentu saja, Anda tidak dapat bergantung pada hal itu, tetapi tampaknya itulah yang sering terjadi dalam praktik.
  2. Sangat menarik bahwa mereka berdasarkan ntldrpada chainloader. Saya belum melihat chainloader.ckodenya. Saya kira itu mungkin juga melakukan pemindahan beban dalam mode nyata Intel 16-bit ?

    Saya saya agak senang mereka tidak menerapkan ntldrsebagai pilihan chainloader. Saya setuju dengan Vladimir. Apa pun kesamaan di bawah penutup, sintaks penggunaannya sangat berbeda. Pendekatan saat ini kurang kludgy.
  3. Menarik juga untuk melihat kurangnya antusiasme untuk menambahkan perintah ini ke GRUB. Rupanya para pengembang GRUB berpikir kerusakan pada Windows Partition Boot Record (PBR) sangat tidak mungkin. Namun, saya dapat membuat sketsa bagaimana melakukannya selama instalasi yang cukup biasa.

    Mulailah dengan mengasumsikan pengguna menginstal Windows pada sistem mereka. Mereka sekarang menginstal Ubuntu (12,04 LTS) " bersama " Windows. Pada satu titik selama instalasi Ubuntu mereka tampaknya dapat memutuskan di mana mereka ingin menginstal GRUB. Untuk alasan yang tidak dapat saya tebak, beberapa dari mereka memutuskan untuk menginstal GRUB ke dalam partisi tempat Windows diinstal.

    Instalasi selesai dan mereka berhasil memulai Ubuntu. Namun, ketika mereka mencoba untuk memulai Windows dengan memilih entri di menu GRUB, Windows tidak memulai. Alih-alih mencoba memulai Windows dengan GRUB, cukup tampilkan kembali menu GRUB?

    Mengapa? Yah, tampaknya ketika mereka memilih untuk menginstal GRUB ke bagian partisi windows dari apa yang sebenarnya terjadi adalah PBR untuk partisi Windows ditulis dengan GRR PBR. Jadi chainloader +1tidak berantai memuat bootloader Windows, tetapi sebaliknya memuat kembali GRUB.

    IMO, paling aman cepat cara untuk memudahkan user untuk booting Windows dalam situasi yang menggunakan GRUB baru ntldr. Saya bertanya-tanya apakah ini akan menarik bagi para pengembang. Saya berharap mereka tidak mengantisipasi skenario ini.

Saya ingin tahu bootloader apa selain Windows, ntldrdan bootmgr, ntldrperintah GRUB mungkin dapat memuat?

irasional John
sumber
1
Barang bagus! Saya benar-benar berpikir Anda harus menuliskan kalimat di mailing list grub-devel, dan meminta mereka mengintip pertanyaan ini dan mungkin menjawab beberapa pertanyaan yang belum terjawab dan / atau memperbaiki beberapa asumsi kami. Terima kasih telah membuka pertanyaan!
ckhan

Jawaban:

14

Meneliti fitur tidak berdokumen

Anda benar ntldrperintah (itu perintah, bukan modul) tidak didokumentasikan. Jadi itu alasan yang bagus untuk beberapa petualangan dalam kode arkeologi .

Setiap kali saya menemukan fitur tidak berdokumen, hal pertama yang harus dilakukan adalah memeriksa sumber.

  • Sumber di repo git Savannah menunjukkan bahwa itu digabung ke jalur utama pada Agustus 2010.

  • Cabang sumber tampaknya tidak lebih, tetapi Anda masih dapat melihatnya muncul pada awal tahun itu , pada bulan April 2010. Komentar checkin, dari "Vladimir 'phcoder' Serbinenko" adalah

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

Itu didasarkan sangat dekat pada chainloaderperintah, begitu banyak sehingga nama file di komentar header masih belum diperbarui.

Sekarang kami memiliki checkin yang tepat, dan sebuah nama, kami dapat memeriksa arsip surat. Anda dapat melihat di mana para pengembang mendiskusikan tentang menambahkan fitur ini setahun sebelumnya di milis grub-devel :

Beberapa kutipan yang relevan dari utas itu:

Robert Millan Patch ini mengimplementasikan loader untuk semantik boot NTLDR (yang sama di BootMGR, karenanya keduanya didukung)

Robert Millan Jika kita menginginkan fitur ini sama sekali, saya pikir itu harus menjadi pilihan dalam chainloader daripada perintah mandiri. Ini hampir sama dengan chainloader sebenarnya, satu-satunya perbedaan adalah bahwa ntldr adalah memuat setelah PBR oleh GRUB bukan oleh PBR itu sendiri.

Vladimir Serbinenko Saya tidak berpikir itu masalah karena ntldr menggunakan PBR ini hanya sebagai superblock untuk mengidentifikasi partisi. Karena itu saya lebih suka menganggap pemuatan ini sebagai kasus khusus untuk melewatkan $ root, hanya saja bentuknya sedikit aneh

Yves Blusseau Tentang perintah, saya pikir itu akan lebih mudah bagi pengguna jika kita hanya memiliki satu perintah: chainloader (seperti di grub4dos) yang akan mencoba mendeteksi jenis bootloader. Ini hanya pendapat pribadi saya.

Vladimir Serbinenko Saya tidak setuju dengan ini. chainloader dan ntldr tidak memiliki sintaks yang sama: chainloader mengharapkan bootsector sedangkan ntldr mengharapkan file bootmgr ntldr. GRUB2 dilakukan untuk memutuskan dengan keputusan desain yang buruk dari GRUB1 salah satunya adalah perintah "kernel". GRUB4DOS mengikuti GRUB1 tentang hal ini.

Robert Millan Baiklah. Mari kita buat itu perintah terpisah. Saya pikir itu masih harus berbagi kode dengan chainloader.c (dengan beberapa ifdefs).

Menjawab pertanyaan Anda

Setelah mempelajari semua itu, apa yang kita ketahui tentang bagaimana itu dapat digunakan?

  • Ini didasarkan pada chainloader.

  • Dibutuhkan argumen tunggal: file untuk membuka.

  • Ini menghindari catatan boot partisi: sehingga dapat memotong korupsi di sana. Lihat posting ini yang merinci bagaimana mereka mengujinya.

  • Itu hanya sekitar 160 baris kode , Anda dapat melihat tidak banyak lagi di sana.

Semoga ini bermanfaat!

ckhan
sumber