¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. LINUX
  3. Inicio de Linux, servicios, núcleo y periféricos
Extrait - LINUX Dominar la administración del sistema (5ª edición)
Extractos del libro
LINUX Dominar la administración del sistema (5ª edición)
1 opinión
Volver a la página de compra del libro

Inicio de Linux, servicios, núcleo y periféricos

Proceso de inicio

1. La BIOS y UEFI

a. BIOS

La BIOS (Basic Input Output System) es un software de interfaz entre el hardware y el software a un nivel muy básico. Proporciona el conjunto de instrucciones básicas utilizadas por el sistema operativo. Provee el nivel de interfaz más bajo a los drivers y periféricos. 

La BIOS está en la memoria EEPROM (Electrical Erasable Programmable Read-Only Memory) del ordenador. Cuando se enciende el ordenador, o tras un reseteado, se manda una señal llamada powergood al microprocesador, que activa la ejecución de la BIOS.

La BIOS efectúa un autochequeo del encendido (POST), luego busca los periféricos, en particular los utilizados para iniciar el sistema. A continuación, se almacena la información relativa al hardware de manera permanente en una pequeña memoria CMOS alimentada por una batería. Al final de 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, como se describió en el capítulo Los discos y el sistema de archivos.

b. UEFI

El sucesor de BIOS se llama UEFI (Unified Extensible Firmware Interface, interfaz extensible de firmware unificada), sucesor de EFI. UEFI se pronuncia como "Unify" pero sin la n. Linux soporta UEFI pero el gestor de arranque debe ajustarse en consecuencia. La mayoría de los PC y placas base vendidos desde el inicio de los años 2010 disponen de UEFI por defecto.

UEFI es un componente software que realiza la 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 a través de un "boot manager". Al contrario que BIOS, que busca un programa de arranque en un MBR, UEFI cargará, mediante su microcódigo, todo lo necesario (controladores por ejemplo) para poder iniciar directamente la carga del SO, siempre que éste sea compatible con UEFI.

