Hacking SystemD
Estou construindo sistemas Linux embarcados há mais de 10 anos. Isso significa que trabalhei muito com init estilo sysV. Ele é robusto e testado pelo tempo, mas tem suas limitações. Agora existem vários projetos trabalhando para suplantar o domínio do sysinit, como Upstart e systemd.
Trabalho bastante com Fedora, construindo tanto sistemas de arquivos nfsroot para estações sem disco, quanto firmware embarcado baseado nos repositórios do Fedora. Fedora é uma escolha incomum para esse tipo de trabalho; a maioria das pessoas optaria por Debian ou Ubuntu.
O Fedora migrou para o systemd a partir da versão 15. Como o systemd era novo, decidi esperar e não atualizar todas as minhas toolchains para o Fedora 15. Agora estamos na 17, e as coisas parecem bastante estáveis. Então me aventurei em criar um sistema nfsroot usando Fedora 17. O resultado final é similar ao LTSP5/Meukow – só que todos os pacotes são incrivelmente novos graças ao Fedora estar na vanguarda.
A documentação sobre systemd é escassa, então tive algumas dificuldades para descobrir como enxugar o systemd. Com o sysinit as coisas são mais fáceis. Você simplesmente corta o rc.sysinit até que fique bonito e enxuto. Você também usa chkconfig para desabilitar serviços irrelevantes. E claro, desativa o selinux. A equipe do Fedora disponibilizou alguma documentação útil sobre ajustes e uso do systemd. Eles também têm uma folha de dicas do sysVinit para systemd, e um guia de depuração. Essas páginas foram de grande ajuda.
Quando tentei iniciar meu sistema de arquivos nfsroot pela primeira vez, ele não bootava. Adicionando
systemd.confirm_spawn=true
à linha de comando do kernel, consegui controlar cada comando no systemd e descobrir qual deles estava travando.
Uma habilidade interessante do systemd é executar comandos estilo chkconfig em um sistema de arquivos chroot, sem precisar fazer chroot nele. Isso é similar à funcionalidade --installroot do yum, que foi o que usei para construir o sistema de arquivos inicialmente. Então, para desabilitar o cron no novo sistema que você acabou de construir, você usaria
systemctl --system --root=$TARGET disable crond.service
Onde $TARGET é o caminho para seu chroot.
Existem vários serviços que o systemd inicia, que não podem ser desabilitados usando o comando acima. Hyperlinks para esses serviços/comandos também não existem em /etc/systemd. A única maneira que encontrei foi excluir symlinks para esses comandos de /lib/systemd/system. Alguns dos comandos que considerei inúteis em um sistema embarcado/desktop são:
/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