¿Cómo funciona Grub Stage1, exactamente, para acceder / cargar la etapa 2?

Esta es la primera pregunta que hago, he puesto esta pregunta en frente de los instructores de Red Hat pero no encontré ninguna respuesta satisfactoria.

Estoy usando RHEL / CENTOS6, GRUB Legacy 0.97, y he consultado montones de documentation explicando el process de arranque de Linux.

Casi todos los blogs, documentation, etc. explican con éxito los pasos involucrados y todo el process, pero no son unánimes en cuanto a lo que realmente ocurre cuando se carga grub stage2.

Aquí está mi comprensión del process y también he probado un poco;

  1. El BIOS (que no usa EFI) lee el MBR, busca la tabla de particiones y carga el GRUB stage1 (primeros 446 bytes) en la memory
  2. Tengo / boot partición bajo 1024 cilindros, y la idea que he extraído de una gran cantidad de documentation es que GRUB stage1 puede cargar stage2 directamente si está ubicado en algún lugar debajo de 1024 cilindros. Algunos documentos que he consultado mencionan que stage1.5 está ubicado justo después de MBR antes del sector 63, mientras que otros sugieren que puede estar en cualquier lugar en el primer 1MB de disco y otro grupo afirmó que stage1.5 es solo una cosa de GRUB v2 y no aplicar en el legado de GRUB.
  3. GRUB stage2 tiene todos los controlleres / modules necesarios para leer los filesystems y, por lo tanto, carga núcleo y ramdisk y control de traspaso a kernel.
  4. Kernel inicia init en RHEL / CENTOS 6 y systemd en RHEL / CENTOS 7.

He descartado todos los datos del 1er MB del disco y puedo confirmar que no hay nada más que MBR. Me confunde cómo 446 byte GRUB stage1 puede cargar Stage2 desde un sistema de files? De acuerdo con algunas imágenes en wikipedia y algunos documentos, cuando GRUB está instalado, stage1 contiene un LBA48 apuntando a stage2.

Jugando sobre el hecho, traté de probar si los sistemas arrancan cuando Stage2 se quita o renombra desde el directory / boot / grub /. Los sistemas todavía eran de arranque incluso cuando no había stage2 en el sistema de files.

1er MB de / dev / sda

