Inicio de Linux, servicios, núcleo y periféricos
Proceso de inicio
El propósito de iniciar el sistema es cargar el kernel de Linux, montar los sistemas de archivos necesarios y, a continuación, iniciar los distintos servicios para permitir que las aplicaciones accedan a los recursos de la máquina y respondan a las solicitudes de los usuarios.
Al poner en marcha la máquina o reiniciar completamente el sistema, se inicia un proceso que implica varias fases descritas en este capítulo.
1. La BIOS y la UEFI
La función de estas dos interfaces alternativas es localizar y cargar en memoria el administrador de arranque de Linux.
a. BIOS
La BIOS (Basic Input Output System) es una interfaz entre el hardware y el software de bajo nivel. Proporciona el conjunto de instrucciones básicas utilizadas por el sistema operativo y los drivers y periféricos.
La BIOS se almacena en la memoria EEPROM (Electrical Erasable Programmable Read-Only Memory) del ordenador. Cuando se enciende el ordenador, o tras reiniciarlo, se manda una señal llamada powergood al microprocesador que ejecuta la BIOS.
La BIOS efectúa un autochequeo (POST) y, después, busca los periféricos. A continuación, se almacena permanentemente la información relativa al hardware en una pequeña memoria CMOS alimentada por una batería. Al final del proceso, se selecciona el periférico de inicio.
La BIOS lee y ejecuta el primer sector físico del soporte físico de inicio. Suele tratarse de los 512 primeros bytes del primer disco duro (el MBR) o de la partición activa (la PBR) si no hay ningún código presente en el MBR.
b. UEFI
El sucesor de BIOS se llama UEFI (Unified Extensible Firmware Interface), sucesor de EFI. La mayoría de los PC y de las placas base vendidos desde el inicio de los años 2010 disponen de UEFI por defecto. Linux es compatible EUFI.
UEFI es un componente software que ejerce de interfaz entre el firmware del hardware y el sistema operativo. Garantiza independencia entre el sistema operativo y la plataforma hardware. Su función principal es arrancar el sistema operativo mediante su firmware, lanzando directamente la carga del sistema.
UEFI implementa funcionalidades adicionales en comparación con BIOS, tales como:
-
una interfaz gráfica;
-
soporte para discos de más de 2 TB mediante GPT;
-
muchos servicios para gestionar variables (empleando la NVRAM)...
init System V
El modo de arranque del sistema System V (SysVinit), nativo de Unix, ha sido reemplazado con mayor frecuencia por systemd en distribuciones recientes. Por otro lado, es posible tener que administrar servidores de producción que todavía están ejecutando este modo de arranque.
1. Función de init
El programa init es el primer proceso que se inicia y el último que se detiene dentro del sistema, y su misión es ejecutar las demás tareas. La función de init consiste en iniciar y detener todos los servicios. De la misma manera, ejecuta las diferentes tareas iniciales necesarias para el buen funcionamiento de Linux mediante varios comandos y scripts.
Una vez iniciado el sistema y ejecutados los servicios, init sigue activo para gestionar los cambios de estado de los procesos que controla y los niveles de ejecución.
El proceso init es el padre de todos los procesos y tiene siempre el PID 1. Es arrancado por el kernel, que lleva el PID "virtual" 0.
Su configuración está en el archivo /etc/inittab. Si este archivo está ausente o corrupto, hay que arrancar el sistema en modo single (S, s, 1 Single) y restaurarlo, o en el peor de los casos, arrancar desde un soporte externo o un disco de emergencia.
2. Niveles de ejecución
Un nivel de ejecución, o runlevel, se corresponde con un estado de funcionamiento de Linux (incluida la parada). Cada nivel de ejecución se controla por init y dispone de su propia configuración (o por inittab, o por scripts llamados initscripts). Por ejemplo, se puede utilizar un nivel de ejecución para arrancar Linux en modo monousuario, otro en modo multiusuario, con o sin red, con o sin modo gráfico.
El administrador puede configurar todos los niveles de ejecución. Por lo general, se definen de la siguiente manera en distribuciones como Red Hat y OpenSUSE:
Nivel |
Efecto |
0 |
Parada: detiene el sistema operativo, apaga la máquina. |
1 |
Modo monousuario para el mantenimiento en consola. |
2 |
Multiusuario, sin red. |
3 |
Multiusuario, con red. |
4 |
Libre. |
5 |
Multiusuario, con red, con entorno gráfico. |
6 |
Reinicio de la máquina. |
S,s |
Single user mode, modo de seguridad. |
Los niveles 7 a 9 son válidos, pero no se utilizan por defecto.
El nivel de ejecución se sitúa por defecto en /etc/inittab, en la línea que tiene como tipo de acción initdefault.
Sintaxis...
systemd
systemd (system daemon) es, al igual que init System V o upstart, un sistema de inicio, pero es más reciente y está diseñado específicamente para Linux. Al igual que el init clásico, es el primer proceso iniciado por el kernel después de haber sido inicializado.
systemd es el más utilizado de los sucesores de init System V. Todas las distribuciones principales (Red Hat, SuSE, Ubuntu, Debian) lo usan.
Systemd es el resultado de una profunda reflexión sobre el inicio del sistema y de los servicios. Su autor, Lennart Poettering (quien también diseñó los programas PulseAudio y Avahi), comparó los programas de inicio de Linux con los de otros sistemas, especialmente MacOS, en términos de velocidad y número de procesos requeridos.
Por lo tanto, Systemd ofrece una puesta en marcha más rápida de los servicios, basándose en eventos y en un funcionamiento asíncrono y, además, permite conocer y gestionar el estado exacto de cada proceso que constituye un servicio mediante una interfaz en línea de comandos o gráfica, y sustituyendo los scripts de shell por un programa compilado.
systemd utiliza mecanismos de alto rendimiento que llaman a funciones (API) que solo están presentes en el kernel de Linux, no se ajustan a POSIX y, por lo tanto, no son portables a otros sistemas de tipo Unix.
1. Unidades objetivo y servicios
En systemd, el concepto de nivel de ejecución ya solo existe para la compatibilidad con System V. El estado deseado por el sistema después de haber ejecutado los servicios se llama unidad objetivo target unit.
El componente básico de systemd es la unidad o unit. Existen varios: servicios, sockets, dispositivos, objetivos, etc. Un objetivo es esencialmente el punto de sincronización entre las unidades que se van a alcanzar. Las unidades objetivo corresponden a los niveles de ejecución antiguos, pero son mucho más flexibles y configurables.
Un objetivo puede agrupar a otros. Se pueden activar y establecer varios objetivos al mismo tiempo. Por ejemplo, un objetivo corresponde a la activación de los servicios de red, otro al entorno gráfico, etc.
2. Configuración
Las definiciones de las distintas unidades se hacen en /lib/systemd/system. Las unidades objetivo o los servicios que deben ser gestionados por el sistema durante el arranque están...
upstart
upstart es un sucesor del servicio init, desarrollado originalmente para Ubuntu, que funciona de forma asíncrona y se basa en eventos. Se ha utilizado en versiones anteriores de algunas distribuciones (Ubuntu hasta la versión 14.04, Debian hasta la versión 6, Red Hat Enterprise Linux 6, etc.). Lo utiliza Google Chrome OS (y Chromium OS).
upstart controla todos los servicios, gestiona su arranque y parada, y supervisa su funcionamiento. Es compatible con init System V. Sin embargo, los servicios upstart no funcionan con System V.
Con upstart, los servicios pueden iniciarse de forma asíncrona y, por lo tanto, pueden paralelar y no iniciarse secuencialmente como con init. De este modo, se pueden definir dependencias entre los servicios y optimizar sus inicios y paradas. Al basarse en eventos, upstart podrá, por ejemplo, iniciar los servicios bluetooth únicamente si se ha conectado un pendrive de este tipo, y no de forma inútil y sistemática al arrancar la máquina.
1. Configuración
Los archivos de configuración de upstart están en /etc/init. Son archivos de configuración con sintaxis específica, aunque también pueden contener líneas de comandos shell:
Ejemplo
Archivo de configuración del servicio sshd:
# ssh - OpenBSD Secure Shell Server
#
# The OpenSSH server provides secure shell access to the system.
Description...
Consultar el registro del sistema
Se pueden utilizar varias herramientas para supervisar la actividad del sistema y la aplicación a través de archivos de registro de eventos (archivos de log). El administrador debe poder revisar estos archivos con frecuencia para detectar posibles problemas y supervisar la idoneidad de los recursos de hardware para satisfacer las necesidades cambiantes.
1. dmesg
El comando dmesg permite recuperar los mensajes del núcleo emitidos al arrancar la máquina y los emitidos después. El registro utilizado por dmesg es circular. Después de un cierto número de mensajes, los primeros desaparecen.
Este comando se puede utilizar para comprobar si hay errores, ya sea al inicio o más tarde. Esto se debe a que después del arranque, los mensajes continúan registrándose, especialmente cuando los dispositivos están conectados en caliente, cuando se cargan ciertos módulos, cuando el sistema de archivos está dañado, etc.
Ejemplo
dmesg
[ 0.000000] microcode: microcode updated early to revision 0x2f, date = 2019-02-17
[ 0.000000] Linux version 5.14.0-162.23.1.el9_1.x86_64 (mockbuild@x86-vm-07.build.
eng.bos.redhat.com) (gcc (GCC) 11.3.1 20220421 (Red Hat 11.3.1-2), GNU ld version
2.35.2-24.el9) #1 SMP PREEMPT_DYNAMIC Thu Mar 23 20:08:28 EDT 2023
[ 0.000000] The list of certified hardware and cloud instances for Red Hat Enterprise
Linux 9 can be viewed at the Red Hat Ecosystem Catalog, https://catalog.redhat.com.
[ 0.000000] Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.14.0-162.23.1.el9_1.x86_64
root=/dev/mapper/rhel-root ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/ ...
El kernel y sus módulos
El kernel es el corazón del sistema operativo. Estrictamente hablando, Linux es el kernel del sistema operativo, creado originalmente por Linus Torvalds. El sistema operativo Linux, en el sentido más amplio, está compuesto por el kernel y un conjunto de herramientas que permiten que sea explotado por aplicaciones: las herramientas GNU. Por lo tanto, Linux debería llamarse GNU/Linux: GNU para las herramientas, Linux para kernel.
El kernel de Linux es monolítico: sus funcionalidades y componentes se agrupan en un solo programa. Sin embargo, se complementa con un conjunto de extensiones independientes, llamadas módulos, que se pueden cargar o descargar de forma dinámica.
El kernel
El kernel se almacena en un archivo en el directorio /boot. Por convención, su nombre tiene la forma vmlinuz-X.Y.Z-VersText.
Ejemplo
# ls /boot/vmlinuz*
vmlinuz-5.14.0-162.23.1.el9_1.x86_64
La versión actual del kernel se obtiene con el comando uname -r.
Ejemplo
uname -r
5.14.0-162.23.1.el9_1.x86_64
Las letras tienen un significado especial.
-
X: versión principal del kernel. La versión 3 se lanzó en el verano de 2011; la versión 4; en abril de 2015; la versión 5, en marzo de 2019; y la versión 6, en octubre de 2022.
-
Y: cada incremento representa una evolución importante del núcleo.
-
Z: versión menor del kernel. Cuando un lote de cambios de una versión anterior requiere el lanzamiento de un nuevo kernel, este número se incrementa.
-
Vers: la versión específica de la distribución.
-
Text: texto que proporciona detalles sobre el núcleo.
1. uname
El comando uname (unix name) permite obtener mucha información sobre la versión actual de Linux en este caso.
Sintaxis
Opción |
Descripción |
-m (machine) |
Tipo de hardware de la máquina. |
-n (nodename) |
Nombre de la máquina. |
-r (release) |
Versión (número) del núcleo. |
-s (system name) |
Nombre del sistema operativo. Predeterminado. |
-p (processor) |
Tipo de procesador. |
-i |
Plataforma física. |
-v (version) |
Versión del sistema. |
-a (all) |
Toda la información. |
Ejemplo
# uname -a
Linux srvrh 5.14.0-162.23.1.el9_1.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Mar
23 20:08:28 EDT 2023 x86_64 x86_64 x86_64 GNU/Linux
2. Gestión de los módulos
Los componentes...
Archivos asociados a los periféricos
Los dispositivos se administran mediante controladores de software, a menudo en forma de módulos complementarios del kernel.
Los dispositivos están asociados a archivos de tipo especial, que no son archivos de disco, sino medios de comunicación con los controladores correspondientes. Los procesos pueden acceder a los dispositivos a través de estos archivos, tanto en modo lectura como en modo escritura. El proceso abre el archivo especial del dispositivo (llamada al sistema open()) y, a continuación, lee (llamada al sistema read()) o escribe (llamada al sistema write()) datos hacia o desde el dispositivo. A continuación, el controlador del dispositivo interpreta estas operaciones de lectura/escritura.
Linux accede a los periféricos mediante archivos especiales
1. Archivos especiales
Los archivos especiales asociados a los dispositivos se colocan normalmente en el directorio /dev. El primer carácter mostrado por el comando ls -l FicEspec identifica el tipo de archivo FicEspec especial:
-
c: periférico en modo carácter;
-
b: periférico en modo bloque.
Estos modos diferencian el tipo de intercambio de datos entre el módulo de gestión de archivos y el driver del periférico.
En el modo de caracteres, no se utilizan búferes del sistema y la comunicación es byte a byte.
En el modo de bloque, el sistema accede al dispositivo a través de búferes del sistema. Esto da como resultado un intercambio de datos más rápido para dispositivos como discos.
Los otros dos atributos esenciales de un archivo periférico son el par de datos que se encuentra en lugar del tamaño del archivo: el número mayor y el número menor.
-
El número mayor identifica el driver que gestiona este tipo de periférico.
-
El número menor es una información proporcionada al controlador, generalmente el identificador del periférico, pero también puede designar una particularidad del periférico, como la partición de un disco, una ubicación concreta, el número de tarjeta (en caso de que haya varias tarjetas de controladores idénticas, varias tarjetas de sonido, etc.).
Veamos algunos archivos especiales corrientes, según la distribución:
-
/dev/mem: memoria física.
-
/dev/kmem: memoria virtual del núcleo....