En este momento estás viendo Proceso de arranque del sistema. Grub. Kernel. Init.

Proceso de arranque del sistema. Grub. Kernel. Init.

Proceso de arranque del sistema. Grub. Kernel. Init.

En este artículo vamos a ver el proceso de arranque del sistema operativo, el gestor de arranque y como solucionar problemas de este, el arranque del kernel, proceso init, los runlevels y la parada del sistema.

Sumario

  • Proceso de arranque del sistema
  • Gestor de arranque GRUB2
    • Problemas con GRUB
  • Arranque del kernel
  • Proceso init y runlevels
  • Parada del sistema

Proceso de arranque del sistema

El proceso de arranque del sistema se realiza por fases tras realizar una verificación de que están conectados los periféricos necesarios para poder continuar, normalmente teclado y ratón. Estas fases son:

1.- Selección del dispositivo de arranque (BIOS)
El BIOS busca un dispositivo de inicio, el disco duro, USB o CD, y de ahí pasa el control al primer sector físico del dispositivo conocido como MBR «master boot record», son los primeros 512 bytes, el primer sector del disco duro y que forman la fase 1 de GRUB.

2.– Ejecución del gestor de arranque desde el primer bloque del dispositivo de arranque
La fase 1 de GRUB carga la siguiente fase de GRUB, ubicada físicamente en cualquier parte del disco duro.

3.– Carga y ejecución de la segunda fase del gestor de arranque
La fase 2 de GRUB, cargada por la fase 1, recibe el control, y presenta al usuario el menú de inicio.

4.– Carga y ejecución del kernel del S.O.
GRUB carga el kernel seleccionado por el usuario en la memoria y le pasa el control.

5.– Ejecución del proceso init
Una vez cargado el kernel se ejecuta el programa init que se encarga del resto del arranque.

Esquema del proceso de arranque del sistema

Gestor de arranque GRUB2

GNU GRUB «GNU GRand Unified Bootloader» es un cargador de arranque múltiple, desarrollado por el proyecto GNU, que nos permite iniciar diversos sistemas operativos desde un menú de arranque, eligiendo qué Sistema Operativo arrancar de los que tengamos instalados.

Se usa principalmente en sistemas operativos GNU/Linux desde 2007, fecha en que algunos de ellos comenzaron a utilizar GRUB 2. A finales de 2009, prácticamente todas las distribuciones GNU/Linux lo tenían instalado por defecto. El sistema operativo Solaris ha usado GRUB como cargador de arranque en sistemas x86 desde la revisión 10 (Enero de 2006).

Se configura e instala durante el proceso de instalación del S.O., detectando otros Sistemas Operativos. La configuración se gestiona automáticamente, aunque tenemos ficheros de configuración en:

  • /boot/grub/grub.cfg : generado automáticamente por «grub2-mkconfig». ¡No modificar! El propio fichero nos dice «DO NOT EDIT THIS FILE»
  • /etc/default/grub : aquí encontramos muchas opciones generales. Se puede editar.
  • /etc/grub.d/ : directorio con ficheros de configuración. En el fichero nos dice «This file does nothing and will be removed in a later release».
Fichero de configuración de GRUB

Tras hacer cualquier modificación en estos ficheros de configuración, para aplicar los cambios, tendremos que actualizar GRUB ejecutando

update-grub

Problemas con GRUB

Podemos encontrarnos problemas con GRUB, que se resumen en dos tipos.

Tipo 1 : Consiste en que en la fase 1 no se encuentra en el MBR, por dos razones


1.– Se ha instalado otro sistema operativo. Cuando hacemos una instalación dual, si se trata de Windows la segunda instalación, se carga el MBR, impidiendo el arranque de Linux.

2.– La instalación no se ha finalizado correctamente.

La solución será reinstalar grub en el disco con el comando «grub-install»

Tipo 2 : Carga la fase 1 pero no encuentra una configuración correcta. Puede tratarse de los siguientes problemas:


1.– Se ha trasladado el disco a otro sistema
2.– La actualización de la configuración no funcionó correctamente
3.– Se ha intentado, sin éxito, cambiar manualmente la configuración.

La solución será, en este caso, actualizar (regenerar) la configuración de Grub con el comando «update-grub»

Veamos una solución genérica para estos problemas y reparar el gestor de arranque.

Tenemos que arrancar el equipo con el usb o CD con la ISO «Live CD» con la que instalamos el SO. Valdría cualquier otra distribución Linux, pero con la misma arquitectura. Y elegir la opción de ver el S.O. sin instalarlo. Esto es lo que se llama un LiveCD.

Abrimos la terminal y ejecutamos el comando «lsblk». Veremos algo como lo siguiente

Salida de lsblk

Fíjate en los puntos de montaje. Yo tengo «/» en sdc4 y «/boot» en sdc3. Tu lo tendrás en sdaX. Acuérdate de cambiar la X por la que corresponda en tu caso.

Ahora hay que montar estas particiones en un punto de montaje temporal. Es muy importante el orden de ejecución de los comandos.

mount /dev/sdc4 /mnt
mount /dev/sdc3 /mnt/boot
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys

Cambiamos al sistema y ejecutamos la instalación y configuración de Grub. Aquí sin el número de la partición.

chroot /mnt
(chroot)# grub-install /dev/sdc
(chroot)# update-grub

Salimos de «chroot», desmontamos las particiones.

(chroot)# exit
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys
umount /mnt/boot
umount /mnt

Y reiniciar. Acuérdate de quitar el usb o CD.

reboot

Ya debería estar solucionado. Hemos instalado GRUB con «grub-install» y actualizado con «update-grub».

