Diferencia entre revisiones de «Descripción del proceso init»

Contenido eliminado Contenido añadido
Sin resumen de edición
Drinibot (discusión | contribs.)
m Miscelánea ortográfica
Línea 1:
Titulo: INIT e IntroduccionIntroducción a los RUNLEVELs o Niveles de Ejecucion en Linux.
Fecha: Mayo 26 2007.
Categoria: Software Libre/Linux
 
El presente documento ilustra y explica el funcionamiento de init, el proceso padre al cual el kernel da paso
despuesdespués de su correcta pre-inicializacion, tambientambién es una introduccionintroducción a los shells de runlevels
 
 
Línea 10:
 
 
El proceso de arranque del nucleo Linux tiene basicamentebásicamente la misma distribucion jerarquica en cuanto al proceso que se ejecuta despuesdespués del arranque e inicializacion del nucleo que los Unixes convencionales, lo que sera descrito a continuacion es una descripcion de los entresijos que ocurren durante esa etapa de inicializacion.
 
Desde su primera version y al ser un OS tipo Unix cuando el kernel 'termina' su ejecucion (realmente no lo hace, solo cede el control a un proceso padre [init] aunque continuara ejecutandose, planificando procesos, etc) hace una busqueda de un programa llamado init, mas adelante veremos que es y para que sirve init pero para ir dando un seguimiento correcto mostremos a continuacion lo que ejecuta el kernel para encontrar el ejecutable init.
Línea 52:
</pre>
 
Estos segmentos de codigocódigo estanestán definidos en $KERNELSOURCE/init/main.c (donde $KERNELSOURCE es el arbol de las fuentes ), las lineaslíneas a analizar en cuestion son desde 767 -> 770, siendo todo esto basado en el nucleo 2.6.21.1, esas definiciones en C quieren decir basicamentebásicamente que en este momento el nucleo esta haciendo una busqueda de los posibles lugares donde el proceso init se aloja haciendo llamadas a varias funciones, si la busqueda es efectiva ejecuta el proceso con permisos de super usuario (UID=0) de lo contrario si el kernel no puede encontrar a init el mensaje posterior en la linealínea 772 es bastante claro en ese sentido. A diferencia de algunas variantes De Unix o BSD Unix, en Linux, init se encuentra siempre en /sbin/init, definido asiasí por el Linux Filesystem Hierarchy (LFH), un estandar de la distribucion de ejecutables, directorios, etc en un sistema Linux.
 
 
Línea 78:
</pre>
 
Claramente se puede observar desde donde provienen cada uno de los procesos y los procesos ejecutados a traves de otros procesos por ejemplo en este caso la siguiente linealínea:
 
|-bash---startx---xinit-+-X
Línea 87:
 
Init crea los procesos leyendo un fichero de configuracion que se puede decir que es global ya que siempre se encuentra en la misma ruta, el fichero /etc/inittab es leido e interpretado por init para la inicializacion de los procesos en los denominados run-leves o niveles de ejecucion. En inittab entre otras cosas se definen varias entradas que causan que init expanda gettys
getty, agetty comunmente usado en linux para abrir un puerto tty pidiendo login e invoca al ejecutable /bin/login. en cada linealínea para que los usuarios puedan loguearse.
Runlevels o Niveles de Ejecucion.
 
Línea 94:
Un runlevel es una configuracion del sistema que permite solo a un grupo de procesos existir. Los procesos que ha sido expandidos por init para cada runlevel son definidos en /etc/inittab. Init puede estar en uno de 8 runlevels: 0 al 6 y S, s. El runlevel puede ser cambiado corriendo como usuario privilegiado y corriendo el comando telinit, el cual envia senales apropiadas a init, indicandole a que runlevele cambiar.
 
Los runlevels 0, 1 y 6 estanestán reservados. El nivel de ejecucion 0 es usado para detener el sistema, el 6 para reiniciarlo, y el 1 para el modo monousuario. El runlevel S no debe ser usado directamente solo para los scripts que son ejecutados cuando se esta accediendo al runlevel 1.
 
DespuesDespués de que init es ejecutado como el ultimoúltimo paso de la secuencia de arranque del kernel, se realiza una busqueda del inittab en /etc para ver si encuentra una linealínea del tipo initdefault, la cual establece cual es el runlevel por defecto o inicial del sistema. Si no existe la entrada o no se encuentra el inittab un runlevel debe ser establecido en la consola del sistema.
 
 
En algunas lineaslíneas del inittab debemos tener en cuenta la siguiente sintaxis:
 
id:runlevels:accion:proceso
Línea 107:
 
 
En resumen el id aquiaquí es 1, el 2345 quiere decir que se inicializara en cualquiera de esos runlevels (recordar que init siempre inicia por defecto en algun runlevel), la palabra respawn quiere decir que el proceso sera reiniciado en el momento que sea terminado, /sbin/agetty en este caso es el proceso a ejecutar donde se le pasan 2 parametros requeridos, el ttyX, donde X = numeronúmero de tty, y la velocidad (en baudios).
 
 
Conociendo ya basicamentebásicamente como funciona init damos paso a la descripcion del fichero inittab, un fichero de ejemplo de este file es el siguiente
id:3:initdefault:
Línea 140:
id:3:initdefault:
 
Como se mencionaba anteriormente la entrada initdefault establece el runlevel por defecto que init va a leer posteriormente en el inicio del sistema o con el comando telinit RUNLEVEL donde RUNLEVEL es un numeronúmero de 0 a 6, ej: telinit 3, en este caso si estuviesemos en las X pasariamos autamaticamente al modo en linealínea de comandos ya que normalmente las X se ejecutan en el runlevel 5.
 
 
si::sysinit:/etc/rc.d/init.d/rc sysinit
 
