Canviar nivells d'execució a Linux

Els sistemes operatius basats en Unix utilitzen processos separats per controlar funcions del sistema. Aquests processos (dimonis/serveis) també són responsables de característiques exteses del sistema (servidors FTP, bases de dades,…), i molts aspectes del sistema operatiu són afectats per aquests. Aquests dimonis han de poder iniciar, parar i modificar-se sense reiniciar el sistema, i hi ha diverses maneres d’aconseguir-ho.

Els serveis poden ser controlats per shell-scripts o per un programa (i els seus arxius de configuració). El mètode dels shell-scripts és implementat per SysVinit (System V o SysV), mentre que el segon és utilitzat per systemd i Upstart. Aquests són administradors de serveis, i el que tingui el teu sistema operatiu serà el primer programa llançat pel nucli (amb PID 1).

Actualment l’administrador de serveis més utilitzat és systemd, així que si tens Linux segurament és el que utilitzis, a no ser que tinguis una distribució com Devuan, Void Linux,… La majoria tenen systemd per defecte. Per comprovar-ho, pots fer ps -p 1 i veuràs quin és el procès amb PID 1.

Un administrador de serveis basat en aquest estàndard consta de conjunts predefinits d’estats del sistema (runlevels) que van del 0 al 6:

  • Runlevel 0

    Apagat del sistema

  • Runlevel 1, s o usuari únic

    Mode d’usuari únic, sense xarxa ni altres capacitats no essencials (mode de manteniment).

  • Runlevel 2, 3 o 4

    Mode multiusuari. Els usuaris poden iniciar sessió per consola o xarxa. Els nivells 2 i 4 no se solen utilitzar.

  • Runlevel 5

    Mode multiusuari. És equivalent a 3, més l’inici de sessió en mode gràfic.

  • Runlevel 6

    Reinici del sistema.

El programa responsable d’administrar els nivells d’execució i els dimonis i recursos associats és /sbin/init. Durant la inicialització del sistema, init identifica el nivell d’execució - definit per un paràmetre del nucli del sistema a l’arxiu /etc/inittab - i carrega els scripts corresponents per a aquest nivell d’execució.

La sintaxi de /etc/inittab és:

shell

id:runlevels:action:process

On id és un nom genèric (màxim de 4 caràcters) per identificar l’entrada. runlevels és una llista de números de nivells pels que s’ha d’executar una acció. action és com init executarà el process. Les actions disponibles són:

  • boot El procès s’executarà durant la inicialització del sistema. El camp runlevels és ignorat.
  • bootwait El procès s’executarà durant la inicialització del sistema i init esperarà fins que aquest acabi per continuar. El camp runlevels s’ignora.
  • sysinit El procès s’executarà desprès de la inicialització del sistema, independentment del nivell d’execució. El camp runlevels s’ignora.
  • wait El procès s’executarà pels nivells d’execució donats i init esperarà fins que aquest acabi per continuar.
  • respawn El procès es reiniciarà si finalitza.
  • ctrlaltdel El procès s’executarà quan init rebi la senyal SIGING (Ctrl + Alt + Supr).

El nivell d’execució per defecte es defineix a /etc/inittab amb la sintaxi:

shell

id:x:initdefault

On x és el número de nivell d’execució predeterminat.

La x no ha de ser 0 o 6, ja que sinó el sistema s’apagaria o reiniciaria quan acabés el procès d’arrencada.

Un exemple d’arxiu inittab seria:

text

#Nivell d'execució predeterminat
id:3:initdefault:

#Script de configuració executat durant l'arrencada
si::sysinit:/etc/init.d/rcS

#Acció presa en nivell d'execució S (usuari únic)
~:S:wait:/sbin/sulogin

#Configuració per cada nivell d'execució
10:0:wait:/etc/init.d/rc 0
11:1:wait:/etc/init.d/rc 1
12:2:wait:/etc/init.d/rc 2
13:3:wait:/etc/init.d/rc 3
14:4:wait:/etc/init.d/rc 4
15:5:wait:/etc/init.d/rc 5
16:6:wait:/etc/init.d/rc 6

#Acció presa sobre teclat Ctrl+Alt+Del
ca::ctrlaltdel:/sbin/shutdown -r now

#Habilitar consoles pels nivells d'execució 2 i 3
1:23:respawn:/sbin/getty tty1 VC linux
2:23:respawn:/sbin/getty tty2 VC linux
3:23:respawn:/sbin/getty tty3 VC linux
4:23:respawn:/sbin/getty tty4 VC linux