Lo vemos en la siguiente imagen.

grub install y update grub

Arranque del kernel

Ahora viene la fase de arranque del Kernel Linux, el nucleo del S.O. Al margen de la distribución que usemos, todas usarán una versión más o menos personalizada del Kernel original de este sistema operativo. El Kernel se guarda comprimido en el disco, por lo que lo primero será descomprimirse en la memoria para poder continuar.

Grub busca el fichero con el kernel y lo carga en la memoria (initrd). Establece los parámetros de arranque del kernel, como el sistema de ficheros raiz «/» y «/boot» y otros programas de inicio. Después pasa el control al kernel.

El kernel (dmesg), comienza el arranque inicial haciendo el POST «Power-On Self Test», donde hace una detección de aspectos básicos del hardware (microprocesador, etc…). E inicia la ejecución de procesos en initrd: detección del hardware, carga de drivers esenciales, etc… Seguidamente monta el sistema de archivos raíz.

En este momento el S.O. ya ha tomado el control.

Proceso init y runlevels (systemd)

El siguiente paso será la inicialización de todos los componentes. Para ello, la mayoría de las distros utilizan systemd que es un conjunto de demonios o «daemons» de administración de sistema, bibliotecas y herramientas diseñados como una plataforma de administración y configuración central para interactuar con el núcleo del Sistema operativo GNU/Linux.

Systemd lanza el proceso con PID 1, que se ejecuta en segundo plano y que será el proceso padre de todos los procesos y servicios que se irán lanzando después, que forman parte del sistema y son esenciales para su correcto funcionamiento.

Una vez que el sistema arranca con éxito, estos servicios seguirán funcionando después del proceso del boot, y se cerrarán en el momento del apagado del sistema. Es decir, el proceso ID 1 seguirá en ejecución hasta que se ejecute un comando como «shutdown», «reboot», «systemctl halt», «systemctl poweroff» o «systemctl reboot», que iniciarán un apagado ordenado del equipo.

Además de los procesos y servicios esenciales de Linux, también se pueden cargar otros servicios personalizados, por ejemplo, un servidor que tengamos montado y configurado, como un SSH, FTP, Http, etc…

Si no hemos hecho modificaciones en el sistema, lo normal es que todo funcione correctamente sin errores, ya que se trata de un proceso totalmente automatizado que no requiere de nuestra intervención.

Systemd nos ofrece una serie de herramientas para administrar el sistema. Vemos unas cuantas

Herramientas de systemd

Existen alternativas a systemd como System V y Upstart, pero se ha impuesto systemd y se utiliza en casi todos los sistemas modernos, a pesar de las críticas de parte de la comunidad Linux.

Para comprobar si utilizamos systemd, init o upstart, ejecuta

ps -p1 | grep "init\|upstart\|systemd"
o
ps aux | head -n 2
Comprobación de sistema de arranque

Y para ver si tenemos activo el servicio ufw ejecutamos

systemctl status ufw
Comprobación del servicio cortafuegos

Runlevel

Llegados a este punto, nuestra distro ya estará lista. Entonces es cuando entra la fase «runlevel» en la que se indicará con un número el tipo de funcionamiento del sistema operativo según los servicios que se hayan cargado correctamente.

Runlevel define diferentes configuraciones del arranque/parada del sistema mediante un conjunto de scripts que se ejecutan para cada runlevel, también llamados «target». Lo podemos ver con el comando

systemctl list-units --type=target
Servicios en funcionamiento

Y para ver el nivel de ejecución

who -r
runlevel en ejecución

Runlevels definidos

0 – Halt. Error crítico del sistema.
1 – Modo para un solo usuario. Sólo el root tiene acceso, se desactivan todos los procesos, red, etc.
2 – Modo multiusuario sin acceso a la red. Definido por el usuario.
3 – Modo multiusuario en terminal.
4 – Modo definido por el usuario.
5 – Modo multiusuario con entorno gráfico. Es el modo en el que se intentará arrancar por defecto siempre.
6 – Modo reinicio del equipo. (reboot)

En cualquier momento el administrador del sistema puede cambiar de runlevel, ejecutando el comando

telinit <numero_runlevel>

Por ejemplo, un valor «0» forzaría un apagado del PC, mientras que un valor «1» solo nos permitiría usar Linux en modo monousuario.

Podemos ver el tiempo que ha tardado nuestra distro en cargar con el comando

systemd-analyze
Tiempo de arranque del sistema

El tiempo variará en función de los servicios que se inicialicen en el arranque y del hardware instalado. En un sistema de escritorio con los servicios básicos, lo normal será sobre los 20 segundos.

Parada del sistema

Para parar el sistema es necesario realizar varias tareas de forma ordenada. Esto se controla mediante los runlevels 0 «parar» y 6 «reiniciar» y algunos comandos como

  • – # shutdown -r now
  • – # shutdown -h +5 «paramos en 5 minutos»
  • – # telinit 0
  • – # systemctl halt
  • – # systemctl poweroff
  • – # systemctl reboot
  • – En el escritorio: Sistema -> Salir

Lo que estamos haciendo es matar o reiniciar el proceso con PID 1 y apagar o reiniciar nuestro equipo de forma ordenada.

Si tienes algún comentario que hacer, al pie del post tienes un formulario para hacerlo.

Y si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, o te quieres suscribir para recibir un correo-e una vez al mes con las nuevas publicaciones, en la página de contacto, tienes otro formulario.

Esta entrada tiene 2 comentarios

  1. Barto

    Gracias, buen trabajo Javier

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.