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/(viasyslog).
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ística | SysV init | systemd |
|---|---|---|
| Arrencada | Seqüencial | En paral·lel |
| Configuració | Scripts de shell a /etc/init.d/ | Unitats declaratives a /etc/systemd/system/ i /usr/lib/systemd/system/ |
| Dependències | Manuals (ordre dels enllaços) | Automàtiques (Requires=, After=, Wants=…) |
| Estats del sistema | Runlevels (0-6) | Targets |
| Control de processos | PID que guarda cada script | cgroups |
| Registres | Fitxers de text amb syslog | Journal (journalctl), i opcionalment syslog |
| Comandes | service, /etc/init.d/servei, telinit | systemctl |
| On el trobaràs | Sistemes 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 init | systemd |
|---|---|
service apache2 start / /etc/init.d/apache2 start | systemctl start apache2 |
service apache2 status | systemctl status apache2 |
update-rc.d apache2 enable / chkconfig httpd on | systemctl enable apache2 |
runlevel | systemctl get-default |
telinit 3 | systemctl isolate multi-user.target |
telinit 6 / reboot | systemctl 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 asystemctl status.AfteriWants: 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 (alwaysel reinicia fins i tot si acaba bé).User: usuari amb què s’executa; si no el poses, s’executa com aroot.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 nodefault.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.