LPIC-2 Tema 202.1: Personalizar SysV init

Nueva entrada sobre las certificaciones LPIC-2, con la información sobre el tema 202.1. Una sección dedicada a la comprensión personalización de los sistemas de gestión de servicios SysV init y, especialmente a systemd, que es el sistema que lo ha sustituido en la mayoría de distribuciones y se ha transformado en el «estándar».

Los futuros aspirantes a administradores de sistemas deberán tener los conocimientos suficientes para comprender SysV/systemd, consultar y modificar el comportamiento de los run levels y de los targets, conocer LSB (Linux Standard Base Specification), así como una serie de comandos y ficheros de configuración.

¿Qué es LSB?

LSB (Linux Standard Base) son unas especificaciones basadas en POSIX y registrado bajo ISO que nace con el objetivo de normalizar la estructura interna de los sistemas operativos basados en Linux. Eso incluye bibliotecas estándar, el conjunto de órdenes y utilidades para extender POSIX, la estructura jerárquica del sistema de ficheros (FS), niveles de ejecución, o extensiones del sistema gráfico. Por supuesto, dentro de LSB también se intenta regular los scripts de inicio.

Más información – Documentación de la Linux Foundation sobre LSB

¿Qué es SysV?

SysV init es un sistema de gestión de servicios introducido en UNIX. El primer proceso que se carga tras el kernel es init (PID=1). De éste colgarán el resto. Además, siempre está ejecutándose en segundo plano, como un demonio.

No fue adoptado por todas las distros, algunas como Gentoo o Slackware siguieron el estilo BSD (véase OpenRC). También hubo algunas que usaron demonios de inicio diferentes, aunque se basaban en éste, como el caso de Upstart de Canonical.

Gracias a SysV se pueden iniciar ciertos scripts durante el arranque o el apagado del sistema operativo, se puede elegir el runlevel, etc. Por ejemplo, algunas de las tareas que realiza son:

  • Inicio del demonio devfs.
  • Montar el sistema de ficheros /proc.
  • Mostrar mensaje de bienvenida en la consola.
  • Desmontar initrd una vez no es necesario.
  • Configurar el reloj del sistema.
  • Configurar el hostname de la sesión.
  • Ejecutar fsck para verificar las particiones si el sistema no se apagó correctamente.
  • Remontar / en modo lectura y escritura, así como el resto de particiones.
  • Iniciar LVM si se usa y /etc/mtab.
  • Cargar, si existe, /etc/rc.modules.
  • Iniciar el gestor gráfico.
  • Verificar quotas de disco.
  • Elimina ficheros lock.
  • Inicia firewall.
  • etc.

Para determinar si tu sistema está usando SysV init u otro, puedes usar:

#Para saber si tu sistema usa SysV o systemd, puedes usar lo siguiente
pidof /sbin/init && echo "sysvinit" || echo "otro"
pidof systemd && echo "systemd" || echo "otro"

¿Qué es systemd?

systemd llega como el reemplazo moderno de SysV. En este caso es conjunto de demonios, bibliotecas y herramientas que ha sido alabado y criticado a partes iguales. Algunos lo critican principalmente por ser complejo, otros porque usa logs binarios frente al texto plano de SysV… Estas críticas han hecho que algunas distribuciones decidan no usarlo, como el caso de Devuan (Debian que sigue usando SysV, y cuyo nombre proviene de VUA o Veteran Unix Admins).

No obstante, pese a algunas reticencias, es el que ha terminado imponiéndose en la mayoría de las distribuciones más importantes, y al que se le está dando especial atención en las certificaciones LPIC.

systemd cumple los mismos objetivos que SysV, por lo que también podrá ejecutar scripts durante el inicio o apagado del sistema operativo, gestión de los runlevels (llamados targets), etc. Además, el demonio también es el primero en iniciarse tras el kernel, por lo que también mantiene el PID=1 y de él colgarán el resto de procesos.

#Puedes ver el árbol de procesos con este comando
pstree

Directorios y ficheros que debes conocer

Tanto si se está empleando SysV init (o basados en él), como si estás empleando systemd en tu distro, deberías conocer una serie de directorios y ficheros que son importantes para su gestión:

SysV init y derivados