[root@chief zul.kifal]# dd if=/dev/sda bs=1024k count=1 | hexdump -C 00000000 eb 48 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.H..............| 00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..| 00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u| 00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 03 02 |.........|...t..| 00000040 80 00 00 80 fc 49 08 00 00 08 fa 90 90 f6 c2 80 |.....I..........| 00000050 75 02 b2 80 ea 59 7c 00 00 31 c0 8e d8 8e d0 bc |u....Y|..1......| 00000060 00 20 fb a0 40 7c 3c ff 74 02 88 c2 52 f6 c2 80 |. ..@|<.t...R...| 00000070 74 54 b4 41 bb aa 55 cd 13 5a 52 72 49 81 fb 55 |tT.A..U..ZRrI..U| 00000080 aa 75 43 a0 41 7c 84 c0 75 05 83 e1 01 74 37 66 |.uC.A|..u....t7f| 00000090 8b 4c 10 be 05 7c c6 44 ff 01 66 8b 1e 44 7c c7 |.L...|.D..f..D|.| 000000a0 04 10 00 c7 44 02 01 00 66 89 5c 08 c7 44 06 00 |....D...f.\..D..| 000000b0 70 66 31 c0 89 44 04 66 89 44 0c b4 42 cd 13 72 |pf1..DfD.B..r| 000000c0 05 bb 00 70 eb 7d b4 08 cd 13 73 0a f6 c2 80 0f |...p.}....s.....| 000000d0 84 f0 00 e9 8d 00 be 05 7c c6 44 ff 00 66 31 c0 |........|.D..f1.| 000000e0 88 f0 40 66 89 44 04 31 d2 88 ca c1 e2 02 88 e8 |..@fD1........| 000000f0 88 f4 40 89 44 08 31 c0 88 d0 c0 e8 02 66 89 04 |..@.D.1......f..| 00000100 66 a1 44 7c 66 31 d2 66 f7 34 88 54 0a 66 31 d2 |fD|f1.f.4.T.f1.| 00000110 66 f7 74 04 88 54 0b 89 44 0c 3b 44 08 7d 3c 8a |ft.T..D.;D.}<.| 00000120 54 0d c0 e2 06 8a 4c 0a fe c1 08 d1 8a 6c 0c 5a |T.....L......lZ| 00000130 8a 74 0b bb 00 70 8e c3 31 db b8 01 02 cd 13 72 |.t...p..1......r| 00000140 2a 8c c3 8e 06 48 7c 60 1e b9 00 01 8e db 31 f6 |*....H|.......1.| 00000150 31 ff fc f3 a5 1f 61 ff 26 42 7c be 7f 7d e8 40 |1.....a.&B|..}.@| 00000160 00 eb 0e be 84 7d e8 38 00 eb 06 be 8e 7d e8 30 |.....}.8.....}.0| 00000170 00 be 93 7d e8 2a 00 eb fe 47 52 55 42 20 00 47 |...}.*...GRUB .G| 00000180 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 65 |eom.Hard Disk.Re| 00000190 61 64 00 20 45 72 72 6f 72 00 bb 01 00 b4 0e cd |ad. Error.......| 000001a0 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 00 00 00 |..<.u...........| 000001b0 00 00 00 00 00 00 00 00 19 aa 09 00 00 00 80 20 |............... | 000001c0 21 00 83 dd 1e 3f 00 08 00 00 00 a0 0f 00 00 dd |!....?..........| 000001d0 1f 3f 8e fe ff ff 00 a8 0f 00 00 58 f0 04 00 00 |.?.........X....| 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| 00000200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.0184614 s, 56.8 MB/s 

Palabra mágica 0044-0047h = 0x000849fc

 00000040 80 00 00 80 **fc 49 08 00** 00 08 fa 90 90 f6 c2 80 |.....I..........| [root@chief zul.kifal]# dd if=/dev/sda skip=$((0x849fc)) bs=512 count=1 | hexdump -C 1+0 records in 1+0 records out 512 bytes (512 B) copied, 0.00260914 s, 196 kB/s 00000000 52 56 5e bf f8 81 66 8b 2d 83 7d 04 00 0f 84 c4 |RV^...f.-.}.....| 00000010 00 80 7c ff 00 74 3e 66 8b 1d 66 31 c0 b0 7f 39 |..|..t>f..f1...9| 00000020 45 04 7f 03 8b 45 04 29 45 04 66 01 05 c7 04 10 |E....E.)Ef....| 00000030 00 89 44 02 66 89 5c 08 c7 44 06 00 70 50 66 31 |..Df\..D..pPf1| 00000040 c0 89 44 04 66 89 44 0c b4 42 cd 13 0f 82 93 00 |..DfD.B......| 00000050 bb 00 70 eb 56 66 8b 05 66 31 d2 66 f7 34 88 54 |..p.Vf..f1.f.4.T| 00000060 0a 66 31 d2 66 f7 74 04 88 54 0b 89 44 0c 3b 44 |.f1.ft.T..D.;D| 00000070 08 7d 68 8b 04 2a 44 0a 39 45 04 7f 03 8b 45 04 |.}h..*D.9E....E.| 00000080 29 45 04 66 01 05 8a 54 0d c0 e2 06 8a 4c 0a fe |)Ef..T.....L..| 00000090 c1 08 d1 8a 6c 0c 5a 52 8a 74 0b 50 bb 00 70 8e |....l.ZR.tP.p.| 000000a0 c3 31 db b4 02 cd 13 72 3a 8c c3 8e 45 06 58 c1 |.1.....r:...EX| 000000b0 e0 05 01 45 06 60 1e c1 e0 04 89 c1 31 ff 31 f6 |...E........1.1.| 000000c0 8e db fc f3 a4 1f 61 83 7d 04 00 0f 85 42 ff 83 |......a.}....B..| 000000d0 ef 08 e9 34 ff 5a ea 00 82 00 00 be 05 81 e8 3d |...4.Z.........=| 000000e0 00 eb 06 be 0a 81 e8 35 00 be 0f 81 e8 2f 00 eb |.......5...../..| 000000f0 fe 4c 6f 61 64 69 6e 67 20 73 74 61 67 65 32 00 |.Loading stage2.| 00000100 2e 00 0d 0a 00 47 65 6f 6d 00 52 65 61 64 00 20 |.....Geom.Read. | 00000110 45 72 72 6f 72 00 bb 01 00 b4 0e cd 10 46 8a 04 |Error........F..| 00000120 3c 00 75 f2 c3 00 00 00 00 00 00 00 00 00 00 00 |<.u.............| 00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 000001f0 00 00 00 00 00 00 00 00 fd 49 08 00 f6 00 20 08 |.........I.... .| 00000200 

