miércoles, 14 de enero de 2015

Jugando con systemD

Hola!! después de un largo tiempo sin escribir aquí y como propósito de año nuevo, espero poder seguir escribiendo en el blog. Desde que me "lié" con el proyecto [awbian] GNU/Linux dispongo de poco tiempo para mis "frikadas" y menos para escribirlas. Ya que en awbian se ha hecho la apuesta de usar systemd como gestor del sistema, voy a recopilar un pequeño manual básico de su uso.

Esquema de la arquitectura de systemd:


Empezamos con systemctl que básicamente es el subtituto de /etc/init.d/... start/restart/stop de toda la vida. Éste tiene algunos casos de uso útiles que veremos en unas pocas líneas. Llegados a este punto, creo que es útil definir como systemd usa el término "Unit"; este se refiere a servicio, sockets, devices, puntos de montage, particiones, paths, timers, ttys... y las "units" será quien recibirá las acciones que ordenaremos con systemctl:
  1. systemctl (Lista todas las unidades, su estado, descripción)
  2. systemctl start/stop [Unidad] (arranca o para una unidad)
  3. systemctl status [Unidad] (estado de la unidad)
  4. systemctl help [Unidad](un pequeño man de cada unidad)
  5. systemctl daemon-reload (escanea si hay cambios en la Unidades)
Por ejemplo:
# systemctl status syslog-ng.service
syslog-ng.service - System Logger Daemon
   Loaded: loaded (/lib/systemd/system/syslog-ng.service; enabled)
   Active: active (running) since Wed, 14 Jan 2015 12:18:08 +0100; 2h 17min ago
 Main PID: 18789 (syslog-ng)
   CGroup: name=systemd:/system/syslog-ng.service
    └ 18789 /usr/sbin/syslog-ng -F

Podemos ver la configuración de cada unidad en  /lib/systemd/ por ejemplo en el caso de syslog tal como dice el "status" está loaded en /lib/systemd/system/syslog-ng.service
Ahora es muy facil activar o desactivar un servicio:
  1. systemctl enable/disable [unidad] (activa o desactiva una unidad) Podria ser equivalente a chkconfig o a un update-rc.d...
Esto hace surgir la duda de en que runlevel está activo... systemd controla el runlevel también:
  1. systemctl isolate graphical.target (equivale hacer init 5)
  2. systemctl isolate multi-user.target (equivale hacer init 3)
  3. systemctl reboot/poweroff/suspend/hibernate/hybrid-sleep (apagados,reinicios, etc..)
  4. systemctl set-default multi-user.target (serializamos iniciar sin X)
Las unidades se escriben con su propia sintaxis, por lo que he podido ver, basada en XDG Desktop, similar a los .ini de Windows y se hubican en: 
/lib/systemd/system/ (los paquetes suelen dejarlos aquí) 
/etc/systemd/system/ (aquí es donde haremos las modificaciones)
Otra cosa que me parece muy interesante es el análisis del arranque que nos ofrece systemd. Por ejemplo:
# systemd-analyze (nos da el resumen de lo que tarda en arrancar el sistema)
Startup finished in 3100ms (kernel) + 18727ms (userspace) = 21828ms
# systemd-analyze blame (lo mismo pero sin resumen)
  5591ms cryptsetup@ferran_home.service
  4828ms lvm2.service
  4785ms wicd.service
  4361ms exim4.service
  3668ms keyboard-setup.service
#systemd-analyze plot > bootplot.svg (genera un gráfico del tiempo de boot)
Y con esto, el primer ladrillo del año ;)
Gracias por estar aquí. Como siempre, comenta, añade lo que consideres oportuno.
Saludos