Hacking SystemD
Ho costruito sistemi Linux embedded per più di 10 anni. Questo significa che ho lavorato molto con sysV style init. È robusto e testato dal tempo, ma ha i suoi limiti. Ora ci sono diversi progetti che lavorano per soppiantare il dominio di sysinit, come Upstart e systemd.
Lavoro abbastanza con Fedora, costruendo sia filesystem nfsroot per workstation senza disco, sia firmware embedded basati sui repository Fedora. Fedora è una scelta insolita per questo tipo di lavoro; la maggior parte delle persone sceglierebbe Debian o Ubuntu.
Fedora è migrato a systemd nella versione 15. Poiché systemd era nuovo, ho deciso di aspettare e non aggiornare tutte le mie toolchain a Fedora 15. Ora siamo alla 17, e le cose sembrano piuttosto stabili. Quindi ho fatto il grande passo creando un sistema nfsroot usando Fedora 17. Il risultato finale è simile a LTSP5/Meukow – solo che tutti i pacchetti sono fantasticamente nuovi grazie a Fedora che è all'avanguardia.
La documentazione su systemd è scarsa, quindi ho avuto qualche problema a capire come ridurre systemd. Con sysinit le cose sono più semplici. Basta tagliare rc.sysinit finché non sembra bello e snello. Si usa anche chkconfig per disattivare i servizi irrilevanti. E naturalmente disabilitare selinux. Il team di Fedora ha pubblicato della documentazione utile per ottimizzare e usare systemd. Hanno anche un promemoria da sysVinit a systemd, e una guida al debug. Queste pagine sono state di grande aiuto.
Quando ho provato per la prima volta ad avviare il mio filesystem nfsroot, non si avviava. Aggiungendo
systemd.confirm_spawn=true
alla riga di comando del kernel, sono riuscito a controllare ogni comando in systemd e capire quale stava causando il crash.
Una bella capacità di systemd è quella di eseguire comandi stile chkconfig su un filesystem chroot, senza fare chroot al suo interno. Questo è simile alla funzionalità --installroot di yum, che è ciò che ho usato per costruire il filesystem inizialmente. Quindi, per disabilitare cron sul nuovo sistema che hai appena costruito, dovresti dare
systemctl --system --root=$TARGET disable crond.service
Dove $TARGET è il percorso del tuo chroot.
Ci sono diversi servizi che systemd avvia, che non possono essere disabilitati usando il comando sopra. I collegamenti ipertestuali a questi servizi/comandi non esistono nemmeno in /etc/systemd. L'unico modo che ho trovato è stato cancellare i symlink a questi comandi da /lib/systemd/system. Alcuni dei comandi che ho trovato inutili in un sistema embedded/desktop sono:
/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