Hacking SystemD

He estado construyendo sistemas Linux embebidos durante más de 10 años. Esto significa que he trabajado mucho con sysV style init. Es robusto y probado por el tiempo, pero tiene sus limitaciones. Ahora hay múltiples proyectos trabajando para suplantar el dominio de sysinit, como Upstart y systemd.

Trabajo bastante con Fedora, construyendo tanto sistemas de archivos nfsroot para estaciones de trabajo sin disco, como firmware embebido basado en repositorios de Fedora. Fedora es una elección extraña para este tipo de trabajo; la mayoría de la gente optaría por Debian o Ubuntu.

Fedora migró a systemd en la versión 15. Como systemd era nuevo, decidí esperar y no actualizar todas mis cadenas de herramientas a Fedora 15. Ahora estamos en 17, y las cosas parecen bastante estables. Así que me decidí a crear un sistema nfsroot usando Fedora 17. El resultado final es similar a LTSP5/Meukow – solo que todos los paquetes son increíblemente nuevos gracias a que Fedora está a la vanguardia.

La documentación sobre systemd es escasa, así que tuve algunos problemas para descubrir cómo reducir systemd. Con sysinit las cosas son más fáciles. Simplemente recortas rc.sysinit hasta que se vea bien y liviano. También usas chkconfig para desactivar servicios irrelevantes. Y por supuesto desactivar selinux. El equipo de Fedora ha publicado alguna documentación útil sobre cómo ajustar y usar systemd. También tienen una guía de referencia de sysVinit a systemd, y una guía de depuración. Estas páginas fueron de gran ayuda.

Cuando intenté arrancar mi sistema de archivos nfsroot por primera vez, no arrancaba. Agregando

systemd.confirm_spawn=true

a la línea de comandos del kernel, pude controlar cada comando en systemd y descubrir cuál estaba fallando.

Una capacidad interesante de systemd es ejecutar comandos al estilo chkconfig en un sistema de archivos chroot, sin necesidad de hacer chroot en él. Esto es similar a la funcionalidad –installroot de yum, que fue lo que utilicé para construir el sistema de archivos inicialmente. Así que, para desactivar cron en el sistema nuevo que acabas de construir, ejecutarías

systemctl --system --root=$TARGET disable crond.service

Donde $TARGET es la ruta a tu chroot.

Hay varios servicios que systemd lanza, que no pueden desactivarse usando el comando anterior. Los enlaces a estos servicios/comandos tampoco existen en /etc/systemd. La única forma que encontré fue eliminar los enlaces simbólicos a estos comandos desde /lib/systemd/system. Algunos de los comandos que consideré inútiles en un sistema embebido/de escritorio son:

/lib/systemd/system/sysinit.target.wants/*binfmt*
/lib/systemd/system/sysinit.target.wants/cryptsetup.target
/lib/systemd/system/sysinit.target.wants/dev-hugepages.target
/lib/systemd/system/basic.target.wants/fedora-configure.service
/lib/systemd/system/local-fs.target.wants/fedora-import-state.service
/lib/systemd/system/local-fs.target.wants/fedora-readonly.service
/lib/systemd/system/local-fs.target.wants/fedora-storage-init*.service