9.0 init

"Uuno on numero yksi" (Slogan for a series of Finnish movies.)

En este captulo se describe al proceso init, el cual es el primer proceso a 
nivel 
de usuario iniciado por el kernel. init tiene muchos deberes importantes, 
tales como iniciar getty (para que los usuario puedan ingresar al sistema), 
implementar niveles de ejecucin, y adoptar (take care) procesos hurfanos. 
En este captulo se explica como init es configurado y como utiliza los 
diferentes niveles de ejecucin.


9.1 init viene primero

init es uno de esos programas que son absolutamente esenciales para la 
operacin de un sistema GNU/Linux, pero que tal vez pueda ignorar (you still 
can mostly ignore). Una buena distribucin GNU/Linux viene con una 
configuracin para init que trabaja en la mayora de los sistemas, por lo 
que no habr necesidad de hacer absolutamente nada con respecto a init. 
Usualmente, 
solo necesita preocuparse de init si se conecta a travs de terminales 
seriales, modems que auto atiendan llamadas (dial-in, not dial-out), o si 
desea cambiar el nivel de ejecucin por defecto.

Cuando el kernel se inicia a si mismo (es decir, se cargue en memoria, 
comience a ejecutarse, inicialice todos los controladores de dispositivos 
y establezca las estructuras de datos necesarias), finaliza sus tareas
dentro del proceso de arranque del sistema al momento de iniciar la
ejecucin de un programa a nivel de usuario llamado init. 
Por lo tanto, init es siempre el primer proceso en comenzar su ejecucin 
dentro del sistema (su nmero de proceso es siempre 1).

El kernel busca el archivo binario correspondiente a init en una pocas 
ubicaciones que fueron histricamente utilizadas para este fin, pero 
la ubicacin correcta para init (en un sistema 
GNU/Linux) es /sbin/init. Si el kernel no puede encontrar a init, intenta 
ejecutar /bin/sh, y si esta ejecucin tambin falla, el inicio del sistema 
es abortado.

Cuando init comienza su ejecucin, finaliza el proceso de arranque del sistema 
realizando una serie de tareas administrativas. La lista exacta de tareas que 
init realiza puede variar en distintos sistemas GNU/Linux. De todas maneras,
es comn que init realice el chequeo de los 
sistemas de archivos, borre el contenido del directorio /tmp, comience la 
ejecucin de varios servicios, e inicie un getty para cada terminal o consola 
virtual a travs de los cuales los usuarios pueden ingresar al sistema (lea 
el Captulo 10 para mayor informacin).

Despus de que el sistema haya iniciado correctamente, init reinicia a getty 
para cada terminal en la que que un usuario finaliza su sesin 
(para que un prximo usuario pueda 
ingresar al sistema). init tambin adopta procesos hurfanos: cuando un 
proceso inicia un proceso hijo y muere antes que este, el proceso hijo pasa a 
ser un hijo de init inmediatamente. Esto es importante por varias razones 
tcnicas, pero es bueno saberlo, debido a que facilita el entendimiento de la 
lista de los procesos y los grafos de rboles de procesos. Existen unas pocas 
variantes disponibles para init. La mayora de las distribuciones GNU/Linux 
utilizan sysvinit (escrito por Miquel van Smoorenburg), el cual est basado en 
el diseo de init de System V. Las versiones BSD de Unix tienen un init 
diferente. La principal diferencia se encuentra en los niveles de ejecucin: 
System V los implementa, mientras que BSD no (al menos tradicionalmente). Esta 
diferencia no es esencial, y nosotros examinaremos a sysvinit nicamente.

Notas
[1] init por si mismo no tiene permitido morir (finalizar su ejecucin). No 
puedes matar a init, ni an con SIGKILL.


9.2 Configurando init para iniciar getty: el archivo /etc/inittab

Cuando init comienza su ejecucin, lee el archivo de configuracin 
/etc/inittab. Mientras el sistema se est ejecutando, puede releerse este 
archivo de configuracin si la seal HUP es enviada al proceso; [1] esta 
accin permite que no sea necesario reiniciar todo el sistema para que 
los cambios en la configuracin de init tomen efecto.

El archivo /etc/inittab es un poco complicado. Debido a esto, comenzaremos
su explicacin con el simple caso de configurar lneas getty. Las lneas de 
texto dentro del 
archivo /etc/inittab consisten de cuatro campos delimitados por dos puntos:

id:runlevels:action:process

La descripcin de cada uno de los campos estn explicados en los prrafos 
sucesivos. Adems, /etc/inittab puede contener lneas vacas y lneas que 
comiencen con el smbolo numeral ('#'), las cuales son ignoradas al ser ledas
por init.