(/ boot) comienza en 2048.

 # fdisk -lu /dev/sda Disk /dev/sda: 42.9 GB, 42949672960 bytes 255 heads, 63 sectors/track, 5221 cylinders, total 83886080 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0009aa19 Device Boot Start End Blocks Id System /dev/sda1 * 2048 1026047 512000 83 Linux Par... /dev/sda2 1026048 83886079 41430016 8e Linux LVM 

Realmente apreciaré si alguien puede explicarlo.

Desde https://access.networkinghat.com/documentation/en-US/Red_Hat_Enterprise_Linux/3/html/Reference_Guide/s1-grub-whatis.html

US / Red_Hat_Enterprise_Linux / 3 / html / Reference_Guide / s1-grub-whatis.html

GRUB se carga en la memory en las siguientes etapas:

El BIOS del MBR [1] lee en la memory la etapa 1 o el gestor de arranque primario. El gestor de arranque primario existe en less de 512 bytes de espacio en disco dentro del MBR y es capaz de cargar el cargador de arranque de la Etapa 1.5 o la Etapa 2.

El gestor de arranque de la etapa 1 lee el cargador de arranque de la etapa 1.5 en la memory, si es necesario. Algunos hardware requieren un paso intermedio para llegar al cargador de arranque de la Etapa 2. Esto a veces es cierto cuando la partición / boot / está por encima de la culata 1024 del disco duro o cuando se usa el modo LBA. El cargador de arranque de la Etapa 1.5 se encuentra en / boot / partition o en una pequeña parte del MBR y / boot / partition.

La etapa 2 o el gestor de arranque secundario se leen en la memory. El cargador de arranque secundario muestra el menu de GRUB y el entorno de command. Esta interfaz permite la selección del kernel o del sistema operativo para arrancar, pasar arguments al núcleo o ver los parameters del sistema.

Parece bastante obvio que la etapa 2 es el verdadero binary grub. La documentation actual declara que grub 2 está cargado por nombre.

Yo trataría de hacer:

 dd if=/dev/zero of=/boot/stage2 

Datos adicionales:

Inspección / arranque / grub:

copy del gestor de arranque stage1:

 stage1 

Archivos para stage1_5:

 e2fs_stage1_5 fat_stage1_5 jfs_stage1_5 minix_stage1_5 reiserfs_stage1_5 xfs_stage1_5 

Archivo para stage2:

 stage2 

Enlace a la image de grub:

comida

En computadoras que se ajustan a la secuencia de BIOS de arranque de PC de IBM:

  • El MBR (sector absoluto 0) del disco es cargado por el BIOS en la memory 0000: 7C00.
  • Ese código se ejecuta.

Forma IBM a W7

