<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>https://wiki.espai.de/index.php?action=history&amp;feed=atom&amp;title=Arrencar_Linux</id>
	<title>Arrencar Linux - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.espai.de/index.php?action=history&amp;feed=atom&amp;title=Arrencar_Linux"/>
	<link rel="alternate" type="text/html" href="https://wiki.espai.de/index.php?title=Arrencar_Linux&amp;action=history"/>
	<updated>2026-05-27T18:18:16Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.espai.de/index.php?title=Arrencar_Linux&amp;diff=333&amp;oldid=prev</id>
		<title>Marti: Pàgina nova, amb el contingut: «There is nice summary and a nice table at http://lpi.aluzina.org/wiki/LPIC-2/201_2 Here copy of some part of it:    == Arrancar Grub (grub-0.97-r2) == * Repaso d...».</title>
		<link rel="alternate" type="text/html" href="https://wiki.espai.de/index.php?title=Arrencar_Linux&amp;diff=333&amp;oldid=prev"/>
		<updated>2008-10-15T10:00:45Z</updated>

		<summary type="html">&lt;p&gt;Pàgina nova, amb el contingut: «There is nice summary and a nice table at http://lpi.aluzina.org/wiki/LPIC-2/201_2 Here copy of some part of it:    == Arrancar Grub (grub-0.97-r2) == * Repaso d...».&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;There is nice summary and a nice table at http://lpi.aluzina.org/wiki/LPIC-2/201_2&lt;br /&gt;
