¿Dónde puedo obtener más información sobre cómo usar el comando GRUB `ntldr` (módulo)?

16

Recientemente me topé con el ntldrmódulo GRUB .

Aparentemente, una de las cosas para las que se puede usar es como una alternativa chainloaderpara arrancar las versiones NT> = 6.0 de Windows como en el ejemplo a continuación. (Muy útil si el registro de inicio de volumen para una partición de Windows está, uh, dañado).

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
}

¿Dónde puedo obtener más información sobre cómo se puede usar esta directiva de arranque? No lo vi en la lista cuando busqué en la versión HTML del manual de GNU GRUB .


En respuesta a la respuesta de ckhan

¡Muchas gracias! Casi había decidido que tendría que intentar buscar en el código fuente para obtener más información sobre el ntldrcomando / módulo GRUB . Pero has hecho un trabajo mucho mejor de lo que yo hubiera hecho.

Nunca se me habría ocurrido mirar los archivos de correo electrónico para ver qué discusiones de diseño podría haber tenido la persona que escribió el código. Parece que ese método podría ser muy útil en el futuro. Gracias por mencionarlo.

Mis pensamientos sobre el ntldrsoporte GRUB

  1. Si bien no estoy realmente seguro de cuánto significa la distinción, ntldres un módulo, no un comando. O tal vez un comando cargado dinámicamente si lo desea.

    Siguiendo el enlace del código fuente y mirando las líneas 152 ( GRUB_MOD_INIT) y 159 ( GRUB_MOD_FINI), puede ver el código para cargar y ... supongo ... descargar el módulo.

    GRUB aparentemente implementa muchas funciones que podría pensar que son " comandos " como módulos. La única diferencia en el uso que conozco es que antes de usar un módulo, uno debe asegurarse de que se haya cargado con el comando y le permite a GRUB "recordar" el comando. Aparte: cuándo y por qué GRUB podría " descargarinsmod ntldr .

    Aparte: siempre me pregunté por qué GRUB no es compatible reboot. Resulta que el comando existe, pero es un módulo. Si rebootvuelve unknown command, entoncesinsmod rebootreboot

    "un módulo, aún no tengo idea. Quizás sea el resultado de algo similar a" recolección de basura "? Me di cuenta de que una vez cargados, los módulos parecen persistir, incluso después de que un sistema se apaga y se reinicia. Por supuesto, no puede depender de eso, pero parece que así es como a menudo funciona en la práctica.
  2. Es interesante que se basaron ntldren chainloader. No he mirado el chainloader.ccódigo. Supongo que probablemente también hace una carga de reubicación en el modo real de Intel de 16 bits .

    Yo soy más bien contento de que no implementan ntldrcomo una opción de chainloader. Estoy de acuerdo con Vladimir. Cualesquiera que sean las similitudes en las cubiertas, la sintaxis de uso es muy diferente. El enfoque actual es menos torpe.
  3. También es interesante ver la aparente falta de entusiasmo por agregar este comando a GRUB. Aparentemente, los desarrolladores de GRUB pensaron que el daño al Registro de arranque de partición de Windows (PBR) era extremadamente improbable. Sin embargo, puedo esbozar cómo hacerlo durante una instalación bastante normal. La instalación se completa y pueden iniciar con éxito Ubuntu. Sin embargo, cuando intentan iniciar Windows seleccionando la entrada en el menú de GRUB, Windows no se inicia. En lugar de intentar iniciar Windows con GRUB, ¿simplemente vuelve a mostrar el menú de GRUB? ¿Por qué? Bueno, aparentemente cuando eligieron instalar GRUB en la partición de Windows, parte de lo que realmente sucedió fue que el PBR para la partición de Windows se sobrescribió con el PBR de GRUB. Entonces

    Comience asumiendo que un usuario tiene Windows instalado en su sistema. Ahora instalan Ubuntu (12.04 LTS) " junto " a Windows. En un momento durante la instalación de Ubuntu, aparentemente pueden decidir dónde quieren que se instale GRUB. Por razones que no puedo comenzar a adivinar, algunos de ellos deciden instalar GRUB en la partición en la que está instalado Windows.



    chainloader +1no carga en cadena un gestor de arranque de Windows, sino que vuelve a cargar GRUB.

    OMI, el más seguro rápida de permitir que un usuario inicie Windows en esa situación es usar el nuevo GRUB ntldr. Me pregunto si esto sería de interés para los desarrolladores. Espero que no hayan anticipado este escenario.

