Piratage de SystemD

Je construis des systèmes Linux embarqués depuis plus de 10 ans. Cela signifie que j’ai beaucoup travaillé avec l'init de style sysV. C’est robuste et éprouvé, mais cela a ses limites. Il existe aujourd’hui plusieurs projets qui cherchent à supplanter la domination de sysinit, comme Upstart et systemd.

Je travaille pas mal avec Fedora, construisant à la fois des systèmes de fichiers nfsroot pour postes 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 utiliseraient Debian ou Ubuntu.

Fedora a migré vers systemd à la version 15. Comme systemd était nouveau, j’ai décidé d’attendre et de ne pas mettre à jour toutes mes chaînes d’outils vers Fedora 15. Nous sommes maintenant sur la 17, et les choses semblent plutôt stables. J’ai donc sauté le pas et créé un système nfsroot utilisant Fedora 17. Le résultat final est similaire à LTSP5/Meukow – seulement tous les paquets sont merveilleusement récents grâce à Fedora qui est à la pointe de la technologie.

La documentation sur systemd est rare, donc j’ai eu quelques difficultés à comprendre comment réduire systemd. Avec sysinit, les choses sont plus faciles. Il suffit de couper dans rc.sysinit jusqu’à ce que ce soit propre et minimal. On utilise aussi chkconfig pour désactiver les services inutiles. Et bien sûr, on désactive selinux. L’équipe Fedora a mis en ligne une documentation utile sur le réglage et l’utilisation de systemd. Ils ont aussi une antisèche sysVinit vers systemd, et un guide de débogage. Ces pages m’ont beaucoup aidé.

Lorsque j’ai essayé pour la première fois de démarrer mon système de fichiers nfsroot, il ne démarrait pas. En ajoutant

systemd.confirm_spawn=true

à la ligne de commande du noyau, j’ai pu contrôler chaque commande de systemd et identifier celle qui plantait.

Une fonctionnalité intéressante de systemd est de pouvoir exécuter des commandes de style chkconfig sur un système de fichiers chroot, sans avoir à faire un chroot dedans. Cela ressemble à la fonctionnalité --installroot de yum, que j’ai utilisée pour construire le système de fichiers en premier lieu. Ainsi, pour désactiver cron sur le nouveau système que vous venez de construire, vous taperiez

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

Où $TARGET est le chemin vers votre chroot.

Il existe un certain nombre de services que systemd lance et qui ne peuvent pas être désactivés avec la commande ci-dessus. Les hyperliens vers ces services/commandes n’existent pas non plus dans /etc/systemd. La seule méthode que j’ai trouvée a été de supprimer les liens symboliques vers ces commandes depuis /lib/systemd/system. Parmi les commandes que j’ai jugées inutiles dans un système embarqué/de bureau, on trouve :

/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