Pirater SystemD
Je construis des systèmes Linux embarqués depuis plus de 10 ans, et j'ai travaillé intensivement avec sysV style init. Il est robuste et éprouvé, mais il a ses limites. Plusieurs projets visent maintenant à remplacer sysvinit, tels que Upstart et systemd.
Je travaille intensivement avec Fedora, construisant à la fois des systèmes de fichiers nfsroot pour des stations de travail sans disque, et des firmwares embarqués basés sur les dépôts Fedora. Fedora est un choix étrange pour ce genre de travail ; la plupart des gens choisiraient Debian ou Ubuntu.
Fedora a migré vers systemd dès la version 15. Comme systemd était nouveau, j'ai décidé de ne pas mettre à jour mes toolchains vers Fedora 15. Nous sommes maintenant à la version 17, et systemd semble stable. J'ai donc construit un système nfsroot utilisant Fedora 17. Le résultat est similaire à LTSP5/Meukow, sauf que tous les paquets sont beaucoup plus récents, car Fedora livre des versions récentes.
La documentation sur systemd est sparse, et j'ai eu quelques difficultés à comprendre comment réduire systemd. Avec sysvinit, la réduction est plus facile : vous éditez rc.sysinit jusqu'à ce qu'il soit épuré, utilisez chkconfig pour désactiver les services non pertinents, et désactivez SELinux. L'équipe Fedora a mis en ligne de la documentation utile sur l'ajustement et l'utilisation de systemd. Ils ont aussi une aide-mémoire sysVinit vers systemd, et un guide de débogage. Ces pages m'ont beaucoup aidé.
Mon système de fichiers nfsroot a échoué au démarrage lors de la première tentative. En ajoutant
systemd.confirm_spawn=true
à la ligne de commande du noyau, j'ai pu confirmer chaque commande que systemd exécutait, et découvrir laquelle plantait.
Une fonctionnalité utile de systemd est qu'il peut exécuter des commandes de style chkconfig sur un système de fichiers chroot sans avoir à y faire chroot. C'est similaire à l'option --installroot de yum, que j'ai utilisée pour construire le système de fichiers à l'origine. Par exemple, pour désactiver cron sur le système que vous venez de construire, exécutez
systemctl --system --root=$TARGET disable crond.service
Où $TARGET est le chemin vers votre chroot.
Systemd lance un certain nombre de services qui ne peuvent pas être désactivés avec la commande ci-dessus. Les liens symboliques vers ces services/commandes n'existent pas non plus dans /etc/systemd. La seule méthode que j'ai trouvée était de supprimer les liens symboliques vers ces commandes depuis /lib/systemd/system. Certaines des commandes que j'ai trouvées inutiles dans un système embarqué/de bureau sont :
/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