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