id
Este campo identifica a la lnea dentro del archivo. Para lneas getty, 
especifica la terminal en que debe ejecutarse (los caracteres despus de 
/dev/tty en el nombre del archivo de dispositivo). Para otros tipos de lneas, 
este campo no tiene importancia. El valor en este
campo debe ser nico (no se permite que existan dos id iguales) y
la longitud no puede exceder la de cuatro caracteres. 

runlevels
Los niveles de ejecucin en los cuales la lnea debe ser considerada. Los 
niveles de ejecucin estn dados por dgitos simples, sin delimitadores. (los 
niveles de ejecucin sern descriptos en la prxima seccin).

action
Define la manera en que debe ser tratada la lnea. Por ejemplo, si el valor es
respawn, entonces el comando que se detalle en el prximo campo se ejecutar
nuevamenete cada vez que finalice, en cambio, si el valor es once, el comando
se ejecuta una nica vez.

process
El comando a ejecutar.

Para iniciar un getty en la primera terminal virtual (/dev/tty1), en todos los 
niveles de ejecucin multiusuarios normal (2-5), debe escribir la siguiente 
lnea:

1:2345:respawn:/sbin/getty 9600 tty1

El primer campo seala que esta es la lnea para el archivo de dispositivo
/dev/tty1. El segundo campo 
indica que esta entrada se aplica a los niveles de ejecucin 2,3,4 y 5. El 
tercer campo significa que el comando debe ser ejecutado nuevamente, despus 
de que este termine (para que uno pueda ingresar al sistema, salir y entonces 
poder ingresar nuevamente). El ltimo campo es el comando que ejecuta a getty 
en la primera terminal virtual [2].

Si desea agregar terminales o lneas modem (dial-in) 
a un sistema, debe agregar mas lneas a /etc/inittab, una para cada 
terminal o lnea de auto-respuesta. Si necesita conocer mas detalles, 
lea las pginas de manual para init, inittab y getty.

En caso de que un comando falle cuando comience su ejecucin, e init 
est configurado para reiniciarlo, el sistema consumira una gran cantidad
de recursos, debido a que la accin de ejecutar el comando se repetir
infinitamente. Para prevenir este tipo de problemas, init registra que 
tan frecuentemente reinicia un comando, y si la frecuencia crece a valores 
muy altos, init espera por cinco minutos antes de reiniciarlo nuevamente.

Notas
[1] Utilizando el comando kill -HUP 1 como root, por ejemplo.
[2] Diferentes versiones de getty se ejecuta de maneras diferentes. Consulte 
la pgina de manual, y asegrese de que sea la pgina de manual correcta.


9.3 Niveles de ejecucin

Un nivel de ejecucin es un estado de init y de la totalidad del sistema, y 
define que servicios estn operando. Los niveles de ejecucin son 
identificados por nmeros (observe la Tabla 9-1). No existe an un concenso de 
como 
utilizar los niveles de ejecucin definidos para usuarios (2 a 5). Algunos 
administradores de sistemas utilizan niveles de ejecucin para definir cuales 
subsistemas 
estn trabajando, por ejemplo, si X se est ejecutando, si la red se encuentra 
operativa, etc. Otros, tienen siempre todos los subsistemas en ejecucin, o 
inician y paran subsistemas individualmente sin cambiar de nivel de 
ejecucin, debido a que los niveles de ejecucin son un poco complejos para
controlar 
sus sistemas. Puede decidir que metodologa utilizar, aunque puede llegar a 
ser mas fcil mantener la manera en que tu distribucin GNU/Linux realiza las 
cosas.

Tabla 9-1 Nmeros de los niveles de ejecucin
0 Parar el sistema
1 Modo de usuario individual (para tareas especiales de administracin).
2-5 Operacin normal (definidas para los usuarios).
6 Reiniciar el sistema.

Los niveles de ejecucin se encuentran configurados en el archivo /etc/inittab 
por lneas como la siguiente:

12:2:wait:/etc/init.d/rc 2

El primer campo es una etiqueta arbitraria, el segundo indica que la lnea se 
aplica al nivel de ejecucin 2. El tercer campo significa que init debe 
ejecutar el 
comando especificado en el cuarto campo una sola vez, cuando se ingrese al 
nivel de ejecucin. Adems, indica que Init debe esperar hasta que la 
ejecucin de dicho comando
finalice. El script de shell 
/etc/init.d/rc ejecuta los comandos necesarios para iniciar y parar servicios 
al ingresar al nivel de ejecucin 2.

El comando especificado en el cuarto campo, realiza todo el trabajo duro que se necesita 
para establecerse en un nivel de ejecucin. Este comando inicia servicios 
que no se 
encuentren en ejecucin, y detiene o finaliza servicios que no deban estar 
ejecutndose en el nuevo nivel. La especificacin exacta del comando 
y la manera en que se 
encuentren configurados los niveles de ejecucin dependen de la distribucin 
GNU/Linux.

