¿Cuáles son los procesos que se ejecutan desde que prendemos la computadora hasta el login?

¿Cuáles son los procesos que se ejecutan desde que prendemos la computadora hasta el login?

Los procesos que se ejecutan cuando arranca el sistema los podemos enumerar de acuerdo al lugar que ocupan en el arranque:

  1. BIOS: Basic Input/Output System. Instalado en la Mother Board, un programa básico que enciende los dispositivos.
  2. MBR: Master Boot Record, el primer sector del disco rígido segun IBM y el formato universal.
  3. GRub: GRand Unified Boot, el programa que se instala en el MBR y nos permite arrancar en diferentes sistema operativos o con distintos kernels en linux.
  4. Kernel: El núcleo del sistema se carga en memoria y lanza luego el proceso de arranque /sbin/init cuyo PID es 1
  5. Systemd: El super servicio que lanza procesos de arranque en el sistema operativo.

Historia de INIT

El sistema operativo liunx mantuvo desde sus comienzos 7 niveles de corrida los cuales enumeramos a continuación:

0: Apagado
1: Arranque en monousuario (root) una sola terminal de texto.
2: Nivel de corrida de multiusuario sin servicios de red.
3: Nivel de corrida multiusuario sin entorno gráfico.
4: Nivel de corrida vacio
5: Nivel de corrida multiusuario con  entorno gráfico levantado.
6: Reinicio

Este systema era  simple Los distintos niveles de corrida estaban definidos en en el archivo /etc/inittab
Los  scripts de arranque de servicios estan guardados en el directorio/etc/init.d/, para cada nivel de corrida se ejecutaban links que estaban guardados en los directorios /etc/rc?.d dond «?» es el número correspondiente al nivel de corrida, ejecutandose en forma secuencial, la caracteristica principal es que hasta que un proceso no termina, no se lanza el siguiente

Estos niveles de corrida se mantienen en la actualidad por compatibilidad. Los sistemas operativos linux mas modernos usan systemd para arrancar.

El proceso INIT

El proceso init es el proceso padre del sistema cuyo PID es 1, este proceso es el que mantiene encendida la computadora, se ejecuta desde el arranque hasta el apagado, si este proceso falla se produce lo que se llama Kernel Panic. Podemos decir que el proceso init es el proceso padre de todos los procesos de primer nivel. Si algun proceso se queda sin su propio proceso padre, el proceso padre pasa a ser INIT.

¿Que es lo que hace realmente systemd?

Antes de contestar esa pregunta tenemos que decir que systemd es un sistema mucho mas integral que INIT, ya que no solo se encarga del arranque sino que tambien monitorea los procesos una vez lanzados, y los relanza si fallan, ademas tambien administra los logs del sistema, una ventaja fundamental frente a INIT es que systemd arranca procesos en forma paralela, de manera tal que el arranque del sistema es más rápido; tambien tiene una logica de gestion de dependencias automática.

¿Cules son los pasos que realiza systemd?

Lo primero que hace es montar el sistema de archivos basandose en el archivo fstab (ir al el post de fstab) despues, utiliza un modelo de targets para saber que debe hacer el primero es /etc/systemd/system/default.target,  un target define una serie de dependencias que systemd tiene que levantar cada uno de los servicios, estas dependencias a su vez pueden tener mas dependencias.

Veamos un ejemplo en la siguiente imagen:

Dependencias Systemd

¿Hay alguna tarea mas ademas configurar el orden de arranque?

Las tareas que realiza systemd ademas de las mencionadas son:

  • Journald: administra este servicio el cual es responsable de la gestion de logs, en formato binario.
  • Logind: administra el servicio de inicio de sesiones de usuarios.
  • Networkd: administra el servicio que gestiona las interfaces de red
  • tmpfiles: adminitra la creacion de archivos temporales
  • timedated: administra el servicio de fecha y hora del sistema
  • udevd: administra los dispositivos para el sistema operativo (directorio /dev)

Veamos un grafico con todo lo que administra systemd.

Sytemd

