I - Intro

Continuando con el hilo de la publicación anterior sobre el inicio de un sistema GNU/Linux, en esta oportunidad te cuento sobre los servicios.

¡Cuántas veces habré luchado con el servicio de “la cola de impresión” en Windows! Si trabajaste en IT comenzando en puestos de Help Desk, Service Desk o similares en entornos corporativos…lo habrás padecido también -_-

En cuanto a Linux…bueno, el concepto es similar pero por supuesto tiene sus diferencias.

¡Advertencia! Si seguís leyendo, vas a continuar aprendiendo ;)

¿Servicios, Systemd, Systemctl, Sysvinit? ¡Adelante!


II /sbin/init

Una vez montado el sistema de archivos (filesystem) real, el kernel ejecuta el binario ubicado en /sbin/init (típicamente hoy en día es un enlace a systemd), este proceso /sbin/init tendrá siempre el ID=1. Es el primer proceso de usuario del sistema e inicia otros subprocesos.

El proceso init determina y lanza los servicios y procesos necesarios para completar el arranque del sistema. Tradicionalmente se utilizaba System V Unix (SysVinit). Tenía diferentes runlevels (“niveles de corrida/ejecución”) donde cada uno contenía conjuntos de scripts para inciar y detener servicios. Su par moderno y contemporáneo systemd tiene retrocompatibilidad en este aspecto y soporta los runlevels a través de runlevel targets. Se emula el programa telinit para trabajar con runlevels, por lo que si estás leyendo esto desde alguna distro GNU/Linux con systemd, podrás probarlos para alimentar tu curiosidad:

    –> RHEL “Runlevels”.

    –> Linux Manual Page - man

La mayoría de los procesos non-kernel en el OS tienen su raíz en este proceso, excepto aquellos procesos iniciados directamente por el Kernel para manejar detalles internos del mismo Kernel.

init es responsable de mantener el sistema ejecutándose y apagarlo de forma limpia y también de gestionar los servicios de login cuando los usuarios se conectan y desconectan.

El init puede variar según la versión y distro de Linux, como mencioné antes, el más moderno y utilizado hoy en día es systemd.

Es posible ejecutar otro init especificándolo en la configuración del sistema o desde el bootloader.

¿Cómo saber qué init utilizo? Con el siguiente comando. Observar que /usr/sbin/init apunta a systemd.

ls -l $(which init)
proyectoleeti@fedora42:~$ ls -l $(which init)
lrwxrwxrwx. 1 root root 22 sep  6 21:00 /usr/sbin/init -> ../lib/systemd/systemd

III Servicios

Un servicio es un programa o proceso que se ejecuta en segundo plano (como un demonio).

El init systemd es más moderno que SysVinit y es el más utilizado actualmente. Es el responsable de cargar e iniciar procesos además de iniciar y detener servicios durante la ejecución del SO propiamente dicho. Algunos ejemplos:

Servidor web Apache httpd.

Administrar impresoras con CUPS cupsd.

Es usual administrar un servicio a través del comando systemctl, por ejemplo, para habilitar o deshabilitar servicios al inicio del SO:

  • systemctl enable httpd

  • systemctl disable httpd

Para iniciarlo o detenerlo:

  • systemctl start httpd

  • systemctl stop httpd


IV Systemd

Systemd utiliza archivos .service a diferencia de SysVinit que usa scripts en bash.

Características de systemd:

  • Ordena todos los demonios en su propio cgroups (control groups), contribuyendo a una mejor trazabilidad de los procesos.

  • Carga (bootea) más rápido que los sistemas init anteriores.

  • Tiene enfoque en la paralelización.

  • Para iniciar servicios utiliza socket y activaciones D-Bus.

  • Ofrece inicio de demonios bajo demanda (on-demand).

  • Mantiene puntos de montaje y automontaje.

  • Puede reemplazar a SysVinit sin perder compatibilidad con sus scripts.

  • Compatibilidad con comandos de SysVinit.

Revisar documentación oficial siempre se considera una buena práctica y es una herramienta que cada día es menos valorada (frente a “googlear” y preguntarle a la IA). Por ejemplo, la documentación oficial de Fedora pone a disposición una tabla equivalencias de comandos entre SystemD y SysVinit y mucho más:

Ejemplo de convivencia con los comandos de SysVinit aún en un sistema con Systemd, en Fedora 42:

 Observar que la misma acción es ejecutable con systemctl (systemd) y con service (sysVinit), primero para consultar el estado del servicio con sshd y luego para iniciarlo/detenerlo con start y stop:

systemctl status sshd
proyectoleeti@fedora42:~$ systemctl status sshd
○ sshd.service - OpenSSH server daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: inactive (dead)
       Docs: man:sshd(8)
             man:sshd_config(5)
sudo systemctl start sshd
systemctl status sshd
proyectoleeti@fedora42:~$ sudo systemctl start sshd

proyectoleeti@fedora42:~$ systemctl status sshd
● sshd.service - OpenSSH server daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Mon 2025-09-15 12:04:20 CEST; 4s ago
 Invocation: 5d416aa670044ec4a863c36ee1fb69d3
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 40530 (sshd)
      Tasks: 1 (limit: 15357)
     Memory: 1M (peak: 1.5M)
        CPU: 17ms
     CGroup: /system.slice/sshd.service
             └─40530 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
sudo service sshd stop
systemctl status sshd
service sshd status
proyectoleeti@fedora42:~$ sudo service sshd stop
Redirecting to /bin/systemctl stop sshd.service

proyectoleeti@fedora42:~$ systemctl status sshd
○ sshd.service - OpenSSH server daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: inactive (dead)
       Docs: man:sshd(8)
             man:sshd_config(5)

proyectoleeti@fedora42:~$ service sshd status
Redirecting to /bin/systemctl status sshd.service
○ sshd.service - OpenSSH server daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: inactive (dead)
       Docs: man:sshd(8)
             man:sshd_config(5)

V systemctl

System Control o systemctl es un comando para administrar units / unidades.

Un unit es un archivo de configuración que sirve a systemd para saber cómo gestionar un recurso del sistema. Describe cómo iniciar, detener, recargar o supervisar un componente del sistema.

Estos archivos usualmente están ubicados en /etc/systemd/system o /usr/lib/systemd/system.

Representan una tarea o componente del sistema, entre otros: Servicios,Timers,Sockets,Montajes, etc, los más comunes son servicios y sockets:

  • Un .service es un servicio tradicional que se ejecuta en segundo plano, como sshd, bluetooth, etc.

  • Un socket define un socket de red o UNIX. Por ejemplo un socket de red (ip + puerto).

Systemd puede escuchar ese socket y, sólo cuando hay una conexión, inicia el servicio asociado. Útil para ahorrar recursos del sistema. A esto se lo llama socket activation.

Algunos comandos requieren sudo (privilegios elevados de usuario), otros no, dependiendo del alcance.

La estructura del comando es la siguiente:

systemctl [options] command [name]

A continuación algunos comandos de ejemplos muy comunes en el día a día.

  • Ver el estado de todos los procesos que controla systemd:

    • systemctl
      
  • Mostrar todos los servicios disponibles:

    • systemctl list-units -t service -all
      
  • Listar sólo los servicios activos:

    • systemctl list-units -t service
      
  • Varias formas de iniciar un servicio:

    • systemctl start bluetooth
      
    • systemctl start bluetooth.service
      
    • systemctl start /usr/lib/systemd/system/bluetooth.service
      
  • Para detenerlo:

    • systemctl stop bluetooth
      
  • Para habilitar/deshabilitar un servicio al inicio del sistema (system boot):

    • systemctl enable sshd.service
      
    • systemctl disable sshd.service
      

Observar algunos de los comandos en acción, esta vez en un entorno Ubuntu 22.04:

Verificando y deteniendo servicios con systemctl. Métodos antiguos y modernos para iniciar SSH.

🐧 Habrás notado que este post contiene más contenido de comandos que el anterior. No es un accidente: en el próximo complementamos con un hands-on, es decir, un laboratorio para practicar todo en tu propio sistema.

Hasta el siguiente post! 🐧