Para los sistemas que tienen SysV (¡ojo! algunos también están presentes en sistemas con systemd, por lo que es importante también para ellos), los directorios y ficheros importantes son:

  • /etc/inittab: encontrarás el runlevel configurado por defecto, el primer script a ejecutar, algunas acciones de atajos de teclados que tienen que ver con el reinicio, etc. En cuanto al runlevel, deberías saber que existen niveles de ejecución (runlevels) que definen el modo en que el sistema operativo implementa el arranque. Un nivel de ejecución simplemente es una configuración de programas y servicios que ejecutará SysV. En las distros que siguen LSB, los niveles se corresponden a:
    • 0 o halt: se apaga el sistema.
    • 1 o s o single-user: el modo monousuario se emplea para solucionar problemas o realizar mantenimiento a bajo nivel del sistema. Los servicios activos en este nivel variarán de una distro a otra. Se iniciará con un único usuario, root, sin montar sistemas de ficheros, con escasa configuración y ciertos límites.
    • 2 o multi-user: el modo ultiusuario sin capacidades de red.
    • 3 o multi-user + networking: multiusuari con conexión de red.
    • 4 o usuario no definido: se usa par propósitos especiales, y deja sin definir para elegir la configuración de forma personalizada.
    • 5 o normal+GUI: similar al 3 pero con sesión gráfica. Es decir, es el habitual en el que arrancan de forma predeterminada la mayoría de distros.
    • 6 o reboot: reinicio del sistema. Otro modo transitorio como el 0.
    • S: es un modo que no está presente en todas las distros. Es similar a 1, pasando a un shell mínimo como root.
#Línea típica de configuración del runlevel por defecto dentro de /etc/inittab
id:3:initdefault:
  • /etc/init.d/: en este directorio se alojan los varios scripts start/stop de varios servicios importantes del sistema operativo. Por ejemplo, Samba, Apache, Red, FTP, SSH, etc. Puedes usar esta ruta seguida del nombre del servicio y de una opción (start/stop/reload/restart/force-reload) para cambiar el estado de un servicio específico. Por ejemplo:
#Iniciar el servicio de red
/etc/init.d/networking start

#Detener el servicio de red
/etc/init.d/networking stop

#Recargar el servicio web
/etc/init.d/apache2 reload

#Reiniciar el servicio SSH
/etc/init.d/ssh restart
  • /etc/rc.d/: ha sido el directorio que se ha usado en el init tradicional de 4.4 BSD. Algunas distros (Slackware, RedHat y derivados, etc., de hecho, en CentOS /etc/init.d es un enlace simbólico a /etc/rc.d/) lo han venido usando o lo usan aún como alternativa al anterior de SysV. Dentro también encontrarás scripts…

Debes saber también que init ejecutará todos los scripts cuyo nombre empiece por K (Kill) que se encuentren en el directorio /etc/rcX.d/, donde X es el número correspondiente al runlevel actual. Por ejemplo, si es el 5, ejecutará los scripts que empiezan por K de /etc/rc5.d/. Acto seguido, se ejecutarían los scripts cuyo nombre comience por S (Start)

Por otro lado, tras la S o la K de los scripts, también hay un número. Ese número indicará el orden o prioridad en el que se ejecuta el script. Mientras más pequeño sea el número, primero se lanzará al arrancar (o los últimos en hacerlo cuando el sistema se apague). La prioridad por defecto es 20.

systemd

En los sistemas con systemd, además de los anteriores, también deberías conocer  otros dirctorios y ficheros, así como las diferencias y equivalencias:

  • Target = runlevel: systemd llama targets a los runlevels, y existen equivalencias entre ambos sistemas. Y las podrás ver referenciadas en los ficheros de configuración de unidades en el campo WantedBy=.
    • 0 = poweroff.target
    • 1 = rescue.target
    • 3 = multi-user.target
    • 5 = graphical.target
    • 6 = reboot.target
    • emergency.target (modo específico de systemd de emergencia)
  • Units o unidades: es como systemd llama a los diferentes recursos que maneja. Mientras en SysV solo había servicios, en systemd las unidades se pueden catalogar como:
    • .service: son los servicios, equivalentes a los de SysV. Podrás iniciarlos, pararlos, reiniciarlos, recargarlos, etc. Además, podrás tú crear tus propios servicios para apuntar hacia comandos o scripts que deseas ejecutar durante el arranque o apagado.
    • .socket: socket de redes.
    • .device: descripción de dispositivos necesarios, como udev, sysfs, etc. Es decir, los necesarios para montar particiones, acceder a dispositivos, etc.
    • .mount: unidad para definir los puntos de montaje del sistema.
    • .automount: las unidades montadas automáticamente.
    • .swap: unidad que describe el espacio SWAP.
    • .target: las correspondientes a los niveles de ejecución, para poder sincronizar una serie de sistemas para determinar el estado.
    • .path: define la ruta que se puede usar para la activación basada en rutas.
    • .timer: es similar a las tareas de cron, un temporizador o planificador de tareas.
    • .snapshot: una unidad creada automáticamente por systemctl con la que poder reconstruir el estado del sistema tras realizar cambios. Pero es temporal, no sobrevive entre sesiones.
    • .slice: asociada con nodos Linux Control Group, para asignar o restringir recursos a un proceso dentro del slice.
    • .scope: también creada automáticamente por systemd a partir de información recibida de las interfaces de bus. Se emplea para la gestión de conjuntos de procesos que se crean externamente.

