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…