LPIC-1 101.3: runlevels & boot targets

Siguiente tutorial sobre las certificaciones de LPI. Esta vez es el momento de analizar los runlevels o niveles de ejecución y los objetivos de arranque para SysV y systemd respectivamente. Esto se corresponde a las competencias que se requieren para pasar los exámenes LPIC-1, concretamente al Tema 101.3. Este tema lo dividiré en dos artículos, con una segunda parte donde se analizarán algunos comandos como shutdown, wall, etc.

Para más información sobre SysV y systemd, puedes echar un ojo al anterior artículo de la serie LPIC… Es importante que tengas presente el funcionamiento básico de estos sistemas de gestión de servicios, sus ficheros de configuración principales, etc.

SysV (y derivados) y los runlevels

El sistema SysV init y los derivados o compatibles, como es el caso de Upstarts, también funcionan con niveles de ejecución. En Unix/Linux con este sistema de gestión de servicio existen niveles de ejecución que definen el modo en que el sistema operativo implementa el arranque. Es decir, un runlevel es simplemente una configuración de programas y servicios que se van a ejecutar tras el arranque. Cada nivel tendrá asignado un conjunto de servicios determinado o formas de proceder en el inicio.

Si provienes de Microsoft Windows, quizás te recuerde en ciertos aspectos a los modos de línea de comandos, modo seguro o a prueba de fallos, modo seguro con red (o como se llamen…).

Los runlevesl están numerados del 0 al 6 (o letras que se usan como sinónimos). En algunos sistemas operativos existen otras letras peculiares y un rango incluso que va más allá de 0-6, pero no es tan frecuente. Pero si trabajas en entornos UNIX y te topas con eso, no te frotes los ojos, no es nada raro (incluso algún caso de Unix que no usan niveles). Sí es verdad que hay tres de ellos que son estándares: 0, S y 6. Esos se usan para fines especiales.

El resto pueden variar en función del sistema operativo y de la distribución. Las que están bajo LSB, tienen los siguientes niveles:

ID Nombre Descripción
0 Halt Cierra el sistema o, con equipos modernos se apaga del todo. Es un modo de ejecución transitorio, para que el sistema pase de un estado a otro.

No te recomiendo hacer entrar el sistema en los niveles 0 o 6 para parar la máquina, es más seguro y correcto usar las herramientas shutdown, halt, reboot y poweroff.

1 Single-user Modo monousuario. Se emplea para arreglar problemas o realizar mantenimiento a bajo nivel del sistema. Los servicios activos variarán de una distro a otra.

Se inicia el sistema con un único usuario, root, donde existe muy poca configuración, no se montan los sistemas de archivos (FS), y se imponen otros límites. También se denomina s o S.

2 Multi-user Modo multiusuario sin capacidades de red. En Debian y derivados suele ser el modo gráfico, aunque en otras distribuciones no se define este modo.
3 Multi-user + networking Multiusuario con conexiones de red. En Red Hat, Fedora y CentOS, y otras por el estilo, era un acceso en modo texto.
4 Usuario no definido Para propósitos especiales. Se deja sin definir para que se pueda configurar de forma personalizada.
5 Normal + GUI Igual a la 3, pero con interfaz gráfica. Es decir, el modo por defecto en el que arrancan la mayor parte de las distribuciones.
6 Reboot Reinicio del sistema, otro modo transitorio como el 0. Configurarlo en estos modos significaría que el sistema se apaga o reinicia cada vez que se intenta arrancar y no tiene demasiado sentido…

Si usas Slackware existen variaciones: 0 (Halt), 1 (Single-user mode), 2 (no utilizado), 3 (multiusuario sin GUI), 4 (multiusuario con GUI), 5 (igual al 2), 6 (Reboot).

En cuanto a Gentoo tienes: 0 (Halt), 1 o S (Single-user mode), 2 (Multiusuario sin red), 3 (Multiusuario), 4 (Alias de 3), 5 (Alias de 3) y 6 (Reboot).

Para ver el nivel de ejecución de tu distro, si usa SysV, puedes consultar /etc/inittab o /etc/event.d/ en algunas distros (Upstart configurado sin la línea initdefault).  Por lo general, el modo por defecto siempre tendrá el nombre default. Para configurar el modo, también puedes acudir a esos mismos ficheros y editarlos. En el caso de /etc/event.d/ tendrás diferentes scrips en su interior, cada uno de ellos se corresponde a un nivel como rc0, rc1, rc2,…

Por ejemplo, en /etc/inittab encontrarás la siguiente línea al principio con el nivel configurado por defecto:

#Default Runlevel
id:5:initdefault

Otra opción para modificar el modo es usar los comandos init y telinit seguido del número del nivel de ejecución que queremos poner. Por ejemplo:

init 3
telinit 5

telinit es un alias de init

Para conocer el nivel por defecto es usando alguno de los siguientes comandos:

runlevel
grep :initdefault: /etc/inittab

runlevel funciona incluso con systemd

Por cierto, runlevel te muestra a su salida una N seguida del número de runlevel actual. Esa N indica que no se conoce un nivel de ejecución previo. Si hay alguno conocido que se ha usado previamente lo mostrará…

systemd y los boot targets

En el caso de systemd no se llaman runlevels, son los famosos objetivos de arranque. Se almacenan en ficheros que terminan con el sufijo .target precedidos por el nombre del modo de ejecución al que pertenecen. Por ejemplo multi-user.target, graphical.target, etc.

La tabla de equivalencias entre los runlevels y los boot targets es:

Runlevel ID Target Descripción
0 poweroff.target Apagar el sistema
1 rescue.target Modo monousuario
3 multi-user.target Modo multiusuario
4 graphical.target Modo normal con GUI
6 reboot.target Reinicia el sistema

Te animo a entrar y analizar los ficheros de cada target, puedes aprender mucho de ellos. Por ejemplo, si analizas el contenido de /lib/systemd/system/graphical.target es algo así:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes

Se puede ver el nombre, dónde encontrar documentación, el target del que depende (Requires), que debe ejecutarse después de otro necesario (After), los targets con los que tendría conflictos, etc. A veces pueden aparecer líneas diferentes, como por ejemplo Alias=default.target.

Si quieres conseguir el target actual, puedes usar runlevel como ya dije, pero te dará el runlevel equivalente. Para mostrar el target con la herramienta nativa de systemd puedes usar:

systemctl get-default

Para listar todos los targets:

systemctl list-units --type=target

Para cambiar a otro objetivo diferente, simplemente ejecuta el comando systemctl con el parámetro set-default y seguido del nombre del target que quieras configurar. Por ejemplo:

systemctl set-default multi-user.target

También puedes usar:

systemctl isolate single-user.target

*Lo que realmente hace ese comando es algo así como:

rm ‘/etc/systemd/system/default.target’
ln –s ‘/usr/lib/systemd/system/multi-user.target’ ‘/etc/systemd/system/default.target’

En el próximo seguimos con 101.3 sobre comandos interesantes

Isaac

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

Deja un comentario

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