En cuanto a los ficheros y directorios:

  • /usr/lib/systemd/: donde se ubican las unidades de paquetes instalados. Esto difiere con el sistema clásico, ya que systemd se refiere como unidades. Dentro del directorio encontrarás subdirectorios para catalogar todas estas unidades. Además, también es importante conocer que una target unit es el equivalente a un runlevel de SysV. Por supuesto, puedes agregar tus propios servicios para ejecutar acciones o scripts creando ficheros con extensión .service. Por ejemplo, imagina el servicio correspondiente a NTP. Su fichero llamado ntpd.service será algo como:
[Unit]
Description=Network Time Service
After=syslog.target ntpdate.service
[Service]
EnvironmentFile=/etc/sysconfig/ntpd
ExecStart=/usr/bin/ntpd –n –u ntp:ntp $OPTIONS
[Install]
WantedBy=multi-user.target
#Si quieres consultar los servicios necesarios de los que depende un target u objetivo
grep –e ‘WantedBy.*graphical.target’ *
  • /etc/systemd/: es el fichero de configuración local de systemd. Por tanto, para modificar parámetros de este sistema te tienes que dirigir aquí. Dentro encontrarás algunos subdirectorios importantes y ficheros de configuración sueltos correspondientes a la configuración de las herramientas.
  • /run/systemd/: es donde están las runtime units, es decir, unidades durante el tiempo de ejecución.

Comandos esenciales

Por último, los comandos o herramientas que debes saber emplear son los siguientes:

En artículos anteriores ya comenté otras, como por ejemplo journalctl de systemd. Puedes echar un vistazo a artículos previos de la serie LPIC.

  • chkconfig: puede usarse para activar o desactivar servicios, aunque en las distros modernos ya no se suele usar. Por ejemplo:
#Desactivar un servicio NSC para los niveles 3, 4 y 5
chkconfig --level 345 nscd off
  • update-rc.d: en algunas distros que emplean el rc init al estilo BSD, se puede emplear para gestionar los runlevels de servicios. Por ejemplo:
#Habilitar el servicio Postfix de correo en todos los niveles
update-rc.d postfix defaults

#Deshabilitarlos 
update-rc.d postfix remove

#Cargarlo con una prioridad distinta a 20, por ejemplo 50
update-rc.d postfix defaults 50

#E incluso agregar una para el arranque y otra para el apagado diferentes
update-rc.d postfix defaults 50 80

#O apagarlo para algunos servicios y para otros no, con distintas prioridades
update-rc.d postfix start 50 2 3 4 . start 30 5 . stop 80 0 1 6 .
  • init: es un comando muy simple, y está incluso en systemd. Puede iniciar el sistema en un estado especificado. Por ejemplo:
#Reinicia en nivel 2 (multiusuario sin conexión a la red)
init 2
  • telinit: es una pequeña herramienta que también sirve para cambiar runlevels en SysV, ya que le enviará a init las señales apropiadas. Por ejemplo:
telinit 0 Apaga el sistema

#Pasa a modo single-user
telinit 1

#Entra en modo multi-usuario, con funciones de red y sesión gráfica (modo normal)
telinit 5

#Para reiniciar el sistema
telinit 6
  • systemctl: ya conocerás esta herramienta de systemd para su gestión, puesto que lo he introducido en artículos previos. Aquí también me interesa mostrarte algunos ejemplos de uso:
#Ver el target por defecto actual
systemctl get-default

#Configurar el modo multi-usuario por defecto
systemctl set-default multi-user.target

#Cambiar al modo multi-usuario (3)
systemctl isolate multi-user.target

#Cambiar al modo gráfico (5)
systemctl isolate graphical.target
  • systemd-delta: se puede utilizar para identificar y comparar ficheros de configuración que se anulan unos a otros. Es decir, es una utilidad interesante para detectar conflictos con la configuración de systemd. Esta herramienta, da la prioridad más alta a los de /etc, y /run tiene la segunda prioridad más alta.
#Mostrar la configuración local
systemd-delta

#Mostrar la configuración de tiempo de ejecución
systemd-delta /run

#Mostrar todos los cambios en unidades del sistema
systemd-delta systemd/system

Isaac

Apasionado de la computación y la tecnología en general. Siempre intentando desaprender para apreHender.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto:

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar