Sólo hablaré del init estilo "System V" que es el que usan mayoritariamente los
sistemas Linux. Hay alternativas. En realidad, puedes poner cualquier programa que quieras en
/sbin/init
, y el núcleo lo ejecutará cuando haya terminado de cargar.
La tarea de init
es poner todo a funcionar como debe hacerlo. Comprueba que los
sistemas de archivos están bien y los monta. Arranca "demonios" para registrar mensajes
del sistema, gestionar las redes, servir páginas web, escuchar a tu ratón y todo eso. También
arranca los procesos getty que ponen el indicador de login en tus terminales virtuales.
Hay una historia muy complicada acerca de conmutar "niveles de ejecución", pero me la voy a saltar en gran parte, y hablaré simplemente del arranque del sistema.
Init lee el archivo /etc/inittab
, que le dice qué hacer. Típicamente lo primero que
se le dice hacer es ejecutar un guión de inicialización. El programa que ejecuta (o interpreta) este
guión es bash
, el mismo programa que te presenta el cursor de órdenes. En los sistemas
Debian, el guión de inicialización es /etc/init.d/rcS
, en Red Hat,
/etc/rc.d/rc.sysinit
. Aquí es donde se comprueban y montan los sistemas de ficheros,
se ajusta el reloj, se habilita el intercambio de espacios, se ajusta el nombre del host, etc.
Después se llama a otro guión para llevarnos al nivel de ejecución por defecto. Esto sólo
siginifica arrancar un conjunto de subsistemas. Hay un grupo de directorios
/etc/rc.d/rc0.d
, /etc/rc.d/rc1.d
, ..., /etc/rc.d/rc6.d
en Red
Hat, o /etc/rc0.d
, /etc/rc1.d
, ..., /etc/rc6.d
en Debian, que
se corresponden con los niveles de ejecución. Si vamos al nivel de ejecución 3 de un sistema Debian,
entonces el guión ejecuta todos los guiones que haya en /etc/rc3.d
que empiecen por 'S'
(de start). Estos guiones son sólo enlaces a otros guiones que están en otro directorio normalmente
llamado init.d
.
De modo que nuestro a guión de nivel de ejecución lo llama init
, y está buscando
guiones que comiencen por 'S' en un directorio. Puede encontrar primero S10syslog
. Los
números le dicen al guión de nivel de ejecución en qué orden ejecutarlos. Así que en este caso
S10syslog
se ejecuta el primero, ya que no hay guiones que comiencen con S00 ... S09.
Pero S10syslog
es en realidad un enlace a /etc/init.d/syslog
, el cual es
un guión para arrancar y parar el logger del sistema. El guión de nivel de ejecución sabe que debe
ejecutar el guión syslog
con un parámetro "start" porque el enlace comienza
con 'S'. Hay enlaces que se corresponded con éste que comienzan con 'K' (por kill), que especifican
qué apagar y en qué orden cuando salimos del nivel de ejecición.
Para cambiar lo que los sistemas arrancan por defecto, debes ajustar estos enlaces en el
directorio rcN.d
, donde N es el nivel de ejecución por defecto ajustado en tu
inittab
.
La última cosa importante que hace init es arrancar varios getty
. Estos se
"regeneran", lo que significa que si se paran, init
los rearranca. La mayoría
de las distribuciones viene con seis terminales virtuales. Puedes querer menos para ahorrar memoria,
o más para poder tener montones de cosas ejecutándose y echarles un vistazo rápido cuando lo
necesitas. También puede que quieras ejecutar un getty
para un terminal de texto o un
marcador de modem. En este caso tendrás que editar el archivo inittab
.
/etc/inittab
es el archivo de configuración de más alto nivel para init.
Los directorioes rcN.d
, donde N = 0, 1, ..., 6 determinan qué susbistemas se
arrancan.
En algún lugar de uno de los scripts ivocados por init, aparecerá el comando mount
-a
ESto significa montar todos los sistemas de archivos que se supone que deben montarse.
El archivo /etc/fstab
define lo que se supone que debe montarse. Si quieres cambiar lo
que se monta cuando arrancas el sistema, este es el archivo que debes editar. Hay una página de man
para fstab
.
Encuentra el directorio rcN.d
del nivel de ejecución por defecto de tu sistema y haz
un ls -l
para ver a qué vinculan los archivos.
Cambia el número de gettys que se ejecutan en tu sistema.
Quita cualquier subsistema que no necesites para tu nivel de ejecución por defecto.
Mira cuánto puedes reducir para arrancar.
Prepara un diskette con lilo, un núcleo y un programa "hola mundo" vinculado
estáticamente que se llame /sbin/init
y mira cómo arranca y dice hola.
Mira atentamente mientras tu sistema arranca y toma notas sobre lo que te dice que está
sucediendo. O imprime una sección del registro de sistema /var/log/messages
desde el
momento del arranque. Entonces, comenzando desde inittab
, recorre todos los scripts y
fíjate en qué código hace qué cosa. También puedes poner mensajes de arranque extra, como
echo "Hola, soy rc.sysinit"
Este es además un buen ejercicio para aprender a escribir scripts de Bash, algunos de ellos son bastante complicados. Ten a mano una buen manual de Bash.
inittab
y fstab
.
Teclea, (p.e.) man inittab
en el shell para verlo.