Informació del sistema LinuxInformáticaLinux

SysV init vs. systemd: el director d’orquestra de Linux



Quan el nucli (kernel) acaba d’arrencar, executa un únic programa: el procés 1, o sistema d’inicialització. És el «director d’orquestra» que posa en marxa la resta de serveis (xarxa, registre, SSH, servidor web…), els vigila mentre el sistema funciona i els atura en apagar. Durant anys aquesta feina la va fer l’init de System V (SysV init); avui, a la gran majoria de distribucions, la fa systemd.

Pots comprovar quin tens amb:

$ ps -p 1 -o pid,comm
    PID COMMAND
      1 systemd

$ ls -l /sbin/init
lrwxrwxrwx 1 root root 22 Apr 13 21:38 /sbin/init -> ../lib/systemd/systemd

SysV init

  • Arrenca els serveis un darrere l’altre, en ordre, executant scripts de shell.
  • Els scripts són a /etc/init.d/ i s’enllacen des de /etc/rc0.d/ … /etc/rc6.d/, un directori per a cada nivell d’execució (runlevel): 0 apagar, 1 mode d’un sol usuari, 3 multiusuari amb xarxa, 5 amb entorn gràfic, 6 reiniciar (la numeració exacta variava segons la distribució).
  • L’ordre es controla amb el nom dels enllaços (S20apache2, K01apache2…) i les dependències s’han de gestionar a mà.
  • Els registres van a fitxers de text a /var/log/ (via syslog).

systemd

  • Arrenca els serveis en paral·lel sempre que les dependències ho permeten, cosa que fa l’arrencada més ràpida.
  • La configuració es fa amb unitats (units): fitxers declaratius com nginx.service, home.mount, backup.timer… Les dels paquets són a /usr/lib/systemd/system/ i les teves (o les que en modifiquen d’altres) a /etc/systemd/system/, que té prioritat.
  • Els runlevels se substitueixen per targets: multi-user.target (equivalent al nivell 3), graphical.target (nivell 5), rescue.target (nivell 1)…
  • Agrupa cada servei en un cgroup, de manera que sap exactament quins processos són seus i els pot aturar tots.
  • Té el seu propi registre, el journal, que es consulta amb journalctl.
  • Inclou moltes altres eines: temporitzadors (alternativa a cron), gestió del nom de màquina (hostnamectl), de l’hora (timedatectl), de la xarxa (systemd-networkd)…

Diferències clau

CaracterísticaSysV initsystemd
ArrencadaSeqüencialEn paral·lel
ConfiguracióScripts de shell a /etc/init.d/Unitats declaratives a /etc/systemd/system/ i /usr/lib/systemd/system/
DependènciesManuals (ordre dels enllaços)Automàtiques (Requires=, After=, Wants=…)
Estats del sistemaRunlevels (0-6)Targets
Control de processosPID que guarda cada scriptcgroups
RegistresFitxers de text amb syslogJournal (journalctl), i opcionalment syslog
Comandesservice, /etc/init.d/servei, telinitsystemctl
On el trobaràsSistemes antics i Devuan (Alpine, Gentoo o Void fan servir alternatives com OpenRC o runit)Debian, Ubuntu, Fedora, RHEL, Rocky, Alma, Arch, openSUSE…

Equivalències de comandes

Si véns de SysV init, aquestes són les equivalències més habituals:

SysV initsystemd
service apache2 start / /etc/init.d/apache2 startsystemctl start apache2
service apache2 statussystemctl status apache2
update-rc.d apache2 enable / chkconfig httpd onsystemctl enable apache2
runlevelsystemctl get-default
telinit 3systemctl isolate multi-user.target
telinit 6 / rebootsystemctl reboot

A les distribucions amb systemd, service i els scripts de /etc/init.d/ encara funcionen per compatibilitat, però per sota criden systemctl.

Exemple: crear un servei amb systemd

Suposem que vols que un programa teu s’executi sempre en engegar el servidor. Crea el fitxer /etc/systemd/system/el-meu-servei.service:

[Unit]
Description=El meu servei
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/el-meu-programa
Restart=on-failure
User=joan

[Install]
WantedBy=multi-user.target
  • Description: descripció que veuràs a systemctl status.
  • After i Wants: s’arrenca després que la xarxa estigui configurada.
  • ExecStart: ruta absoluta del programa.
  • Restart=on-failure: si el programa acaba amb error, systemd el torna a engegar (always el reinicia fins i tot si acaba bé).
  • User: usuari amb què s’executa; si no el poses, s’executa com a root.
  • WantedBy=multi-user.target: en activar-lo, s’arrencarà sempre que el sistema arribi al mode multiusuari (en serveis de sistema, fes servir aquest target i no default.target, que és el dels serveis d’usuari).

Abans d’activar-lo, pots comprovar que no té errors amb systemd-analyze verify, que avisa, per exemple, si el programa no existeix:

$ systemd-analyze verify el-meu-servei.service
el-meu-servei.service: Command /usr/local/bin/el-meu-programa is not executable: No such file or directory

Després, fes que systemd llegeixi el fitxer nou i activa’l:

sudo systemctl daemon-reload
sudo systemctl enable --now el-meu-servei.service
systemctl status el-meu-servei.service
journalctl -u el-meu-servei.service

enable --now el deixa activat per a les properes arrencades i l’engega ara mateix. Si només fas start, s’engega però no es tornarà a arrencar després de reiniciar.

Quin triar?

En una distribució actual no cal triar: ve amb systemd i és el que has d’aprendre. SysV init (o alternatives com OpenRC i runit) només el trobaràs en sistemes antics o en distribucions que han optat expressament per no fer servir systemd. systemd ha generat molt debat per la quantitat de funcions que concentra, però la seva gestió de dependències, el journal i systemctl han simplificat molt l’administració de serveis.

Posts relacionats