Dove posso imparare di più su come usare il comando GRUB `ntldr` (modulo?)


16

Di recente mi sono imbattuto nel ntldrmodulo GRUB .

Apparentemente una delle cose per cui può essere usata è un'alternativa chainloaderall'avvio delle versioni NT> = 6.0 di Windows come nell'esempio seguente. (Molto utile se il Volume Boot Record per una partizione di Windows è, uh, danneggiato.)

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
}

Dove posso trovare ulteriori informazioni su come utilizzare questa direttiva di avvio? Non l'ho visto elencato quando ho guardato nella versione HTML del manuale GNU GRUB .


In risposta alla risposta di Ckhan

Grazie mille! Avevo praticamente deciso che avrei dovuto provare a scavare attraverso il codice sorgente per saperne di più sul ntldrcomando / modulo GRUB . Ma hai fatto un lavoro molto migliore di quanto avrei fatto io.

Non mi sarebbe mai venuto in mente di guardare gli archivi di posta elettronica per vedere quali discussioni di progettazione avrebbe potuto avere la persona che ha scritto il codice. Questo metodo sembra che potrebbe essere molto utile in futuro. Grazie per averlo menzionato.

Le mie opinioni sul ntldrsupporto di GRUB

  1. Anche se non sono davvero sicuro di quanto significhi la distinzione, ntldrè un modulo, non un comando. O forse un comando caricato dinamicamente, se lo desideri.

    Seguendo il link del codice sorgente e guardando le righe 152 ( GRUB_MOD_INIT) e 159 ( GRUB_MOD_FINI) puoi vedere il codice da caricare e ... immagino ... scarica il modulo.

    Apparentemente GRUB implementa molte funzioni che potresti pensare siano " comandi " come moduli. L'unica differenza di utilizzo di cui sono a conoscenza è che prima di utilizzare un modulo è necessario assicurarsi che sia stato caricato con il comando insmod ntldr.

    A parte: mi sono sempre chiesto perché GRUB non supporta reboot. Si scopre che il comando esiste, ma è un modulo. Se rebootritorna unknown command, allorainsmod rebootconsente a GRUB di "ricordare" il rebootcomando.

    A parte: quando e perché GRUB potrebbe " scaricare " un modulo, non ne ho ancora idea. Forse è il risultato di qualcosa di simile alla " garbage collection " ?? Ho notato che una volta caricati i moduli sembrano persistere, anche dopo che un sistema è stato spento e riavviato. Certo, non puoi dipendere da quello, ma sembra essere come spesso funziona nella pratica.
  2. E 'interessante il fatto che essi basati ntldrsu chainloader. Non ho guardato il chainloader.ccodice. Immagino che probabilmente si stia trasferendo anche in modalità reale a 16 bit Intel ?

    Io sono piuttosto contento di non implementano ntldrcome opzione di chainloader. Sono d'accordo con Vladimir. Qualunque siano le somiglianze sotto le copertine, la sintassi dell'uso è molto diversa. L'attuale approccio è meno kludgy.
  3. È anche interessante vedere l'apparente mancanza di entusiasmo per l'aggiunta di questo comando a GRUB. Apparentemente gli sviluppatori di GRUB pensavano che il danno al Windows Partition Boot Record (PBR) fosse estremamente improbabile. Tuttavia, posso delineare come farlo durante un'installazione abbastanza ordinaria.

    Inizia supponendo che un utente abbia Windows installato sul proprio sistema. Ora installano Ubuntu (12.04 LTS) " insieme a " Windows. Ad un certo punto durante l'installazione di Ubuntu possono apparentemente decidere dove vogliono installare GRUB. Per motivi che non riesco a indovinare, alcuni di loro decidono di installare GRUB nella partizione in cui è installato Windows.

    L'installazione è completata e possono avviare correttamente Ubuntu. Tuttavia, quando provano ad avviare Windows selezionando la voce nel menu di GRUB, Windows non si avvia. Invece, tentando di avviare Windows con GRUB, viene nuovamente visualizzato il menu di GRUB?

    Perché? Bene, apparentemente quando hanno scelto di installare GRUB nella partizione di Windows parte di ciò che è realmente accaduto è stato che il PBR per la partizione di Windows è stato sovrascritto con il PBR di GRUB. Quindi chainloader +1non carica a catena un bootloader di Windows, ma ricarica GRUB.

    IMO, il più sicuro rapido modo per consentire a un utente di avvio di Windows in quella situazione è di usare il GRUB di nuovo ntldr. Mi chiedo se questo sarebbe di interesse per gli sviluppatori. Mi aspetto che non abbiano anticipato questo scenario.

