Apagar, reiniciar o tancar la sessió a LinuxComandes LinuxLinux

La comanda init a Linux: dels nivells d’execució als targets de systemd



init és el primer procés que arrenca el nucli (kernel) quan s’engega Linux: sempre té el PID 1 i és el pare de tots els altres processos. S’encarrega d’engegar els serveis, muntar els discos, obrir les pantalles d’inici de sessió i, al final, d’apagar-ho tot ordenadament.

Durant anys, la comanda init (amb un número al darrere) també servia per canviar de nivell d’execució (runlevel): init 0 apagava, init 6 reiniciava, init 3 passava a mode text… Avui aquest sistema (SysV init) està obsolet: totes les distribucions principals (Debian, Ubuntu, Fedora, RHEL, Rocky, AlmaLinux, Arch…) fan servir systemd, i els nivells d’execució s’han substituït per targets. La comanda init N encara funciona, però només per compatibilitat.

Qui és init al teu sistema

$ ps -p 1 -o pid,comm,args
    PID COMMAND         COMMAND
      1 systemd         /sbin/init splash

$ ls -l /usr/sbin/init
lrwxrwxrwx 1 root root 22 /usr/sbin/init -> ../lib/systemd/systemd

El nucli executa /sbin/init, però en realitat és un enllaç a systemd. Quan escrius init des d’un terminal (és a dir, quan no és el PID 1), systemd passa els arguments a telinit, així que init 3 i telinit 3 fan exactament el mateix.

Sintaxi (heretada)

sudo init nivell

Dels nivells d’execució als targets de systemd

NivellQuè era amb SysV initTarget de systemdComanda actual
0Apagarpoweroff.targetsystemctl poweroff
1, s, SMonousuari (manteniment)rescue.targetsystemctl rescue
2, 3, 4Multiusuari en mode textmulti-user.targetsystemctl isolate multi-user.target
5Multiusuari amb entorn gràficgraphical.targetsystemctl isolate graphical.target
6Reiniciarreboot.targetsystemctl reboot

systemd manté els noms antics com a àlies, i ho pots comprovar:

$ ls -l /usr/lib/systemd/system/runlevel*.target
runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target
runlevel3.target -> multi-user.target
runlevel4.target -> multi-user.target
runlevel5.target -> graphical.target
runlevel6.target -> reboot.target

Exemples amb systemd

Saber amb quin target arrenca el sistema (l’equivalent de l’antic nivell per defecte de /etc/inittab):

$ systemctl get-default
graphical.target

Fer que un servidor arrenqui sempre en mode text, sense entorn gràfic:

sudo systemctl set-default multi-user.target

Passar a mode text ara mateix, sense reiniciar (l’antic init 3). Compte: tanca l’entorn gràfic i tot el que hi tinguis obert.

sudo systemctl isolate multi-user.target

Entrar en mode de rescat per fer manteniment (l’antic init 1): s’aturen gairebé tots els serveis i normalment et demana la contrasenya de root.

sudo systemctl rescue

Veure quins targets estan actius ara mateix:

$ systemctl list-units --type=target
  UNIT                   LOAD   ACTIVE SUB    DESCRIPTION
  basic.target           loaded active active Basic System
  getty.target           loaded active active Login Prompts
  graphical.target       loaded active active Graphical Interface
  multi-user.target      loaded active active Multi-User System
  network-online.target  loaded active active Network is Online
...

Arrencar en un mode concret des del GRUB

Si el sistema no arrenca bé, pots triar el target abans que comenci: al menú del GRUB, prem e, afegeix al final de la línia que comença per linux una d’aquestes opcions i prem Ctrl+X:

  • systemd.unit=rescue.target: mode de rescat (també funciona l’antic 1 o single).
  • systemd.unit=multi-user.target: mode text (també 3).
  • systemd.unit=emergency.target: mode d’emergència, encara més mínim que el de rescat.

Correccions respecte a la versió antiga d’aquest post

  • single no és cap comanda: és un paràmetre del nucli que s’escriu al GRUB. Per entrar en mode de rescat des d’un sistema en marxa, systemctl rescue.
  • Els nivells 3 i 5 no són «habituals amb systemd»: són conceptes de SysV init que systemd tradueix als targets multi-user i graphical.
  • Per apagar i reiniciar, poweroff i reboot existeixen, però la forma recomanada és systemctl poweroff i systemctl reboot.

Comandes relacionades