Aquí se puede ver el código utilizado por IBM PC para arrancar:
Primera versión de MBR de IBM® Personal Computer ™ DOS 2.00

Ese código tiene muchas versiones que también se presentan en las páginas del starman.
Un punto de partida sobre esas muchas versiones podría ser esta página:
de MS-DOS 3.30 a MS-Windows ™ 95 (A)

Uno de los códigos MBR más comunes es este:
MBR para: MS-Windows ™ 95B, 98, 98SE y ME

La mayoría de esas versiones de código solían cargar el próximo VBR (Volume Boot Record). El VBR de la partición marcada como de arranque en la tabla de particiones y luego transfiere la ejecución a la misma.
(Comprenda que VBR no es el sector de disco absoluto 0 o W7 MBR )

Busque esta nota de ensamblador en la página W7 MBR :

; El siguiente código usa INT 13, Función 42h ("Lectura extendida") para leer el
; primer sector (VBR) de la partición de arranque en la memory en la location 0x7c00.

Windows ™ 7 (y Vista) VBR (Volumen de logging de arranque)

Es interesante leer esto desde la página W7VBR :

; El siguiente código usa INT 13, Función 42h ("Extended Disk Read") para leer; 1 sector a la vez de los 15 sectores restantes del Área de logging de arranque en; Memoria; comenzando en la location 7E00.

Como puede confirmar, el código de inicio se inició en el MBR (sector de disco 0), cargó el VBR (logging de inicio de volumen) y muchos (15 en W7) siguientes sectores.

COMIDA

Pero estamos hablando de GRUB aquí, entonces, ve a la página de GRUB :

Y busca este código:

 [7C44] -> Note: A very important location for anyone using GRUB! This (4-byte) Quad-Word contains the location of GRUB's stage2 file in sectors! It's called "stage2_sector" in the stage1.S code. If GRUB is installed in the MBR by a distro that always includes a number of sectors from stage2 immediately following the GRUB MBR, you will see the bytes 01 00 00 00 in this location; otherwise, it will point to stage2 in the "/boot/grub" directory. 

Eso es casi siempre 01 00 00 00 (o simplemente: el siguiente sector).

Lo que eso significa es que el BIOS carga el sector absoluto 0 (MBR), el código de GRUB instalado en el MBR sigue leyendo los siguientes sectores. Hasta el tamaño de core.img (GRUB2) en las distribuciones recientes (alnetworkingedor de 60 sectores, o ~ 30 kB). Las unidades actuales dejan un mega-byte libre después del MBR, por lo que no hay problema. Los discos EFI tienen una partición separada para todo este código y hay incluso less problemas (para el tamaño, eso es).

Responder

Legacy GRUB escribe stage2, u opcionalmente etapa 1.5 en algunos casos de esquina, en el MBR y varios / muchos de los siguientes 62 sectores.

Y eso también se explica en las imágenes en la página Grub de Wikipedia .

Desde el sitio GNU 10 files de image GRUB :

 stage1 This is an essential image used for booting up GRUB. Usually, this is embedded in an MBR or the boot sector of a partition. Because a PC boot sector is 512 bytes, the size of this image is exactly 512 bytes. All stage1 must do is to load Stage 2 or Stage 1.5 from a local disk. Because of the size restriction, stage1 encodes the location of Stage 2 (or Stage 1.5) in a block list format, so it never understand any filesystem structure. 

NOTA : El stage2 puede escribirse en otro disco físico. De la página de GRUB :

 [7C40] -> 80 ("Boot Drive") NOTE: For those of you with multi-OS booting systems, if your Linux installation with GRUB's See: remaining software (stage2, menu file, etc.) is located 7C5A somewhere other than on the Primary Master drive, this value will be 81, 82, etc. depending upon which drive that Linux OS's /boot/grub directory is located. In the stage1.S file, it's called the GRUB_INVALID_DRIVE byte and commented as: "the disk to load stage2 from." (The word INVALID has something to do with the code logic.)