Mi chiedo quali bootloader diversi da quelli di Windows ntldre bootmgril ntldrcomando GRUB potrebbero essere in grado di caricare?


1
Roba fantastica! Penso davvero che dovresti lasciare una riga sulla mailing list di grub-devel e chiedere loro di dare una sbirciatina a questa domanda e magari entrare in contatto con alcune delle domande senza risposta e / o correggere alcune delle nostre ipotesi. Grazie per aver aperto la domanda in primo luogo!
Ckhan,

Risposte:


14

Ricerca della funzione non documentata

Hai ragione il ntldrcomando (è comando, non modulo) non è documentato. Quindi è un'ottima scusa per alcune avventure nell'archeologia del codice .

Ogni volta che trovo una funzione non documentata, la prima cosa da fare è controllare le fonti.

  • La fonte del repository Savannah git mostra che è stato unito alla linea principale nell'agosto 2010.

  • Il ramo sorgente non sembra più, ma puoi ancora vederlo esistere all'inizio di quell'anno , nell'aprile del 2010. Il commento del check-in, di "Vladimir 'phcoder' Serbinenko" era

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

È basato molto attentamente sul chainloadercomando, al punto che il nome del file nel commento dell'intestazione non è stato ancora aggiornato.

Ora che abbiamo un check-in esatto e un nome, possiamo controllare gli archivi postali. Puoi vedere dove gli sviluppatori hanno discusso dell'aggiunta di questa funzione un anno prima nella mailing list di grub-devel :

Alcuni estratti rilevanti da quel thread:

Robert Millan Questa patch implementa un caricatore per la semantica di avvio NTLDR (che sono gli stessi in BootMGR, quindi entrambi sono supportati)

Robert Millan Se vogliamo questa funzionalità, penso che dovrebbe essere un'opzione nel chainloader piuttosto che un comando autonomo. È quasi lo stesso del chainloader, l'unica differenza è che ntldr è carico dopo PBR da GRUB invece che dallo stesso PBR.

Vladimir Serbinenko Non penso che sia un problema poiché ntldr usa questo PBR solo come superblocco per identificare la partizione. In quanto tale, preferirei considerare questo caricamento come un caso speciale di passaggio di $ root, solo la sua forma è un po 'strana

Yves Blusseau A proposito del comando, penso che sarà più semplice per l'utente se abbiamo un solo comando: chainloader (come in grub4dos) che proverà a rilevare il tipo di bootloader. Questa è solo la mia opinione personale.

Vladimir Serbinenko Non sono d'accordo con questo. chainloader e ntldr non condividono la stessa sintassi: chainloader si aspetta un bootector mentre ntldr si aspetta un file bootmgr di ntldr. GRUB2 viene utilizzato per interrompere le cattive decisioni di progettazione di GRUB1, uno dei quali è il comando "kernel". GRUB4DOS segue GRUB1 su questo argomento.

Robert Millan Va bene. Facciamo un comando separato. Penso che dovrebbe comunque condividere il codice con chainloader.c (con alcuni ifdefs).

Rispondere alla tua domanda

Dopo aver esaminato tutto ciò, cosa sappiamo di come può essere utilizzato?

  • Si basa su chainloader.

  • Ci vuole un solo argomento: il file da aprire.

  • Evita il record di avvio della partizione: quindi può bypassare la corruzione lì. Vedi questo post in dettaglio come lo hanno testato.

  • Sono solo 160 righe di codice , puoi vedere che non c'è molto altro lì.

Spero sia stato utile!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.