Esta linealínea es de suma importancia ( y varia de una distribucion a otra con toda seguridad ), es parte del mecanismo que se encarga de inicializar los scripts de arranque (S) y de apagado (K). Por ejemplo unas lineaslíneas del script shell podrian ser las siguientes:
 
Entre otras cosas estas lineaslíneas se encargan de inicializar lo antes mencionado, scripts de inicio y apagado en sus coincidencias S[numeros de 0 a 9] o K[lo mismo].
 
for i in $( ls -v ${rc_base}/rc${runlevel}.d/S* 2> /dev/null)
Línea 203:
Donde bootwait define que sera ejecutado al arranque del sistema, mientras que init espera a que termine, el campo de los runlevels sera ignorado.
 
En la parte final de toda esta ejecucion init lee las entradas de aggety o getty y es cuando se nos presenta el prompt de login que todos conocemos (en linealínea de comandos ) algo asiasí como
 
========================================
Línea 214:
Con las bases de todo lo mencionado en el tema anterior veamos como, porque y cuando seran ejecutados scripts de arranque mas comunmente llamados shells init o scripts de runlevels.
 
Para comenzar hay que mencionar el directorio que contiene CASI TODOS los scripts de inicio los cuales seran iniciados en el runlevel al que pertenezcan es el dir /etc/init.d, comunmente usado en distribuciones como Debian no siendo asiasí en Red Hat que usa el estilo BSD muy parecido al estilo del Debian pero con otra ubicacion en los ficheros shell y alguna que otra diferencia aunque en el fondo se logra basicamentebásicamente el mismo objetivo.
 
Se mencionaba CASI TODOS pues hay scripts que son 'fijos', esos shells son los que se encargan de montar el sistema de ficheros, chequearlo, iniciar Udev, Limpiar el FS, establecer la consola de linux, activar la swap, entre otras, por ejemplo en una distribucion GNU/Linux con estilo de arranque System V al estilo BSD el directorio /etc/init.d no existe propiamente en ese lugar sino que se encuentra en /etc/rc.d/init por lo que los scripts fijos de arranque se encuentran normalmente en el directorio /etc/rc.d/init.d/rcsysinit y los leidos por init antes que ningunningún otro, es necesario explicar esto para que se comprenda en caso de confusion al tener contacto con alguna de las dos variantes.
 
Volviendo a los scripts de runlevel NORMALES estos se alojan en /etc/rc.d/init.d o en /etc/init.d habiendo enlaces simbolicos desde cada directorio que es identificado por el numeronúmero del runlevel, la estructura de los dir es la siguiente, /etc/rc.d/rcX.d donde X es un numeronúmero de 0 a 6, en el estilo que usa Debian es igual solo que se encuentran en /etc/rcX.d.
Quedando asiasí mas o menos la estructura:
 
En los directorios /etc/ o /etc/rc.d
Línea 232:
 
 
Como se habiahabía mencionado antes los scripts se encuentran en init.d, ejemplificado vamos a ver un script REAL alojando en init.d
 
/etc/rc.d/init.d/bind
Línea 249:
../init.d/bind
 
La norma o sintaxis es muy facil de comprender, los enlaces que comienzen con S (de START) seran iniciados dependiendo del numeronúmero que prosiga a la letra donde los numerosnúmeros mas bajos tienen mayor prioridad en la ejecucion. Todo esto quiere decir que cuando init entre en el runlevel 3 ( en el arran que del sistema o poco despuesdespués ) y ejecute todos los enlazes que comienzen con S llegara el punto en que ejecutara el script del ejemplo anterior.
 
Ejemplo de Enlazar un script a un runlevel para que sea detenido.
 
Como es logico, los servicios que son iniciados tambientambién deben ser detenidos de manera automatica cuando el sistema se vaya a reiniciar o apagar para esto en este ejemplo vamos a enlazar a bind en los runlevels 0 y 6 para que se detenga en un reinicio o apagado.
 
cd /etc/rc.d/rc6.d
Línea 260:
ln -sv ../init.d/bind K12bind
 
Aqui la norma es la misma aunque con una diferencia los que comienzen con K (KILL) seran detenidos de igual manera que lo antes explicado ( la prioridad la tiene el numeronúmero menor ). Habiendo echo esto aseguramos que si reiniciamos o apagamos se detenga el servicio que se habiahabía iniciado en el arranque del sistema.
 
 
Línea 304:
/etc/rc.d/init.d/bind stop
 
Por el contrario si comenzara con S seria asiasí
 
/etc/rc.d/init.d/bind start
 
 
Esto da la medida de como funcionan al nivel mas basicobásico los scripts de runlevels sin ser el presente documento un manual de programacionprogramación shell.
 
La linealínea case "$1 in" es propia del interprete de comandos (bash, sh, tcsh, ksh, etc) lo que quiere decir es "en caso de darse el primer parametro y que sea igual a los admitidos (start, stop, ect)"
 
Los parametros admitidos en este script son start, stop, restart, reload, ( el parametro start es obligatorio al igual que stop si deseamos tener un script que sea un autentico shell de runlevel, el parametro start es enviado al script al arranque del sistema, asiasí como el stop al apagado o reinicio y los otros dos son muy usados para recargar la configuracion del servicio y reiniciar el servicio lo cual no se aplica en el inicio, apagado o reinicio por cuestiones logicas.
 
Referencias Importantes: