Continuando con estos temas de systemd (ahora que el tiempo ha dado tregua :P) vamos a la siguiente parte.

Niveles de ejecucion/targets

Los runlevel o nuveles de ejecucion en sistemas tipo Unix SystemV se refiere a el modo de operacion del sistema, generalmente son 7 distintos niveles de ejecucion, aunque algunos sistemas varian de 7 a 10 niveles distintos de ejecucion.

En ArchLinux hay 7 niveles de ejecucion en los initscripts

Nivel Descripcion
0 Halt/Apagar
1 Mono-usuario (modo de mantenimiento)
2 No usado
3 Multi-Ususario
4 No usado
5 Multi-Usuario con X11
6 Reinicio

Distintos niveles de ejecucion son llamados durante el inicio del sistema o durante el apagado/reinicio, esto claro con initcripts, systemd hace las cosas un poco diferente.

Systemd tiene un concepto de objetivos o targets que tienen el mismo objetivo que los niveles de ejecucion, pero funcionan diferente:

  • Cada objetivo tiene un nombre en vez de un numero y cada uno tiene un objetivo en especifico.
  • Algunos objetivos heredan todos los procesos del objetivo anterior y añade servicios a ellos.
  • Hay objetivos diseñados especificamente para imitar el comportamiento de los niveles de ejecucion de sysvinit y pueden ser llamados con el clasico comando init

Antes ya habia escrito sobre estos niveles de ejecucion y los targets, me permito copiar esta tabla de equivalencias:

Nivel de ejecucion SystemV

Objetivo de Systemd

Notas

0 runlevel0.target, poweroff.target Apaga el sistema
1, mono usuario runlevel1.target, rescue.target Modo mono-usuario
2, 4 runlevel2.target, runlevel4.target, multi-user.target Modo de inicio definido por el usuario/sistema, por default identico a 3
3 runlevel3.target, multi-user.target Multiusuario, entorno grafico
5 runlevel5.target, graphical.target Multiusuario, entorno grafico, todos los servicios del nivel 3 mas un entorno grafico
6 runlevel6.target, reboot.target reinicio
emergency emergency.target Shell de emergencia

Y que target estoy ejecutando?

Como systemd tiene una capa de compatibilidad con los niveles de ejecucion se puede saber el nivel de ejecucion con el comando runlevel pero en systemd, pueden estar en ejecucion multiples objetivos, por lo cual se recomienda:

systemctl list-units --type=target

Esto nos dara los objetivos (o targets) en actual ejecucion

Si queremos ver los targets disponibles qeu tenemos:

systemctl list-units --type=target --all

Y como utilizo estos targets?

Algunos ejemplos:

Activar multi usuario con interfaz grafica:

systemctl isolate runlevel5.target

O nivel monousuairo o modo de rescate (runlevel 1)

systemctl isolate runlevel1.target

pasar parametros temporales al grub

Antes en el grub se podian pasar parametros de inicio temporales, al final de la linea de inicio del kernel en el grub se podia poner el nivel de ejecucion del sistema solo poniendo el numero del nivel de ejecucion:

Poniendo un parametro de inicio de nivel monousuario de manera temporal:

kernel /vmlinuz-linux root=/dev/disk/by-uuid/d531ff5b-de65-499a-9942-d18682375163 ro quiet 3

Ahora con Systemd son un monton de parametros los que se pueden controlar:

systemd.unit=
Sobre escribe de manera temproal en que target iniciara, es usado para inicar de manera temproal en otro nivel de ejecucion, como nivel mono usuario: systemd.unit=rescue.targeto emergencia: systemd.unit=emergency.target, el default es default.target
systemd.dump_core=
Toma un argumento booleano. Si es cierto tirara lo registros cuando truene. De otra forma ningun registro es creado (ideal para averiguar que genera un kernel panic)
systemd.crash_shell=
Toma un aargumento booleano. Si es cierto systemd iniciara una shell cuando truene. De otra forma no hara nada, el default es no hacer nada, por razones de seguridad esta desactivado ya que la shell a donde llega esta desprotegida de password
systemd.crash_chvt=
Toma un argumento entero. Si es positivo systemd activara la terminal virtual especificada (el default es -1)
systemd.confirm_spawn=
Toma un argumento booleano. Si es verdadero, systemd pedira configmacion para iniciar procesos (default es falso)
systemd.show_status=
Toma un argumento booleano. Si es verdadero systemd envia mensajes de estatus a la consola durante el inicio (default en verdadero)
systemd.sysv_console=
Toma un argumento booleano. Si es verdadero, la salida de los sscripts de sysvinit seran mostrados en cosola. El default es verdadero, a menos que el parametro quiet sea pasado como argumento de inicio
systemd.log_target=
Establece el objetivo del registro. el argumento debe ser uno de estos: console, syslog, kmsg, syslog-or-kmsg, null.
systemd.log_level=
Establece un nivel de registro. Como argumento acepta un numero o los conocidos nombres de syslog: emerg, alert, crit, err, warning, notice, info, debug.
systemd.log_color=
Subraya importantes mensajes de registro. El argumetno es booleano. Su default es verdadero
systemd.log_location=
Especifica la ruta a donde guardar los registros, esto es importante para debigging.

Cualquiera de estos valores pueden ser introducidos temporalmente a la linea de inicio del grub para distintos fines.

Listo. para mañana los units y los daemons cara a cara, Saludos!

Para leer:

Wikipedia Niveles de ejecucion
Fedora sysvinit to systemd cheatsheet

Fedora: how to debug systemd