#Pel nivell d'execució 3, també habiliti serial
#terminals ttyS0 i ttyS1 (módem) consoles
S0:3:respawn:/sbin/getty -L 9600 ttyS0 vt320
S1:3:respawn:/sbin/mgetty -x0 -D ttyS1

Cada cop que es modifica el fitxer /etc/inittab, s’ha d’executar la comanda telinit q. Això és important per evitar que quan s’apliqui la configuració a l’arxiu, el sistema no s’aturi.

Els scripts utilitzats per init per configurar cada nivell d’execució es guarden a /etc/init.d. Cada nivell d’execució té un directori a /etc (/etc/rc0.d, /etc/rc1.d,…) amb els seus scripts corresponents a dins.

En realitat no contenen els scripts com a tal, sinó enllaços simbòlics als scripts reals a /etc/init.d.

La primera lletra del nom d’arxiu de l’script indica si el servei ha d’iniciar-se o aturar-se. Si comença amb k (kill), el servei s’eliminarà, i si comença amb s (start), s’iniciarà.

La comanda runlevel mostra el nivell d’execució actual pel sistema i dos valors, el nivell d’execució anterior i l’actual. Si es vol canviar el nivell d’execució actual, es pot fer amb la comanda telinit seguida del nivell que es vol.

És el conjunt d’eines més utilitzat actualment per administrar recursos i serveis del sistema (units). Una unit consta de nom, tipus i arxiu de configuració corresponent.

Hi ha 7 tipus d’units systemd:

  • service

    Recursos que es poden iniciar, interrompre i recarregar.

  • socket

    Pot ser un sistema d’arxius o de xarxa. Cada socket té una unit de servei corresponent que es carrega quan el socket rep una sol·licitud.

  • device

    És una unit associada a un dispositiu de hardware. Només es prendrà com a unitat systemd si hi ha una regla udev per això.

  • mount

    Similar a una entrada a /etc/fstab.

  • automount

    Unitat de muntatge automàtic, com mount però es monta automàticament.

  • target

    Agrupació d’altres unitats que s’administra com si fos una sola.

  • snapshot

    Estat guardat de l’administrador del sistema.

La comanda principal per administrar les unitats systemd és systemctl. La seva sintaxi (amb els paràmetres més importants) és:

  • systemctl {start,stop,enable,disable,status} unit.service

    start: inicia la unitat.

    stop: atura la unitat

    enable: la unitat es carregarà al iniciar el sistema.

    disable: deshabilita l’arrencada automàtica de la unitat.

    status: mostra l’estat de la unitat (si està en execució, si està enabled i codis d’error).

La comanda systemctl també pot controlar system targets, que són grups d’unitats definides per un “nivell d’execució”, semblant als runlevels de SysV. De la mateixa manera, es pot definit l’objectiu predeterminat del sistema amb systemctl get-default.

Per llistar les unitats disponibles, podem fer systemctl list-unit-files.

systemd també gestiona events relacionats amb l’energia del sistema. Per exemple, les comandes systemctl suspend i systemctl hibernate suspenen i hibernen el sistema respectivament. Això si, només es pot utilitzar per aquesta tasca quan no hi ha cap altre administrador d’energia en execució, com pot ser acpid.

Els seus scripts d’inicialització es troben a /etc/init. Per enumerar els serveis podem fer initctl list.

Cada acció d’Upstart té la seva comanda independent. Per exemple, start pot utilitzar-se per iniciar la sisena terminal virtual:

shell

$ sudo start tty6

Semblant a systemd, l’estat es verfica amb status i per aturar un servei es fa amb stop.

Upstart no utilitza /etc/inittab per definir els nivells d’execució, però les comandes runlevel i telinit es poden utilitzar per verificar i alternar aquests nivells.

Una comanda utilitzada per apagar el sistema és shutdown. Aquesta notifica als usuaris connectats i envia un senyal SIGTERM, seguit d’un SIGKILL a tots els processos en execució. Desprès d’això, el sistema s’apaga o canvia le nivell d’execució. Se li poden afegir paràmetres per configurar la hora, fer-ho al moment o afegir un missatge.

Amb la comanda systemctl també podem apagar o reiniciar el sistema (systemctl poweroff*/*systemctl reboot, ambdues executades amb root).

Fins aquí el meu resum dels nivells d’execució a Linux. Probablement faré un article comparant més a fons els diferents administradors de serveis (i si systemd és tan malvat com es diu en alguns llocs). Si t’ha estat útil pots compartir o deixar un comentari. Ens veiem al següent post!