Here copy of some part of it:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Arrancar Grub (grub-0.97-r2) ==&lt;br /&gt;
* Repaso del arranque de la BIOS.&lt;br /&gt;
* Hacer un arranque manual con el GRUB. ¿Cómo funciona todo esto?&lt;br /&gt;
* '''emerge grub''' y parar justo después del configure. [ http://www.gnu.org/software/grub/manual/grub.html#Bootstrap-tricks Cómo funciona el arranque].&lt;br /&gt;
** Analizar '''stage1/stage1.S'''. Después del '''make''' debería ocupar 512 bytes. Esto es lo que se copia en el MBR del disco. En '''stage1/stage1.S +100''' se ve cómo se copia un sector (512 bytes) del stage1.5 en memoria en la dirección '''0x8000''', esto está en la parte de boot de la partición reiserfs (después del MBR de la partición). En '''stage1/stage1.S +373''' hace el salto al stage1.5.&lt;br /&gt;
** Ir al directorio '''stage2/''' y hacer un '''make reiserfs_stage1_5'''. Ver como se meten en orden el ''start.S'', ''asm.S'', ... El ''' start.S''' es lo que se carga por el stage1 que son sólo 512 bytes. Él se auto carga lo que le queda (ya que está a continuación) y con el driver de reiserfs accede ya al fichero disperso de más de 100K directamente a '''/boot/grub/stage2'''.&lt;br /&gt;
** Hacer un ''make'' completo del directorio '''stage2/'''. Ver cómo se crea el fichero '''stage2''' que es una suma de '''start''' + '''pre_stage2'''. Esto contiene el programa que lee directamente del sistema de ficheros. Básicamente está todo en '''stage2/stage2.c'''.&lt;br /&gt;
** En el fichero '''stage2/asm.S +101''' se ve claro que el stage2 carga el fichero '''/boot/grub/menu.lst'''. Además debe llamarse así.&lt;br /&gt;
* A continuación para cargar un núcleo de linux hay que ejecutar dos comandos en el grub:&lt;br /&gt;
** '''kernel''' (hd0,6)/usr/src/linux/arch/i386/boot/bzImage root=/dev/hdb5. Esto ejecuta la función '''stage2/boot.c +40 (load_image)'''. Identificando la dirección de la parte de setup, te la imprime por pantalla.&lt;br /&gt;
** '''boot'''. Este comando ejecuta '''stage2/builtins.c +273 (boot_func)''' y se escapa por la línea 301 en la llamada a '''big_linux_boot()''', en '''stage2/asm.S +1748'''. Como se ve, esto llama a la dirección del setup mediante un call de 32 bits.&lt;br /&gt;
&lt;br /&gt;
== Arrancar Linux (linux-2.6.18-gentoo-r2) ==&lt;br /&gt;
* Repaso arranque del núcleo:&lt;br /&gt;
* '''arch/i386/boot/setup.S''' por el grub directo&lt;br /&gt;
* '''arch/i386/boot/compressed/head.S''' -&amp;gt; salta al start_kernel()&lt;br /&gt;
* '''init/main.c''' start_kernel()&lt;br /&gt;
** '''rest_init()''' -&amp;gt; cpu_idle.&lt;br /&gt;
** '''init/main.c:685 init()'''. Esta función llama en la línea 729 a ''prepare_namespace()''. Y finalmente llama a '''run_process_init()''' que carga el ejecutable '''/sbin/init'''.&lt;br /&gt;
&lt;br /&gt;
Nota sobre el montaje del sistema raíz, dónde se monta el '''initrd''':&lt;br /&gt;
* '''init/do_mounts.c'''&lt;br /&gt;
** prepare_namespace():396&lt;br /&gt;
*** mount_root() -&amp;gt; mount_block_root() -&amp;gt; do_mount_root()&lt;br /&gt;
&lt;br /&gt;
=== Parámetros que se pasan al '''init''' ===&lt;br /&gt;
En la fución gigante '''start_kernel():456''', se llama a la función '''parse_args''' donde se analizan todos los argumentos que se pasan al núcleo (incluido el '''root='''). La función toma como último argumento la función '''unknown_bootoption():226''', que se ejecuta cada vez que no reconoce un argumento. Ese argumento se añade al array '''argv_init''' en la línea :278.&lt;br /&gt;
&lt;br /&gt;
Los parámetros más típicos son:&lt;br /&gt;
* '''root='''. Dispositivo raíz.&lt;br /&gt;
* '''init='''. Primer programa. Al llamar al '''run_init_program''' se le pasa éste.&lt;br /&gt;
&lt;br /&gt;
El '''argv_init''' es el que se le pasa a la función execve() de '''/sbin/init''' para pasarle los parámetros en '''init/main.c:682 run_init_process()'''&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, el programa '''/sbin/init''' recibe todos los parámetros no reconocidos del núcleo que son pasados por el cargador de arranque (grub). Más adelante se verá la utilidad de esto para arrancar en modo super-usuario.&lt;br /&gt;
&lt;br /&gt;
=== Initrd ===&lt;br /&gt;
* Intro '''initrd'''. Motivación. Distribuciones grandes.&lt;br /&gt;
* '''stage2/boot.c +799 (load_initrd)'''. Se ejecuta esta función cuando se le ordena al grub cargar el initrd. Copia al final de la memoria y actualiza los campos '''ramdisk_image''' y '''ramdisk_size''' de la cabecera del setup. La cabecera del setup está en '''stage2/shared.h +388 (struct linux_kernel_header)'''.&lt;br /&gt;
&lt;br /&gt;
* Una vez en Linux, recordemos que el sistema de ficheros / se monta en '''init/do_mounts +396 prepare_namespace()'''.&lt;br /&gt;
* Antes de montar el sistema de ficheros, se ejecuta '''init/do_mounts.c +421 initrd_load()''' que carga la imagen del initrd en el ramdisk, la descomprime y la monta en /, a continuación ejecuta el kernel thread ''/linuxrc'', se puede ver cómo lo hace en '''init/do_mounts_initrd +59 handle_initrd()'''.&lt;br /&gt;
&lt;br /&gt;
* Cómo generar esa imágen?? El manual de [http://www.faqs.org/docs/evms/x3834.html EVMS] describe cómo hacerlo paso por paso. Básicamente se trata de:&lt;br /&gt;
** Generar un fichero vacío.&lt;br /&gt;
** Formatearlo en ext2&lt;br /&gt;
** Montarlo en algún lugar&lt;br /&gt;
** Copiar todo lo necesario: librerías, shell, módulos, etc...&lt;br /&gt;
** Crear un script llamado ''/linuxrc'' con insmod de módulos necesarios y demás.&lt;br /&gt;
** Desmontarlo y comprimir el archivo en gzip. Ya está listo.&lt;br /&gt;
&lt;br /&gt;
* Para ello, hay una utilidad llamada '''mkinitrd''' que te simplifica la vida.&lt;br /&gt;
&lt;br /&gt;
== Programa init (sysvinit-2.86-r5) ==&lt;br /&gt;
* Hacer un '''equery b /sbin/init'''&lt;br /&gt;
* emerge '''sysvinit''' y pararlo después del configure&lt;br /&gt;
* ver el '''src/init.c'''&lt;br /&gt;
* :2636 main(). Interesante el análisis de opciones en las líneas 2686 a 2701.&lt;br /&gt;
* :2708 llama a '''init_main():2352'''. El cual, al final tiene un bucle infinito de programa . Init es el proceso madre de todos, el cual va esperando a que procesos que tienen hijos mueran y puedan ser heredados por '''init'''.&lt;br /&gt;
* :2484 init_main() llama a '''read_inittab():1117''', el cual lee el fichero de configuración ''/etc/inittab'' en la línea 1150, se ve claro el '''fopen'''.&lt;br /&gt;
&lt;br /&gt;
=== inittab ===&lt;br /&gt;
El formato del fichero es: ''id:niveles_ejecucion:accion:proceso''. Es importante notar que el órden no importa!! ¡¡No es un '''autoexec.bat'''!!&lt;br /&gt;
&lt;br /&gt;
Las posibles acciones son:&lt;br /&gt;
* '''sysinit'''. Se ejecuta antes de nada (de cualquier '''boot''' o '''bootwait''').&lt;br /&gt;
* Luego '''boot''' o '''bootwait'''. Se ejecutan ''antes'' de entrar en cualquier nivel de ejecución. La diferencia entre los dos es que en la versión ''wait'', init se espera a que acabe de ejecutarse el comando antes de ejecutar otra cosa.&lt;br /&gt;
* Se escoje el '''nivel de ejecución''' en el que se entrará. Explicar los diferentes niveles de ejecución. Para ello, se le pasa como parámetro a init. Si no hay ningún parámetro, está la directiva '''initdefault''' que arranca en uno por defecto.&lt;br /&gt;
* '''once''' o '''wait'''. El wait se debería llamar ''oncewait'', se ejecuta la acción cuando se entra en el nivel de ejecución, la diferencia entre los dos es como antes: si se espera o no.&lt;br /&gt;
* '''respawn'''. Es como ''wait'', pero al acabar el programa lo vuelve a ejecutar.&lt;br /&gt;
&lt;br /&gt;
Hay otras cositas como:&lt;br /&gt;
* '''ctrlaltdel'''. Qué hacer cuando se presionan las teclas malditas.&lt;br /&gt;
* '''powerwait''', '''powerfail''', '''powerokwait'''... Cosas de SAIs, opera bajo la señal '''SIGPWR'''.&lt;br /&gt;
&lt;br /&gt;
== /sbin/rc (baselayout-1.12.6) ==&lt;br /&gt;
* Se le llama al principio con el parámetro ''boot'' y luego ''default''. Estos son los '''SOFTLEVELS''' de Gentoo. Diferencia con las demás distribuciones:&lt;br /&gt;
** Arranque de servicios en paralelo.&lt;br /&gt;
** No hay orden numérico en la instalación, el orden viene dado por la dependencia implícita. Estilo Windows NT/2000/XP.&lt;br /&gt;
** Cuando se para un servicio del cual otros dependen de él, éstos tambien se paran. Lo mismo al arrancar, se arrancan también los que dependen de él.&lt;br /&gt;
* Servicios en '''/etc/init.d/''' como siempre. Mirar las dependencias de cada servicio con el ''vi''. Salen al principio del servicio con la función '''depend()'''.&lt;br /&gt;
* Softlevels en '''/etc/runlevels/'''. Allí hay enlaces a los respectivos servicios. Para añadir el servicio para que se arranque en el correspondiente '''SOFTLEVEL''' sólo hay que añadir un enlace simbólico. Aunque hay una utilidad para esto:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
!style=&amp;quot;background:#ffdead;&amp;quot; width=&amp;quot;120px&amp;quot; | Ubuntu/Debian&lt;br /&gt;
!style=&amp;quot;background:#ffdead;&amp;quot; width=&amp;quot;120px&amp;quot; | OpenSuse/Fedora/Mandriva&lt;br /&gt;
!style=&amp;quot;background:#ffdead;&amp;quot; width=&amp;quot;120px&amp;quot; | Slackware&lt;br /&gt;
!style=&amp;quot;background:#ffdead;&amp;quot; width=&amp;quot;120px&amp;quot; | Gentoo&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#ffffed;&amp;quot; width=&amp;quot;100px&amp;quot; | Instalar&lt;br /&gt;
|'''update-rc.d''' ''servicio'' defaults&lt;br /&gt;
| align=center | '''chkconfig add''' ''servicio''&lt;br /&gt;
| align=center | -&lt;br /&gt;
|'''rc-update add''' ''servicio'' default/boot&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;background:#ffffed;&amp;quot; width=&amp;quot;100px&amp;quot; | Desinstalar&lt;br /&gt;
|'''update-rc.d -f''' ''servicio'' defaults&lt;br /&gt;
| align=center | '''chkconfig del''' ''servicio''&lt;br /&gt;
| align=center | -&lt;br /&gt;
|'''rc-update del''' ''servicio'' default/boot&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* El orden final viene dado por la variable '''RC_PARALLEL_STARTUP''' de /etc/conf.d/rc. Si está a ''yes'' el órden simplemente viene dado por la dependencia, si no orden aleatorio secuencial para satisfacer dependencias.&lt;br /&gt;
* Cuando se modifica el contenido del directorio '''/etc/init.d/''', se ejecuta automáticamente el comando ''/sbin/depscan.sh'', que recalcula la caché de dependencias en '''/var/lib/init.d/dep*'''.&lt;br /&gt;
* Una vez que el servicio se arranca queda enlazado en '''/var/lib/init.d/started/''' ''servicio''.&lt;/div&gt;</summary>
		<author><name>Marti</name></author>
	</entry>
</feed>