Cuando init comienza su ejecucin, busca una lnea en /etc/inittab que 
especifique el nivel de ejecucin por defecto:

id:2:initdefault:

Cuando el sistema inicia, puede indicarle a init que inicie un nivel 
de ejecucin distinto al 
especificado por defecto. Esto se logra informando al kernel con el argumento
de lnea de comandos single o emergency. 
Los argumentos de la lnea de comandos del kernel se pueden especificar
a travs de 
LILO, por ejemplo. Esto permite que seleccioneel modo de usuario individual o 
simple (nivel de ejecucin 1).

Mientras el sistema se est ejecutando, el comando telinit puede cambiar el 
nivel de ejecucin. Cuando el nivel de ejecucin cambia, init ejecuta el 
comando relevante desde /etc/inittab.


9.4 Configuracin especial en /etc/inittab

El archivo /etc/inittab tiene algunas caractersticas particulares que 
permiten a init reaccionar ante circunstancias especiales. Estas 
caractersticas son definidas por palabras claves en el tercer campo.
Algunos ejemplos:

powerwait
Le indica a init que apague al sistema ante una falla en el suministro 
elctrico. Esta caracterstica asume el uso de una UPS, y de un software que 
examina 
la UPS e informa a init cuando exista un corte de energa.

ctrlaltdel
Le encomienda a init que reinicie el sistema cuando el usuario presione 
ctrl-alt-del en el teclado de la consola. Note que el administrador del 
sistema puede configurar la reaccin de ctrl-alt-del para que realice alguna
accin distinta, como por ejemplo, ignorar el evento, si el sistema se 
encuentra en una ubicacin pblica (o para iniciar nethack).

sysinit
El comando a ser ejecutado cuando el sistema es iniciado. Este comando 
usualmente limpia el directorio /tmp, por ejemplo.

La lista anterior no est completa. Lea la pgina de manual de inittab 
para conocer todas las posibilidades, y detalles de las palabras claves 
anteriores.


9.5 Iniciando el sistema en modo de usuario individual

Un nivel de ejecucin importante es el modo de usuario individual (nivel de 
ejecucin 1), en el cual solamente el administrador del sistema est 
utilizando la mquina y unos pocos servicios del sistema, incluyendo a login, 
estarn disponibles. El modo de usuario individual es necesario para realizar 
algunas pocas tareas administrativas, [1] tales como ejecutar el comando fsck 
sobre una particin /usr, debido a que se requiere que tal particin se 
encuentre desmontada, y que no puede estarlo hasta que todos los servicios 
del sistema hayan finalizado (killed).

Un sistema en ejecucin puede ingresar al modo de usuario individual si se 
utiliza el comando telinit para requerir el nivel de ejecucin 1. En el 
momento de iniciar al sistema, se puede ingresar al modo de 
usuario individual escribiendo la palabra single o emergency en la lnea de 
comando del kernel: el kernel pasa la lnea de comando a init, y este 
comprende con tal argumento que no debe utilizar el nivel de ejecucin por 
defecto. (La manera en que se ingresa la lnea de comando del kernel depende 
de la forma en que se inicie el proceso de arranque del sistema).

Iniciar el sistema dentro del modo de usuario individual es necesario 
algunas veces para 
que pueda ejecutar fsck manualmente, antes de que se monte o se utilice una 
particin /usr corrupta (comnmente cualquier actividad realizada sobre un sistema de 
archivos 
inconsistente lo daa an ms, por lo que fsck debe ser ejecutado 
tan pronto 
como sea posible).

Los script de inicio del sistema hacen que init ingrese automticamente al 
modo de usuario individual si el comando fsck que se ejecuta automticamente 
en el momento de arranque del sistema falla. Este es un intento de prevenir 
que el sistema utilice un sistema de archivos daado
y que 
fsck no pudo corregir automticamente. Tal interrupcin en el arranque del 
sistema es relativamente rara, y usualmente se debe a un disco rgido 
con problemas o a una versin del kernel experimental. A pesar de esto,
es bueno encontrarse preparado si tal evento inusual llegara a suceder.

Como una medida de seguridad, un sistema configurado correctamente solicita 
que se ingrese la password del superusuario (root) antes de iniciar un
intrpretes de comandos en el  
modo de usuario individual. De lo contrario, sera muy simple obtener acceso
al sistema como superusuario, 
con solo ingresar una lnea indicada a LILO. (Tenga en cuenta de que si 
el archivo /etc/passwd se 
encuentra daado por problemas en el sistema de archivos, es conveniente 
tener a mano un disquete o algn otro medio de arranque del sistema).