Me pregunto qué cargadores de arranque además de los de Windows ntldry bootmgrGRUBntldr podría cargar comando ?

John irracional
fuente
1
¡Buena cosa! Realmente creo que debería dejar una línea en la lista de correo de grub-devel, y pedirles que echen un vistazo a esta pregunta y tal vez intervengan en algunas de las preguntas sin respuesta y / o corrijan algunas de nuestras suposiciones. ¡Gracias por abrir la pregunta en primer lugar!
ckhan

Respuestas:

14

Investigando la característica no documentada

Tienes razón, el ntldrcomando (es un comando, no un módulo) no está documentado. Es una gran excusa para algunas aventuras en arqueología de códigos. .

Cada vez que encuentro una característica no documentada, lo primero que debe hacer es verificar las fuentes.

  • La fuente en el repositorio git de Savannah muestra que se fusionó con la línea principal en agosto de 2010.

  • La rama fuente ya no parece, pero aún se puede ver que se creó a principios de ese año , en abril de 2010. El comentario de registro, de "Vladimir 'phcoder' Serbinenko" fue

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

Se basa muy estrechamente en el chainloadercomando, tanto que el nombre del archivo en el comentario del encabezado aún no se ha actualizado.

Ahora que tenemos un registro exacto y un nombre, podemos verificar los archivos de correo. Puede ver dónde discutieron los desarrolladores sobre agregar esta característica un año antes en la lista de correo de grub-devel :

Algunos extractos relevantes de ese hilo:

Robert Millán Este parche implementa un cargador para la semántica de arranque NTLDR (que son los mismos en BootMGR, por lo tanto, ambos son compatibles)

Robert Millan Si queremos esta característica, creo que debería ser una opción en el cargador de cadenas en lugar de un comando independiente. Es casi lo mismo que el cargador de cadena, la única diferencia es que ntldr es cargar después de PBR por GRUB en lugar de por PBR en sí.

Vladimir Serbinenko No creo que sea un problema ya que ntldr usa este PBR solo como superbloque para identificar la partición. Como tal, preferiría considerar esta carga como un caso especial de pasar $ root, solo que la forma es un poco extraña

Yves Blusseau Sobre el comando, creo que será más simple para el usuario si solo tenemos un comando: chainloader (como en grub4dos) que intentará detectar el tipo de bootloader. Esta es solo mi opinión personal.

Vladimir Serbinenko No estoy de acuerdo con esto. chainloader y ntldr no comparten la misma sintaxis: chainloader espera un sector de arranque mientras que ntldr espera un archivo ntldr ot bootmgr. GRUB2 está hecho para romper con malas decisiones de diseño de GRUB1, uno de ellos es el comando "kernel". GRUB4DOS sigue a GRUB1 sobre este tema.

Robert Millan Muy bien. Hagámoslo un comando separado. Sin embargo, creo que aún debería compartir código con chainloader.c (con algunos ifdefs).

Respondiendo tu pregunta

Después de analizar todo eso, ¿qué sabemos sobre cómo se puede usar?

  • Se basa en el cargador de cadenas.

  • Se necesita un solo argumento: el archivo para abrir.

  • Evita el registro de arranque de la partición: por lo que puede evitar la corrupción allí. Vea esta publicación que detalla cómo probaron eso.

  • Son solo 160 líneas de código , puedes ver que no hay mucho más allí.

¡Espero que esto haya sido útil!

ckhan
fuente