Hackeando SystemD
He estado construyendo sistemas Linux embebidos durante más de 10 años, y he trabajado extensivamente con init estilo sysV. Es robusto y probado por el tiempo, pero tiene sus limitaciones. Varios proyectos ahora apuntan a reemplazar sysvinit, como Upstart y systemd.
Trabajo extensivamente 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 iría con Debian o Ubuntu.
Fedora migró a systemd en la versión 15. Como systemd era nuevo, decidí no actualizar mis toolchains a Fedora 15. Ahora estamos en 17, y systemd parece estable. Por lo tanto, construí un sistema nfsroot usando Fedora 17. El resultado es similar a LTSP5/Meukow, excepto que todos los paquetes son mucho más nuevos, ya que Fedora envía versiones recientes.
La documentación sobre systemd es escasa, y tuve algunos problemas para descubrir cómo recortar systemd. Con sysvinit, recortar es más fácil: editas rc.sysinit hasta que quede reducido, usas chkconfig para desactivar servicios irrelevantes y deshabilitas SELinux. El equipo de Fedora ha publicado algo de documentación útil sobre cómo ajustar y usar systemd. También tienen una chuleta de sysVinit a systemd, y una guía de depuración. Estas páginas me ayudaron enormemente.
Mi sistema de archivos nfsroot falló al arrancar en el primer intento. Añadiendo
systemd.confirm_spawn=true
a la línea de comandos del kernel, pude confirmar cada comando que systemd ejecutaba, y descubrir cuál estaba fallando.
Una característica útil de systemd es que puede ejecutar comandos al estilo chkconfig en un sistema de archivos chroot sin necesidad de hacer chroot en él. Esto es similar a la opción --installroot de yum, que usé para construir el sistema de archivos en primer lugar. Por ejemplo, para desactivar cron en el sistema que acabas de construir, ejecuta
systemctl --system --root=$TARGET disable crond.service
Donde $TARGET es la ruta a tu chroot.
Systemd lanza una serie de servicios que no pueden desactivarse con el comando anterior. Los enlaces simbólicos a estos servicios/comandos tampoco existen en /etc/systemd. El único método que encontré fue eliminar los enlaces simbólicos a estos comandos de /lib/systemd/system. Algunos de los comandos que encontré innecesarios 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