miércoles, 3 de octubre de 2007

Runlevels en Sistemas Unix

Hola de nuevo a tod@s...!

Después de "algo" de tiempo vuelvo a la carga con un nuevo tema, espero que os interese ;)

El tema a tratar, como indica el titulo del post son los runlevels de los sistemas Unix y Unix-like. Creo que todos los usuarios de sistemas Linux nos hemos topado alguna vez con esta "palabreja" y muy pocas veces hemos estado seguros de su significado, pues bien, vamos a echar un poco de luz sobre el tema:

Los runlevels o niveles de ejecución en un sistema *nix son una característica heredada del System V, una versión de Unix sobre la que se han basado la mayoría de distribuciones Linux, exceptuando algunas como Slackware o Gentoo.
En realidad, el concepto de runlevel o nivel de ejecución es bastante sencillo,hay varios runlevels, del 0 al 6 y basicamente son scripts de inicio de sistema, y cada uno de estos runlevels es una configuración de arranque distinta.

Vayamos por partes... que es todo esto?

Imaginemos que tenemos una maquina con Linux instalado, y esta maquina a su vez la utilizamos de dos "modos" o como PC de escritorio o como Servidor de Red, de archivos, web... lo que sea.
Esta claro que si vamos a utilizar la maquina como PC de escritorio vamos a necesitar un entorno gráfico y otros servicios al gusto del consumidor. En cambio si lo vamos a utilizar como servidor es totalmente innecesario un entorno gráfico, pero si es interesante que cargue en el arranque los servicios a los que esta destinado.
Para simplificar esto lo ideal seria utilizar dos runlevels, cada uno con un numero distinto, uno para la carga del servidor y el otro para el PC de escritorio. Ademas, si durante un tiempo solo fuéramos a utilizar el PC como servidor podríamos configurar el sistema para que cargue directamente con el runlevel deseado.

Existen algunos runlevels "reservados", el 0 y el 6, que se usan para apagar y reiniciar la maquina respectivamente ( es obvio que si configuras tu maquina para que arranque con cualquiera de estos dos runlevels no arrancara, así que ojo con estas cosas). El runlevel 1 esta reservado para el modo monousuario, que se usa para administrar la maquina y no tiene acceso a red. El 3 y el 5 se usan para el arranque en multiusuario, uno con arranque gráfico y el otro sin él.

Los runlevels, como ya hemos dicho son scripts de inicio de sistema, se encuentran en /etc/rcN.d, donde N es un numero para identificar cada runlevel, del 0 al 6, en el interior de estos directorios se encuentran enlaces simbólicos a los scripts contenidos en /etc/init.d, cada uno de estos enlaces mandara el parámetro start al servicio asociado y hará que arranque en el inicio del sistema.

Contenido de /etc/rc3.d


Como podemos ver el contenido de este directorio son enlaces simbólicos a los distintos servicios.
Los nombres de los enlaces siguen una nomenclatura ANNservicio, donde A es una letra, y NN un numero entero de dos cifras, esto es para que se carguen los servicios ordenados de forma alfabética, no tiene mayor importancia, a no ser que un servicio dependa de otro, en ese caso hay que tenerlo en cuenta.

Llegados a este punto tenemos una buena base sobre lo que son los runlevels en sistemas *nix, y para ir un poco mas alla, hablaremos sobre como configurar la maquina para que arranque en un determinado runlevel.

El primer proceso que se carga en un sistema *nix despues de la carga del kernel en memoria es el llamado proceso init, contenido en /sbin/init, este proceso (entre otras cosas) lee el archivo /etc/inittab, y de ahi determina en que runlevel arrancar.


Contenido de /etc/inittab

En la imagen vemos un extracto de mi inittab, en él he resaltado en blanco la linea en la que podemos modificar el runlevel de arranque, en mi caso, al tratarse de un sistema Debian el runlevel por defecto es el 2, equivalente al runlevel 5 anteriormente citado (multiusuario con arranque gráfico).
En rojo he resaltado una linea que me ha parecido interesante, y es que esta linea indica al sistema que hará en caso de arrancar en modo monousuario. En este caso indica que se ejecutar sulogin, para autenticar al usuario root, imaginaos lo que se puede hacer en una maquina con la que tengas acceso fisico a ella y una LiveCD... ;) y es que como una vez me dijo alguien... una maquina solo es segura si se encuentra aislada en una habitacion, sin que nadie mas que el administrador tenga acceso.

Por supuesto, el inittab tiene mucha mas chicha, que vosotros mismos podréis descubrir con un man inittab o con el gran Google.

Por ultimo ya, si quereis cambiar el runlevel sobre la marcha...

# telinit -t SEC NUM

Siendo SEC el numero de segundos que se esperara a un proceso antes de matarlo, por defecto es 5 segundos, y NUM, por supuesto, el numero de runlevel al que se desea cambiar. Esto solo lo podrán hacer usuarios con permisos, puesto que claro esta, no podran matar un proceso si no les pertenece... ;)

En fin, espero que hayáis disfrutado leyendo tanto como yo escribiendo, solo ya animaros a que mireis mas a fondo las posibilidades del fichero inittab y posteeis todas vuestras dudas... sin nada mas que decir...

Nos vemos en el proximo post!



2 comentarios:

vlan7 dijo...

Solo un apunte, y es el siguiente:

El runlevel 0 no esta reservado en UNIX para apagar la maquina. En Linux si, pero no en todos los unices. En UNIX Solaris bajo plataformas Sparc, un "init 0" no te apaga la maquina, sino que te lleva a la Openboot.

(soy risperdal de Wadalbertia)

Un saludo.

SLaYeR dijo...

La verdad es que puse sistemas Unix demasiado a la virulé, porque fue algo mas encarado a Sistemas Linux que a Unix en general.

Gracias por el apunte!

Salu2!