miércoles, 14 de diciembre de 2011

Niveles de ejecución (runlevels)


Escrito esta:Dijo Jesús "Yo soy la vid verdadera, y mi Padre es el viñador."(Juan 15:1)

Tomado de:ac.usc.es

 El proceso init inicia el sistema en un determinado runlevel

  • el runlevel inicial especificado en /etc/inittab

Runlevel
determinada configuración software que permite la ejecución de una serio de procesos en la máquina
Los runlevels se identifican por números de 0 a 6

RunlevelDescripción
0parada del sistema
1modo monousuario; solo root puede entrar
2, 3, 4, 5modos multiusuario
6reiniciar el sistema
Stambién monousuario (usado por scripts)
La utilización de los runlevels 2-5 varía con la distribución de Linux:
  • en Debian los 4 son idénticos: modo multiusuario completo (con entorno de ventanas, si disponible); por defecto se usa el 2
  • en RedHat y similares:
    • 2: multiusuario sin NFS
    • 3: multiusuario completo (sin ventanas)
    • 4: no usado
    • 5: multiusuario completo (con ventanas)
Es posible cambiar de runlevel en cualquier momento usando el comando telinit o init:
  • Formato
    telinit [-t SEC] runlevel
  • SEC es el número de segundos que esperará init a que un proceso se detenga con un SIGTERM antes de antes de matarlo con un SIGKILL (por defecto, 5)
  • Ejemplo: pasa al runlevel 6 en 10 segundos (reinicia la máquina)
    telinit -t 10 6
  • Es posible hacer que init relea el fichero de configuración /etc/inittab:
    telinit q
  • podemos saber en que runlevel nos encontramos con el comando runlevel
    • runlevel: muestra el runlevel actual y el anterior
      # runlevel
      N 2
      indica que nos encontramos en el nivel 2 y que no hubo nivel anterior

El fichero /etc/inittab

Define como se ejecutan los runlevels
  • indica el runlevel por defecto
  • indica los scripts a ejecutar en cada runlevel
Formato de las líneas de inittab
identificador:runlevels:acción:proceso

  • identificador: nombre asociado a cada línea del fichero generalmente no superior a 4 caracteres
  • runlevels: lista de runlevels (todos seguidos) para los cuales esta línea se tendrá en cuenta
  • acción: indica de qué forma o bajo qué condiciones se ejecuta el comando del campo siguiente
  • proceso: comando que se ejecuta para esta entrada en los runlevels especificados
Algunas de las acciones de init son (para verlas todas ver el manual de inittab)
  • respawn: el proceso se reinicia si termina
  • waitinit inicia el proceso y espera a que termine para seguir
  • onceinit inicia el proceso una vez, cuando se entra en el runlevel
  • sysinit: el proceso se ejecuta durante el arranque de la sistema
  • ctrlaltdel: el proceso se ejecuta si se recibe un CTRL-ALT-DEL
  • powerwait: el proceso se ejecuta cuando se acaba la batería
  • powerokwait: el proceso se ejecuta cuando se recupera la energía
  • powerfailnow: el proceso se ejecuta cuando la batería está casi vacía
Ejemplo de inittab
# Número de runlevel por defecto.
id:2:initdefault:

# Script que se ejecuta siempre en cada inicio 
# independientemente del runlevel.
si::sysinit:/etc/init.d/rcS

# Script para cada runlevel 
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normalmente no se alcanza, sólo si falla el reinicio
z6:6:respawn:/sbin/sulogin

# Qué hacer si se presiona CTRL-ALT-DEL
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Qué hacer si la corriente se va/vuelve
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

  • el script /etc/init.d/rcS se ejecuta en el arranque
    • este script llama a los scripts del directorio /etc/rcS.d
  • Por cada runlevel, se ejecuta el script /etc/init.d/rc X
    • este script llama a los scripts del directorio /etc/rcX.d

Directorios /etc/rcX.d

Los ficheros de estos directorio son de la forma:
[K|S]NNServicio
Al entrar en un runlevel se ejecutan todos los ficheros del /etc/rcX.d correspondiente
  • los que empiezan por K detienen servicios
  • los que empiezan por S los inician
  • los scripts se ejecutan por orden alfabético (primero K y después S)
Todos los ficheros son enlaces a los scripts reales, que están en el directorio /etc/init.d
  • estos script admiten, al menos, uno de los siguientes parámetros:
    • start inicia el servicio
    • stop para el servicio
  • Ejemplo, para y reinicia los servicios de red:
    # /etc/init.d/networking stop
    # /etc/init.d/networking start
Si queremos iniciar un nuevo servicio en un determinado runlevel
  • colocar el script de inicio en /etc/init.d
  • hacer un enlace de nombre SxyServicio en el runlevel
    • tener en cuenta posibles dependencias con otros servicios
  • hacer un enlace de nombre tipo K en el runlevel en que se quiera pararlo
    • un buen número de secuencia es 100-xy (el orden de matar los procesos inverso debe ser al de iniciarlos)
  • existen programas que nos facilitan la labor:
    • update-rc.d: crea y borra enlaces a los scripts init
    • sysv-rc-conf: GUI para consola
    • ksysv: entorno gráfico para KDE

Terminales

Despues de ejecutar los scripts de inicio, init crea un conjunto de terminales virtuales, siguiendo lo que se indica en /etc/inittab
.......
# Lanzar las terminales para el login de los usuarios
# Notar que el la mayoría de los sistemas tty7 es usado por X Window,
# así, para añadir mas getty's se debe saltar tty7
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

  • en esta configuración, los runlevels 2 y 3 arrancan 6 terminales y los 4 y 5 sólo 1
  • podemos cambiar de tty con Ctrl-Alt-F[1-6]
  • el tty7 se utiliza para pasar al entorno de ventanas
  • los terminales se lanzan con spawn para que se vuelvan a crear cuando salimos de la sesión
En este momento se puede acceder al sistema:
  • al iniciar la sesión en un terminal:
    • el proceso tty se convierte en un proceso login que chequea usuario y contraseña
    • si se accede con éxito, el proceso login se convierte en un shell
  • al salir de la sesión
    • el proceso bash muere
    • init relanza (respawn) un nuevo tty