¿Cuales son los comandos que podemos utilizar para monitorear y levantar servicios?

El comando que usa systemd para el trabajo es systemctl veamos algunos ejemplos con el servicio ssh.

Estado del servicio ssh


~# systemctl status sshd.service
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: ena
Active: active (running) since Thu 2020-05-07 09:03:15 -03; 6h ago
Process: 1626 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 1633 (sshd)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/ssh.service
└─1633 /usr/sbin/sshd -D

may 07 09:03:14 alien systemd[1]: Starting OpenBSD Secure Shell server...
may 07 09:03:15 alien sshd[1633]: Server listening on 0.0.0.0 port 22.
may 07 09:03:15 alien sshd[1633]: Server listening on :: port 22.
may 07 09:03:15 alien systemd[1]: Started

Arranque y parada de servicios


~# systemctl start/stop/restart sshd.service

Listar las dependencias del servicio sshd


root@alien:~# systemctl list-dependencies sshd.service
sshd.service
● ├─-.mount
● ├─system.slice
● └─sysinit.target
● ├─apparmor.service
● ├─blk-availability.service
● ├─dev-hugepages.mount
● ├─dev-mqueue.mount
● ├─finalrd.service
● ├─keyboard-setup.service
● ├─kmod-static-nodes.service
● ├─lvm2-lvmetad.socket
● ├─lvm2-lvmpolld.socket
● ├─lvm2-monitor.service
● ├─plymouth-read-write.service
● ├─plymouth-start.service
● ├─proc-sys-fs-binfmt_misc.automount
● ├─resolvconf.service
● ├─setvtrgb.service
● ├─sys-fs-fuse-connections.mount
● ├─sys-kernel-config.mount
● ├─sys-kernel-debug.mount
● ├─systemd-ask-password-console.path
● ├─systemd-binfmt.service
● ├─systemd-hwdb-update.service
● ├─systemd-journal-flush.service
● ├─systemd-journald.service
● ├─systemd-machine-id-commit.service
● ├─systemd-modules-load.service
● ├─systemd-random-seed.service
● ├─systemd-sysctl.service
● ├─systemd-timesyncd.service
● ├─systemd-tmpfiles-setup-dev.service
● ├─systemd-tmpfiles-setup.service
● ├─systemd-udev-trigger.service
● ├─systemd-udevd.service
● ├─systemd-update-utmp.service
● ├─cryptsetup.target
● ├─local-fs.target
● │ ├─-.mount
● │ ├─home-fabian-.cache-chromium-Default-Cache.mount
● │ ├─systemd-fsck-root.service
● │ └─systemd-remount-fs.service
● └─swap.target
● └─dev-mapper-mint\x2d\x2dvg\x2dswap_1.swap

 

 

Listar las units y mostrar el estado.

~# systemctl list-unit-files
UNIT FILE STATE
proc-sys-fs-binfmt_misc.automount static
-.mount generated
dev-hugepages.mount static
dev-mqueue.mount static
home-fabian-.cache-chromium-Default-Cache.mount generated
proc-fs-nfsd.mount static
proc-sys-fs-binfmt_misc.mount static
run-rpc_pipefs.mount static
snap-core-8935.mount enabled
snap-core-9066.mount enabled
snap-gydl-2.mount enabled
snap-imaginary\x2dteleprompter-3.mount enabled
snap-imaginary\x2dteleprompter-5.mount enabled
sys-fs-fuse-connections.mount static
sys-kernel-config.mount static
sys-kernel-debug.mount static
acpid.path enabled
apport-autoreport.path enabled
cups.path enabled
ntp-systemd-netif.path enabled
resolvconf-pull-resolved.path enabled
systemd-ask-password-console.path static
systemd-ask-password-plymouth.path static

Por ultimo vamos a poder habilitar o deshabilitar un servicio.


systemctl enable/disable servicio

¿Cómo seguimos?

Por último para saber como corremos un script cuando arranca el sistema te invito a leer el post «Como crear un script y lanzarlo en el arraque con systemd«