Hacking SystemD
Я занимаюсь сборкой встраиваемых Linux-систем уже более 10 лет. Это означает, что я много работал с sysV style init. Он надежен и проверен временем, но у него есть свои ограничения. Сейчас существует несколько проектов, которые стремятся заменить доминирование sysinit, такие как Upstart и systemd.
Я довольно много работаю с Fedora, собирая как nfsroot файловые системы для бездисковых рабочих станций, так и встраиваемые прошивки на основе репозиториев Fedora. Fedora — странный выбор для такого рода работы; большинство людей предпочли бы Debian или Ubuntu.
Fedora перешла на systemd еще в версии 15. Поскольку systemd был новым, я решил повременить и не обновлять все свои инструментальные цепочки до Fedora 15. Сейчас мы на 17, и все выглядит довольно стабильно. Поэтому я решился на создание nfsroot-системы с использованием Fedora 17. Конечный результат похож на LTSP5/Meukow — только все пакеты потрясающе новые, благодаря тому что Fedora находится на переднем крае.
Документации по systemd мало, поэтому у меня возникли некоторые трудности с выяснением того, как его урезать. С sysinit все проще. Вы просто редактируете rc.sysinit, пока он не станет аккуратным и компактным. Также вы используете chkconfig, чтобы отключить ненужные службы. И конечно, отключаете selinux. Команда Fedora разместила несколько полезных документов по настройке и использованию systemd. У них также есть шпаргалка по переходу с sysVinit на systemd и руководство по отладке. Эти страницы оказали большую помощь.
Когда я впервые попытался загрузить свою nfsroot-файловую систему, она не загрузилась. Добавив
systemd.confirm_spawn=true
в параметры ядра, я смог контролировать каждую команду в systemd и выяснить, какая из них вызывала сбой.
Приятная возможность systemd — выполнять команды в стиле chkconfig в файловой системе chroot, не выполняя в нее chroot. Это похоже на функциональность –installroot в yum, которую я и использовал для первоначальной сборки файловой системы. Таким образом, чтобы отключить cron в только что собранной новой системе, вы выполняете:
systemctl --system --root=$TARGET disable crond.service
Где $TARGET — это путь к вашему chroot.
Существует ряд служб, которые запускает systemd и которые невозможно отключить с помощью вышеуказанной команды. Гиперссылок на эти службы/команды также нет в /etc/systemd. Единственный способ, который я нашел, — удалить символические ссылки на эти команды из /lib/systemd/system. Некоторые из команд, которые оказались бесполезными во встраиваемой/настольной системе:
/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