domingo, 31 de mayo de 2009

El proceso init

Una vez que el kernel termina el ultimo paso de la secuencia de booteo, cuando tenemos gestión de memoria, parte del hardware inicializado y el sistema de ficheros root, el proceso init es ejecutado. Init es el padre de todos los procesos del sistema.

El kernel busca el archivo binario correspondiente a init en las siguientes ubicaciones: /sbin/init, /bin/init.
Si el kernel no encuentra a init en las ubicaciones mencionadas entonces ejecuta /bin/sh.
Cuando cerramos el sistema, el proceso init se encarga de matar a todos los demas procesos, desmontar los sistemas de archivos y detener el procesador.

El proceso init lee el archivo de configuración /etc/inittab.

INITTAB

Cada linea de inittab es de la siguiente forma:

identificador de campo:a que runlevel corresponde:comando de init:comando externo

Veamos el significado de algunas lineas de este archivo.
Nota: Las lineas pertenecientes a inittab se resaltan con color.


El runlevel es la configuracion de software del sistema que permite seleccionar que grupo de procesos cargar.
La primera linea muestra el runlevel por defecto. Para cambiar el nivel de ejecucion en el inicio simplemente editamos el runlevel en esta linea.
Si no existe esta entrada, el runlevel debe ser especificado desde la consola del sistema.
Si el runlevel es S o s (alias para el mismo runlevel), el sistema arranca en modo Single User y no se utiliza el archivo /etc/inittab. En este modo se invoca a /sbin/sulogin en la consola /dev/console.
Los runlevels 0, 1 y 6 son reservados. El 0 es usado para detener el sistema, el 6 para rebootear y el 1 para apagar el sistema en el modo Single User.

#0 - parar (NO PONER initdefault a 0)
#1 - Mono-usuario
#2 - Multi-usuario, sin NFS (Como la 3, si no hay red)
#3 - Multi-usuario completo
#4 - no usada
#5 - X11 (modo gráfico)
#6 - reiniciar (NO PONER initdefault a 6)

Cuando se ingresa en modo Multi User por primera vez, init ejecuta las entradas boot y bootwait para permitir montar el sistema de archivos antes que el usuario pueda loguearse. Luego todas las entradas que coincidan con el runlevel seleccionado son procesadas.
Cuando inicia un nuevo proceso, init chequea que exista el archivo /etc/initscript. Si existe, utiliza este script para comenzar el proceso.
Cada vez que un proceso hijo termina, init guarda este hecho y la razon por la que termino en /var/run/utmp y /var/log/wtmp.


id:5:initdefault:

# First script to be executed, if not booting in emergency (-b) mode
si::bootwait:/etc/init.d/boot

El comando wait le “dice” a init que, hasta que el script rc no se ejecute, no continue y le pasa como parametro el runlevel.
Existen dos tipos de scripts en /etc/init.d
- Ejecutados directamente por init
Esto se realiza durante el proceso de booteo o si el sistema es apagado (debido a fallas en la alimentacion electrica o porque el usuario presiono Ctrl-Alt-Del). La ejecucion de estos scripts estan definidas en /etc/inittab.

- Ejecutados indirectamente por init.
Estos scripts se ejecutan cuando se cambia de runlevel y siempre se llama al master script /etc/init.d/rc.

Todos los scripts se encuentran en /etc/init.d. Aquellos que se ejecutan durante el booteo son llamados a traves de links simbolicos desde /etc/init.d/boot.d.
Los que son llamados cuando se cambia el runlevel son llamados a traves de los links simbolicos desde uno de los subdirectorios (/etc/init.d/rc0.d a /etc/init.d/rc6.d).
El script rc llama a los apropiados stop script del runlevel actual y los start scripts del nuevo runlevel seleccionado.

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

# what to do in single-user mode
ls:S:wait:/etc/init.d/rc S
~~:S:respawn:/sbin/sulogin

Aquí se indica la acción que se va a efectuar cuando se presionen las teclas Ctrl-Alt-Del. Si no se especifica runlevel significa que no esta asociado a ningun runlevel y a todos.
ca::ctrlaltdel:/sbin/shutdown -r -t 4 now

kbrequest: Se ejecuta el proceso cuando init recibe una senal del gestor del teclado, es decir, cuando se presiona una combinacion de teclas.
# special keyboard request (Alt-UpArrow)
kb::kbrequest:/bin/echo "Keyboard Request -- edit /etc/inittab to let this work."

powerwait: El proceso se ejecuta cuando init recibe la senal SIGPWR lo que significa que existen problemas con la alimentacion electrica.
Init espera que el proceso (en este caso powerfail) termine antes de continuar.
# what to do when power fails/returns
pf::powerwait:/etc/init.d/powerfail start

powerfail: Se ejecuta cuando la bateria del UPS esta casi vacia.
pn::powerfailnow:/etc/init.d/powerfail now

powerfail: Es igual a powerwait salvo que init no espera que el proceso termine.
#pn::powerfail:/etc/init.d/powerfail now

powerkwait: El proceso se ejecuta cuando init recibe la senal SIGPWR.
Debe existir un archivo llamado /etc/powerstatus que contenga la palabra OK.
Esto significa que la alimentacion electrica ha vuelto.
po::powerokwait:/etc/init.d/powerfail stop

# for ARGO UPS
sh:12345:powerfail:/sbin/shutdown -h now THE POWER IS FAILING

respawn: el comando externo se ejecuta nuevamente cada vez que es terminado, se reinicia.
Si quisieramos que se ejecutara una sola vez debemos utilizar el comando once.
En caso de que se realice el respawn de una entrada mas de 10 veces en 2 minutos, se asume que existe un error de sintaxis en el comando, se genera un mensaje de error en la consola y se detiene el respawn por 5 minutos o hasta que se reciba una senal. Esto previene el consumo de procesador debido a un error tipografico.

mingetty: Minimal Getty for consoles.
Habilita las consolas para los distintos niveles de ejecucion.
En este caso el id de la entrada debe coincidir con el sufijo de tty.

1:2345:respawn:/sbin/mingetty --noclear tty1

2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
#
# end of /etc/inittab


sábado, 30 de mayo de 2009

Cambiando el fondo de pantalla de GRUB

El fondo de pantalla que utiliza GRUB (GRand Unifying Bootloader) se encuentra en /boot/message, este es un archivo CPIO.

Para modificar el fondo debemos realizar los siguientes pasos:

1.- Copiamos el archivo message a un directorio temporal.

# cd tmp/
# mkdir grubtemp
# cd grubtemp
# cp /boot/message .

2.- Desempacamos el archivo message con la utiliadad cpio (ver detalle mas adelante).

# cpio -idv <>

3.- Copiamos la imagen que queramos de fondo al directorio grubtemp con el nombre back.jpg y empacamos nuevamente a message.

# cp MiCamino/back.jpg .
# ls cpio -ov > ./message

4.- Realizamos una copia de seguridad de /boot/message y copiamos message modificado a /boot.

# cp /boot/message /tmp/messageold
# cp /tmp/message /boot/message

cpio (Copy In/Out) es una utilidad que permite copiar archivos a o desde un contenedor cpio, que no es más que un fichero que almacena otros archivos e información sobre ellos (permisos, nombres, propietario...). Este contenedor puede ser un disco, otro archivo, una cinta o incluso una tubería, mientras que los ficheros a copiar pueden ser archivos normales, pero también dispositivos o sistemas de ficheros completos.