Fases del Proceso de arranque:
- Ejecución del gestor de arranque
- Carga y ejecución del kernel
- Ejecución del proceso Upstart
Ejecución de scripts de iniciación (en /etc/rcS.d) - Entrada en el runlevel por defecto: ejecución de Scripts en /etc/rcX.d, donde X es el número del runlevel
Gestor arranque
Es la aplicación que se ejecuta durante el arranque del ordenador y que nos permite acceder a diferentes sistemas operativos que podamos tener instalados, los gestores de arranque más conocidos en LINUX son LILO, GRUB
- El gestor de arranque GRUB
- Grub se configura e instala durante el proceso de instalación de UBUNTU
- En este proceso, debe detectar otros sistemas operativos y permitir que, durante el arranque, el usuario pueda seleccionar el mismo.
- Directorio de ficheros de configuración de grub: /boot/grub/
- Fichero principal de configuración: menu.ls
Carga y ejecución del kernel
Tras el gestor de arranque se carga el Kernel en memoria.
Ejecución del proceso Upstart
A continuación,se deben lanzar todos los procesos/servicios necesarios; todo esto que desde siempre había sido una responsabilidad de /sbin/init/ y /etc/inittab, ha quedado sustituido en esta versión por Upstart; así mismo, la configuración de arranque pasa a estar en la carpeta /etc/event.d/.
Sin embargo, la estructura ha quedado un poco mas complicada, debido en parte, con el intento de hacer complatible esta nueva forma de arranque con todo el software disponible. Los directorios implicados seran los siguientes:
/etc/init.d Se trata de algo semejante a un repositorio de scripts de arranque/parada. Sigue igual que antes, y se dispone de un README para ampliar la información.
/etc/event.d En este directorio se situan todos los trabajos a realizar, y que van a ser gestionados por eventos con UPstart. Observad que el inicio y el fin solo son dos eventos mas en este nuevo mundo
Y también tenemos que tener en cuenta que cuando escribo estas líneas, todavía no se considera todo esto estable, pero….
Para cada proceso que tengamos que lanzar, deberemos crear un fichero de texto plano (no ha de ser un ejecutable) y situarlo en este directorio.
Para crearlos, es posible utilizar tabuladores y espacios para darles formato ya que todos los blancos son ignorados a menos que estén entre comillas simples o dobles. Los comentarios se inician con # y continúan hasta el fin de línea
exec y script
Todos los ficheros deben tener un párrafo script o exec. Por medio del mismo, se puede especificar que es lo que se debe lanzar para ese trabajo.
Con exec se indica el path en donde se encuentra el binario a ejecutar, y los posibles argumentos a pasar
Exec /sbin/getty 38400 tty1
Con script facilitamos el código a ejecutar utilizando /bin/sh. La ejecución se realiza con la opción –e por lo que cualquier orden que falle, finaliza inmediatamente el script. El párrafo termina con una línea “end script”
script
# comentario….
id [ …..]; then
…..
fi
end script
script pre-start y post-stop
Adicionalmente, se puede indicar una rutina shell que se ejecute antes de iniciarse (pre-start) o cuando finalice (post-start) el script o el exec principal. Hemos de señalar que no pueden realizar la tarea principal. Estos shells estan pensados para funciones de preparación de entorno o limpieza del mismo, y como todos cualquier fallo en un comando, provocara la finalizacion del script.
Con pre-start de indica el codigo a ejecutar antes del proceso principal
pre-start script
# prepare environment
mkdir -p /var/run/foo
end script
Con post-stop especificamos el codigo a ejecutar cuando el proceso principal finalice o aborte.
post-stop script
# clean up
rm -rf /var/run/foo
end script
start on y stop on
El trabajo que acabas de crear, ya esta listo para que el administrador del sistema lo pueda lanzar manualmente, pero supongo que tambien quieres que pueda arrancar y ser parado automáticamente cuando se produzca algun evento.
Los trabajos, pueden encontrarse en uno de los siguientes estados:
Estado | Descripción |
Stopped | El job esta inactivo y no tiene proceso asociado.Cuando llega un evento se comprueba la lista de trabajos pendientes de arrancar y puede ser movido a los estados de Waiting o Starting |
Waiting | El job es situado en este estado si tiene dependencias. Cuando un job es movido al estado de Running, se comprueba la lista de jobs que se encuentran en este estado, y si coincide, se mueve a Starting. Cuando ocurre un evento, se comprueba la lista de eventos de stop para este estado, y si coincide, se mueve al estado de Stopped |
Starting | Se lanza el script de arranque, y si finaliza con éxito, (o no tiene script de arranque), el job es movido al estado de Running, si el script falla, se mueve a Stopping. Cuando ocurre un evento, se comprueba la lista de eventos de stop, y si coincide, se mueve el job a Stopping |
Running | El proceso asociado al job, esta funcionando. Para los servicios, cuando el proceso finaliza, se mueve automáticamente a la fase de Restarting. Para las tareas, cuando el proceso finaliza, se mueve a Stopping. Cuando llega un evento, se comprueba la lista de eventos de stop para estos procesos, y si coincide, se mueve a Stopping |
Restarting | Se lanza el script de rearranque, y si finaliza con éxito, (o no tiene script de rearranque), el job es movido al estado de Running, si el script falla, se mueve a Stopping. Cuando ocurre un evento, se comprueba la lista de eventos de stop, y si coincide, se mueve el job a Stopping |
Todo esto genera las siguientes transiciones:
Waiting a Starting y Stopped a Starting: ejecuta el script correspondiente a Start.
Starting a Running y Restarting a Running: genera el proceso asociado
Running a Restarting: ejecuta el script correspondiente a Restart
Starting a Stopping, Running a Stopping y Restarting a Stopping: Envia señales a los procesos que estan corriendo para que se detengan, y ejecuta el script de stop.
Alguno de os eventos que podemos utilizar:
Evento | Descripción |
startup | Lanzado por Upstart cuando el ordenador inicia, aun sin disponer de acceso a disco en grabacion ni redEj: Start on startup |
runlevel X | donde X es un numero de 0 a 6 o la letra S; estos script se ejecutaran a la vez que el init del nivel correspondienteEj.:start on runlevel 3 |
started job | se lanza cuando se inicie jobEj. Start on started tty1 |
stopped job | se lanza cuando se detenga jobEj.: Start on stopped tty1 |
Shutdown | El sistema operativo esta cerrandoEj.: Stop on Shutdown |
Default-route up/down | Lanzado por cambios en la conexión de redEj.: Start when default-route is upStop when default-route is down |
filesystem-checked | Cuando el hard detecta la inserción, y finaliza la comprobación: |
writable-filesystem | Cuando el sistema autoriza la escritura en disco |
block-device-added | Lanzado por udev cada vez que se detecta un dispositivo de bloques |
fhs-filesystem | Lanzado pur udev cuando todos los sistemas de ficheros(FHS) se han montado correctamente |
network-interface-added | Lanzado por udev cuando detecta una nueva tarjeta de red |
network-interface-up | Cuando la interface consigue dirección IP |
/etc/rc[0-6,S].d Es estas carpetas se dejan los enlaces a los scripts (que se encuentran en /etc/init.d) que se deben ejecutar según el nivel de ejecución.
Para controlar el orden en que se van a ejecutar los scripts debemos controlar los nombres. Todos los symlinks se han de llamar SNN o KNN y primero se ejecutan los K en orden numérico y luego los S también en orden numérico.
Los runlevels
El runlevel (del inglés, nivel de ejecución) es cada uno de los estados en que se encuentra el sistema. Existen 7 niveles de ejecución en total:
Nivel de ejecución 0: Apagado.
Nivel de ejecución 1: Monousuario (sólo usuario root; no es necesaria la contraseña). Se suele usar para analizar y reparar problemas.
Nivel de ejecución 2: Multiusuario sin soporte de red.
Nivel de ejecución 3: Multiusuario con soporte de red.
Nivel de ejecución 4: Como el runlevel 3, pero no se suele usar
Nivel de ejecución 5: Multiusuario en modo gráfico (X Windows).
Nivel de ejecución 6: Reinicio.
Este sistema de niveles de ejecución lo proporciona el sistema de arranque por defecto de las distribuciones GNU/Linux (init).
Cambiar de runlevel en ejecución
Existe una utilidad para línea de comandos que permite cambiar de un nivel de ejecución a otro. Esta es la herramienta init. Para cambiar de nivel de ejecución sólo hay que ejecutar init seguido del número del runleve. Por ejemplo:
init 0: Cambia al runlevel 0 (se apaga el sistema, equivalente al comando halt).
init 2: Cambia al runlevel 2.
init 6: Cambia al runlevel 6 (reinicia el sistema, equivalente al comando reboot).
Modificar el runlevel por defecto
Por defecto, el sistema suele arrancar en el nivel de ejecución 5 (modo gráfico). Si se quisiera modificar este comportamiento, habría que editar el fichero /etc/inittab.
Atención: si has instalado una de las ultimas versiones de Ubuntu, no encontraras este fichero, pero lo puedes crear y en su interior modificas o creas la siguiente linea:
id:N:initdefault:
Donde N es el runlevel por defecto.