Как вы уже, наверное, знаете, что Debian после тяжёлых и многочисленных дебатов и голосований перешёл на новую систему инициализации Systemd. Вслед за папой Debian и Ubuntu переходит со своей системы Upstart на Systemd. Мы перейдём на Systemd полностью и бесповоротно!
Ubuntu и Debian. Systemd и Upstart.
Данная статья рассчитана только на опытных пользователей. Мы будем изменять систему инициализации у разрабатываемой Ubuntu 15.04 Vivid Vervet. Стоит напомнить, что система инициализации, известная так же как PID 1, одна из важнейших подсистем в операционной системе. Сбои и баги в ней малоприятны. 7 раз отмерьте - 1 раз отрежьте. Следует знать, что в последних версиях Убунту присутствуют установленные пакеты как upstart, так и systemd. Только главным и единственным является upstart.
В Upstart модель старта процессов (jobs) является "greedy event-based", то есть все доступные сервисы при наступлении события жадно стартуют, как можно быстрее.
В Systemd модель старта процессов (units) является "lazy dependency-based", то есть unit стартует только тогда, когда стартовал unit, от которого он зависит.
Чтобы переключиться на systemd, сначала сделаем себе страхующие вещи:
sudo -e /etc/default/grub
и удаляем quiet и splash из GRUB_CMDLINE_LINUX_DEFAULT. Сохраняем файл и вызываем sudo update-grub
sudo systemctl enable debug-shell.service
. Если система не загрузится, то вы можете зайти в консоль по CTRL+ALT+F9.ps -p1 | grep systemd && echo systemd || echo upstart
До полного перехода, можно и нужно попробовать загрузить систему с помощью systemd однократно. При старте системы успевайте зайти в меню grub и там в Advanced options for Ubuntu там найдите своё последнее ядро с "Ubuntu, with Linux ... (systemd)". Вы загрузитесь с параметром init=/lib/systemd/systemd
Полностью перейти на systemd можно, установив пакет sudo apt-get install systemd-sysv
. У вас должны удалиться пакеты ubuntu-minimal, ureadahead и upstart.
Кратенько в сравнении, как управляются сервисы в Upstart и Systemd.
Действие | Upstart | Systemd |
---|---|---|
Старт сервиса | start $job | systemctl start $unit |
Остановка сервиса | stop $job | systemctl stop $unit |
Рестарт сервиса | restart $job | systemctl restart $unit |
Статус сервиса | initctl list | systemctl status |
Проверка конфигурации | init-checkconf /tmp/foo.conf | systemd-analyze verify <unit_file> |
Показать переменные окружения | initctl list-env | systemctl show-environment |
Установить переменную | initctl set-env foo=bar | systemctl set-environment foo=bar |
Удалить переменную | initctl unset-env foo | systemctl unset-environment foo |
Журнал работы сервиса | cat /var/log/upstart/$job.log | sudo journalctl -u $unit |
Смотреть постоянно журнал | tail -f /var/log/upstart/$job.log | sudo journalctl -u $unit -f |
Показать зависимости сервисов | initctl2dot | systemctl list-dependencies --all |
Всё познаётся в сравнении.
sysvinit | Upstart | systemd | |
---|---|---|---|
Управление через D-Bus | нет | да | да |
Запуск без использования bash/shell скриптов | нет | нет | да |
Включены сервисы ранней стадии загрузки, написанные на языке C | нет | нет | да |
Возможность упреждающего чтения данных с диска | нет | нет[1] | да |
Активация сервисов на основе сокетов | нет | нет[1] | да |
Активация сервисов на основе сокетов: совместимость с inetd | нет | нет[2] | да |
Активация на основе шины (Bus-based Activation) | нет | нет[3] | да |
Активация на основе аппаратуры компьютера | нет | нет[4] | да |
Конфигурирование зависимостей устройств, используя правила udev | нет | нет | да |
Активация по событиям файловой системы (inotify) | нет | нет | да |
Активация по времени | нет | нет | да |
Управление точками монтирования | нет | нет[5] | да |
Управление запуском fsck | нет | нет[5] | да |
Управление квотами | нет | нет | да |
Управление автомонтированием | нет | нет | да |
Управление SWAP | нет | нет | да |
Сохранение снимков состояния системы (snapshotting) | нет | нет | да |
Поддержка XDG_RUNTIME_DIR | нет | нет | да |
Опциональная остановка процессов пользователя после его выхода из системы | нет | нет | да |
Интеграция с Linux Control Groups (cgroups) | нет | нет | да |
Генерация событий аудита для запускаемых сервисов | нет | нет | да |
Интеграция с SELinux | нет | нет | да |
Интеграция с PAM | нет | нет | да |
Управление шифрованными разделами и дисками (LUKS) | нет | нет | да |
Поддержка обработки паролей к LUKS и SSL-сертификатам, с запросом пароля через такие агенты, как Plymouth, консоли, wall, tty терминалов и GNOME | нет | нет | да |
Управление сетевым петлевым устройством (loopback) | нет | нет | да |
Управление binfmt_misc (поддержка неродных исполняемых файлов) | нет | нет | да |
Управление системной локалью | нет | нет | да |
Настройка параметров консоли и клавиатуры | нет | нет | да |
Инфраструктура для создания, удаления и чистки временных файлов | нет | нет | да |
Управление через /proc/sys sysctl | нет | нет | да |
Интеграция с plymouth (графическим запуском, используя KMS) | нет | нет | да |
Сохранение и восстановление random seed (состояния генератора энтропии) | нет | нет | да |
Поддержка статической загрузки модулей ядра | нет | нет | да |
Автоматическое управление консолью COM-порта | нет | нет | да |
Управление уникальным ID компьютера | нет | нет | да |
Управление динамическим именем хоста и метаданными компьютера | нет | нет | да |
Контролируемая остановка сервисов | нет | нет | да |
Поддержка раннего логирования через /dev/log | нет | нет | да |
Включает минимальный демон логирования на основе kmsg для встраиваемых систем | нет | нет | да |
Перезапуск сервисов в случае краха без потери соединения | нет | нет | да |
Бесшовное обновление сервисов | нет | нет | да |
Графический интерфейс пользователя (опционально) | нет | нет | да |
Встроена поддержка профилирования и расширенных инструментов | нет | нет | да |
Поддержка сервисов типа "instantiated" | нет | да | да |
Интеграция с PolicyKit | нет | нет | да |
Есть встроенные утилиты для удалённого доступа и управления кластером | нет | нет | да |
Может показать все процессы, принадлежащие сервису | нет | нет | да |
Может идентифицировать процессы сервиса | нет | нет | да |
Автоматически создаёт cgroups для сервисов для равномерного распределения времени CPU | нет | нет | да |
Аналогично для пользовательских процессов | нет | нет | да |
Совместимость с SysV | да | да | да |
Сервисы SysV контролируются как родные сервисы | да | нет | да |
Управление сервисами через /dev/initctl | да | нет | да |
Перезапуск сервисов с полной сериализацией (serialization) состояния | да | нет | да |
Поддержка интерактивного (управляемого) запуска системы | нет[6] | нет[6] | да |
Поддержка контейнеров (как расширенная замена chroot()) | нет | нет | да |
Загрузка, построенная на основе зависимостей | нет[7] | нет | да |
Отключение сервисов без редактирования файлов | да | нет | да |
Маскировка сервисов без редактирования файлов | нет | нет | да |
Надёжная остановка системы, используя только один процесс | нет | нет | да |
Встроенная поддержка перезапуска ядра на лету (kexec) | нет | нет | да |
Динамическая генерация сервисов | нет | нет | да |
Поддержка в других компонентах ОС | да | нет | да |
Файлы запуска сервисов, совместимые с различными дистрибутивами | нет | нет | да |
Отправка сигналов сервисам | нет | нет | да |
Надёжная остановка пользовательских сессий перед остановом системы | нет | нет | да |
Поддержка логирования в utmp/wtmp | да | да | да |
Легкие для написания, расширения и обработки файлы управления сервисами, подходящие для манипулирования инструментами управления предприятием | нет | нет | да |
[1] Реализация упреждающего чтения в Upstart доступна в виде отдельного пакета ureadahead и требует наложения патча на ядро
[2] Активация через сокеты в upstart является экспериментальной возможностью, а также не поддерживает сериализацию, поэтому вообще не подходит для этого.
[3] Активация через шину для upstart доступна пока только в виде патча, который в основную ветку разработки ещё не принят.
[4] реализация в upstart не является практичной.
[5] Данная возможность для upstart существует в виде отдельного пакета и работает только для монтирования во время загрузки, плохо поддерживая зависимости.
[6] Некоторые дистрибутивы реализуют эту возможность с помощью shell скриптов.
[7] Скрипты инициализации LSB поддерживают это, в случае если они используются.
От себя лично, хочется сказать о впечатлении о "переходе". Систему инициализации в хорошем смысле не видно, так как работает она под капотом, но меня поразила скорость загрузки. Нельзя сказать, что Upstart как-то медленно загружает систему, но всё же субъективно Systemd влёт грузит сервисы и вот сразу виден вход в систему LightDM. Хотя по мнению Леннарта (автора systemd) высокая скорость systemd - это всего лишь побочный результат правильного дизайна и архитектуры проекта, а не цель. Я не являюсь противником Леннарта Поттеринга (Lennart Poettering) и мне нравится systemd, который в будущем унифицирует во всех дистрибутивах линукс работу с сервисами. Вот только за это, стоит сказать спасибо!
Видео дня! Противостояние режимов Desktop vs Tablet в Unity 8 Ubuntu 15.04.
Дополнительные материалы:
Ubuntu 15.04 Vivid Vervet Alpha 1.