UEFI dispone de muchas ventajas y funcionalidades adicionales en comparación con BIOS (que ha quedado totalmente obsoleto para los procesadores, controladores...

init System V

1. init System V en 2020

init System V ha sido remplazado masivamente por systemd en todas las distribuciones recientes. Ninguna distribución reciente utiliza init System V por defecto. Podría tener la tentación de saltarse esta parte.

Esto sería un error, y aquí las razones:

  • La primera, y pragmática, es que muchos editores todavía no han hecho el esfuerzo de adaptar sus scripts de arranque, los cuales están ubicados en /etc/init.d/.

  • La segunda, es que en entornos empresariales no actualizamos los servidores tan rápido como aparecen las nuevas versiones. Encontramos muchas versiones antiguas de distribuciones que funcionan con init (esperemos que estas empresas ofrezcan un soporte técnico extendido).

  • La tercera, es que systemd y upstart mantienen une compatibilidad con la noción de runlevels y scripts init. Es evidente que esto es por la primera razón.

  • La cuarta, es que los sucesores de init en Linux no son POSIX. Init es POSIX. Si comprende su funcionamiento usted estará más cómodo con otros Unix, libres y propietarios.

Finalmente, estas distribuciones profesionales, están o han estado soportadas hasta hace muy poco, y utilizan init System V:

  • El soporte de ELS de Red Hat 5 terminó en noviembre de 2020.

  • El soporte LTSS de Suse Linux Enterprise Server terminará en marzo de 2022.

Sin embargo, si su caso no entra en esta categoría, vaya al punto siguiente y sáltese la sección que no le interese.

2. Funciones

El programa init es el primer proceso que se inicia y el último que se para dentro del sistema, y su misión es ejecutar las demás tareas. La función de init consiste en iniciar y parar todos los servicios. init ejecutará las diferentes tareas iniciales necesarias para el buen funcionamiento de Linux mediante la ejecución de 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 de los niveles de ejecución.

El programa init puede cambiar de una distribución a otra. Ya que se trata del primer programa ejecutado, podría ser:

  • init System V

  • upstart

  • systemd

  • u otro ejecutable

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"...

systemd

1. Fundamentos

systemd "system Daemon" es, al igual que init System V o upstart, un sistema de arranque alternativo al init clásico. Está diseñado específicamente para el núcleo de Linux. Al igual que el init clásico, es el primer proceso arrancado por el núcleo una vez concluida la inicialización del mismo.

En la corta guerra entre los sucesores de init SystemV, ganó systemd, frente a upstart. Aparte de sus grandes cualidades y su adopción por el conjunto de editores profesionales para sus distribuciones, fue sobre todo la decisión de Debian en febrero de 2014 de adoptar systemd lo que venció las últimas resistencias de Canonical, fundador de Ubuntu y autor de upstart. Todas las distribuciones mayores (Red Hat, SuSE, Ubuntu, Debian) y sus derivados utilizan systemd.

El sustituto de init systemd es fruto de una reflexión profunda sobre la ejecución de servicios, combinando todos los sistemas operativos. Su autor, Lennart Poettering (a quien debemos también PulseAudio y Avahi) ha comparado en particular init System V, upstart y el sistema de arranque de Mac OS X y ha sacado conclusiones interesantes sobre las ventajas y limitaciones de cada uno de ellos. Se puede acceder a sus conclusiones en la siguiente página web: http://0pointer.de/blog/projects/why.html

Son bastante constructivas.

En su defensa, Lennart hace algunas constataciones interesantes sobre la duración del arranque de un sistema y el número de procesos que arrancan antes de llegar a la pantalla de login. Especialmente, invita a observar cuál es el PID del primer proceso iniciado por el usuario justo después del arranque de la máquina. Ronda el 150 en Mac OS, pero es alrededor de 1800 en una distribución clásica. Por lo tanto, hay un problema. Systemd permite acelerar el arranque de servicios, siempre basado en eventos y de forma asíncrona. Pero va más allá, especialmente anticipándose a las necesidades de varios servicios para acelerar su carga en el futuro, averiguar y gestionar el estado exacto de cada proceso que forme parte de un servicio controlando estos sobre todo gracias a una interfaz CLI y otra gráfica. Además, aboga por sustituir el shell script por un lenguaje compilado.

A pesar de que systemd utiliza mecanismos eficientes, hace...

upstart

1. Fundamentos

Upstart es el sustituto del servicio init, inicialmente desarrollado para Ubuntu por un empleado de la sociedad Canonical, que funciona de manera asíncrona y basado en eventos. En Ubuntu lo encontramos hasta la versión 14.04, en Debian hasta la versión 6, al igual que Red Hat Enterprise Linux 6 y ciertas versiones de Fedora y las versiones derivadas asociadas (Oracle Linux por ejemplo). De manera más sorprendente, upstart lo usa Google Chrome OS (y Chromium OS) en la base de todos los Chromebooks del mercado.

Para comprender el poder de upstart, puede visitar la página dedicada al arranque y a la gestión de servicios en Chrome OS : https://www.chromium.org/chromium-os/chromiumos-design-docs/boot-design

Como puede ver, upstart, sencillo y ligero, es usado por muchos productos, y como el soporte de Red Hat Enterprise 6 (ELS) termina en junio de 2024, hay que conocerlo.

upstart controla el conjunto de servicios, gestiona su arranque y su detención y supervisa también su funcionamiento. Por razones evidentes, mantiene compatibilidad con init System V: cualquier servicio System V funcionará con upstart, sin embargo los servicios upstart no funcionan con System V. upstart es de momento el init predeterminado de muchas distribuciones, y su migración se efectua con facilidad gracias a esta compatibilidad.

Con upstart, los servicios pueden iniciarse de forma asíncrona...

Consultar el registro del sistema

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 de dmesg es circular. Después de cierto número de mensajes, los primeros desaparecen. Sin embargo, estas entradas en el registro no están perdidas, ya que el servicio syslogd (capítulo La red) las escribe en archivos.

El administrador, ingeniero o usuario del sistema Linux suele iniciar este comando para comprobar la presencia de posibles errores. En efecto, después del boot, los mensajes siguen llegando, en particular durante la conexión en caliente de periféricos, durante la carga de algunos módulos, cuando se producen averías, durante una corrupción del sistema de archivos, etc.

Se ha truncado voluntariamente el ejemplo siguiente a las primeras líneas, ya que la salida original contiene más de 500. Las primeras muestran todo el principio de la ejecución del núcleo (información facilitada por la BIOS). En medio se muestra la detección del primer disco duro y de sus particiones. El final muestra lo que ocurre al insertar de un pendrive, después del boot, durante una utilización normal y en el momento de desconectarse.

# dmesg 
 
[    0.000000] Linux version 5.8.15-301.fc33.x86_64 (mockbuild@bkernel01.iad2.
fedoraproject.org) (gcc (GCC) 10.2.1 20200826 (Red Hat 10.2.1-3), GNU ld version 
2.35-10.fc33) #1 SMP Thu Oct 15 16:58:06 UTC 2020 
[    0.000000] Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.8.15-301.fc33.x86_64 
root=/dev/mapper/fedora_fedora-root ro rd.lvm.lv=fedora_fedora/root rhgb quiet 
[    0.000000] x86/fpu: x87 FPU will use FXSAVE 
[    0.000000] BIOS-provided physical RAM map: 
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable 
[    0.000000] BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved 
[    0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved 
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000007ffd9fff] usable 
[    0.000000] BIOS-e820: [mem 0x000000007ffda000-0x000000007fffffff] reserved 
[    0.000000]...

Servicios y módulos del núcleo

1. Presentación

El núcleo es el corazón del sistema operativo Linux. Linux es el núcleo, el sistema operativo tal y como lo desarrolló originalmente Linus Torvalds. El sistema operativo Linux en su amplio contexto se compone del núcleo y de las herramientas operativas básicas, las herramientas GNU. De igual forma, varios son los que dicen que Linux debería llamarse GNU/Linux: GNU por las herramientas, Linux por el núcleo, GNU/Linux para el Sistema Operativo. Nosotros lo llamaremos Linux.

El núcleo de Linux es libre. Sus fuentes están disponibles. Por lo tanto, se puede volver a compilar para adaptarlo específicamente a sus necesidades, modificarlo y añadirle extensiones.

El núcleo de Linux forma parte de la familia de los núcleos monolíticos, es decir, que agrupan todas sus funcionalidades y componentes en un programa único y sus extensiones, llamadas módulos. Desde la versión estable 2.0 el núcleo es modular.

El núcleo se llama kernel. Está en /boot y su nombre, por convención, comienza a menudo por vmlinuz-X.Y.Z.p-Vtxt

Se obtiene la versión del núcleo con el comando uname.

$ uname -r 
5.8.15-301.fc33.x86_64 

Las letras tienen un significado particular.

  • X: versión mayor del núcleo. Entre la versión 1 y 2, el paso al funcionamiento modular ha sido determinante, así como la nueva implementación de la capa de red. La versión 3 vio la luz en verano de 2011, la versión 4 en abril de 2015, la versión 5 en marzo de 2019.

  • Y: hasta el núcleo 2.5, un valor par representa una rama estable del núcleo. Una versión impar representaba una rama de desarrollo (¡cuidado!). Cada incremento representa una evolución importante del núcleo. 

Las versiones 2.6, 3.x, 4x y 5.x no disponen de ramas de desarrollo, ya que evolucionan demasiado rápido. Los desarrolladores decidieron implementar sus novedades directamente en la versión estable después de una fase importante de revisiones y de versiones candidatas (rc). 

  • Z: versión menor del núcleo. Cuando un lote de modificaciones, con respecto a una versión anterior, necesita la difusión du nuevo núcleo, entonces se incrementa esta...

Compilar un núcleo

1. Obtener las fuentes

a. Fuentes oficiales

Las fuentes oficiales del núcleo se llaman vanilla. Un núcleo (o kernel) vanilla es un núcleo bruto, sin parches añadidos, procedente directamente de los desarrolladores que colaboran en el núcleo, y no ha sido adaptado aún a ninguna distribución.

Se obtienen las fuentes oficiales desde el sitio https://www.kernel.org. El comando wget lo hará por nosotros: 

$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-5.5.2.tar.xz 

Una vez se haga con las fuentes, debe configurar, compilar e instalar un núcleo, y si es preciso, crear un initrd antes de poder utilizarlo.

El núcleo se proporciona en forma de carpeta comprimida que debe abrir con las herramientas adecuadas.

El formato actual de compresión empleado es el formato XZ. Probablemente deberá instalar las herramientas xz-utils (Debian, Ubuntu) o xz (Fedora, Red Hat). La opción asociada de tar es "J".

# ls 
*linux-5.5.2.tar.xz 
# tar tvJf linux-5.5.2.tar.xz |more 
 
drwxrwxr-x root/root        0 2020-02-04 19:18 linux-5.5.2/ 
-rw-rw-r-- root/root    15318 2020-02-04 19:18 linux-5.5.2/.clang-format 
-rw-rw-r-- root/root       59 2020-02-04 19:18 linux-5.5.2/.cocciconfig 
-rw-rw-r-- root/root       71 2020-02-04 19:18 linux-5.5.2/.get_maintainer.ignore 
-rw-rw-r-- root/root       62 2020-02-04 19:18 linux-5.5.2/.gitattributes 
-rw-rw-r-- root/root     1746 2020-02-04 19:18 linux-5.5.2/.gitignore 
-rw-rw-r-- root/root    14461 2020-02-04 19:18 linux-5.5.2/.mailmap 
-rw-rw-r-- root/root      423 2020-02-04 19:18 linux-5.5.2/COPYING 
-rw-rw-r-- root/root    99600 2020-02-04 19:18 linux-5.5.2/CREDITS 
drwxrwxr-x root/root        0 2020-02-04 19:18 linux-5.5.2/Documentation/
-rw-rw-r-- root/root       13 2020-02-04 19:18 linux-5.5.2/Documentation/.gitignore 
drwxrwxr-x root/root        0 2020-02-04 19:18 linux-5.5.2/Documentation/ABI/ 
-rw-rw-r-- root/root     3821...

Los archivos de periféricos

1. Introducción

Regresamos al funcionamiento de los periféricos dentro de un ordenador. El principio suele ser el mismo en todos los ordenadores.

Los periféricos están vinculados a un controlador, por ejemplo IDE o SATA para los discos IDE, un controlador SCSI para los discos, lectores y otros escáneres SCSI, o incluso un controlador USB. Un controlador debe saber controlar varios periféricos vinculados a él.

El controlador se comunica con el microprocesador y la memoria con la ayuda del bus (bus de comandos y datos).

En cuanto a Linux, el controlador y sus periféricos se gestionan con la ayuda de drivers (un driver para el controlador, y uno o varios drivers para los periféricos relacionados con él, por ejemplo, un driver para el controlador SCSI, luego un driver para los discos, otro para los escáneres y otro para un CD-Rom). El driver suele ser un módulo complementario del núcleo, entregado por el fabricante o ya presente.

Los periféricos son vistos como archivos. En consecuencia, los procesos acceden a los periféricos mediante estos archivos con la ayuda de las funciones en lenguaje C cuyo código está en el núcleo, llamadas API (Application Programming Interface). El proceso debe abrir primero el archivo especial del periférico (primitive open), luego leer (read) o escribir (write) datos desde el periférico o hacia él, como lo haría un archivo normal. Luego el driver del periférico interpreta estas operaciones de lectura/escritura.

images/cet05-07.png

Linux accede a los periféricos mediante archivos especiales

En el archivo especial /dev/periférico, el sistema de gestión de archivos encuentra la información necesaria para dirigirse al controlador correspondiente a través del periférico abierto por un proceso.

2. Archivos especiales

Por convención, se colocan los archivos especiales periféricos en el directorio /dev; éstos disponen de un inodo único, como cualquier otro archivo. Por lo tanto, puede conocer sus atributos mediante el comando ls -l.

El primer carácter identifica el tipo de periférico:

  • c: tipo de periférico en modo carácter;

  • b: tipo de periférico en modo bloque.

Estos modos diferencian el tipo de intercambio de datos entre el módulo...