Вредные эксперименты с init в Debian

image-loader.svg

При изучении операционной системы Linux возникает момент, когда становится интересно, как работает система и возможные варианты ее апгрейда и изменения. Статья расскажет об системе init и использовании аналогичных систем для ОС Debian.

Disclamer: Все действия производятся только для изучения работы систем инициализации, не рекомендуется выполнять команды из статьи на рабочих машинах.

Что такое init

Подсистема, о которой идет речь, используется в операционной системе для запуска процессов и инициализации всех систем, которые и составляют функционал ОС. Название init стало нарицательным из-за того, что на Unix системах первая подсистема инициализации именно так и называлась. Сейчас эта система называется sysvinit и продолжает существовать, но так как она не может удовлетворить все потребности пользователей, то со временем начали появляться новые проекты. Сегодня подсистемы инициализации представлены несколькими вариантами. Эти подсистемы отличаются как подходом к запуску системы, так и возможностями. Все системы затачиваются под задачи различных ядер, которые используются для работы совеременных дистрибутивов. Вот несколько из них:

  • sysvinit

  • OpenRC

  • upstart

  • SMF

  • launchd

  • Epoch

  • finit

  • runit

  • s6+s6-rc

  • BSD rc.d

  • systemd

Список далеко не полный, перечислены только наиболее популярные или известные. Может показаться, что большой список аналогичных систем дает простор для выбора, однако это только первое впечатление. Большое количество пользователей знакомится с миром Linux систем через Debian или Ubuntu. Эти ОС используют в качестве подсистемы для инициализации по умолчанию systemd. Из-за своей гибкости и большого количества функций эта подсистема сейчас занимает доминирующее положение среди популярных дистрибутивов. Такое положение вещей не очень устраивает пользователей, особенно пользователей Debian систем, и они даже создали движение «Init Freedom» и сделали форк операционной системы. Найти его можно здесь.

Опишем несколько систем инициализации ниже. Выбор именно этих систем обусловлен тем, что начиная с Debian 11 их можно установить в операционной системе.

systemd

Подсистема инициализации, устанавливается по-умолчанию в Debian 11 и ряде предшествующих версий. Основой управления для этой подсистемы является модуль (unit). Он может иметь собственные характеристики, которые определяют тип. Несколько типов модулей:

  • служба

  • точка монтирования

  • файл подкачки

  • сокет

  • виртуальная машина

  • таймер

image-loader.svg

Картинка позаимствована тут

Пример заполненного модуля можно найти по пути /etc/systemd/system/

image-loader.svg

Пример модуля, который отвечает за работу сервиса Wi-Fi:

image-loader.svg

Для каждого типа можно определить так называемую изолируемую контрольную группу. Также можно назначать приоритет на запуск служб и контролировать зависимые сервисы. Именно эта инициализирующая подсистема первой начала использовать параллельный запуск в отличии от sysvinit, которая работала только последовательно.

sysvinit

sysvinit — подсистема, была разработана для Unix систем, долгое время была единственной системой для запуска приложений и сервисов. Была адаптирована для Linux. Для работы подсистемы используетсся общий конфиг, который создается для всех сервисов, которые необходимо запустить. Называется конфиг inittab. Каждый записанный в конфиг сервис имеет свой уровень запуска (runlevel). Уровни могут быть использованы как метка, которая позволяет запускать операционную систему в нужном состоянии — включать только терминал, запускать сервисы по восстановлению работы ОС и т.д. Пример такого файла:

image-loader.svg

OpenRC

Система инициализации, которая была разработана специально для Gentoo, но так же может быть использована в других дистрибутивах, например в Debian. Сама система достаточно проста в использовании и работе, была портирована и для BSD систем. Работает по схожим принципам как это было в подсистеме sysvinit. Конфигурация запуска сервисов проводится из конфигураций, которые прописываются в директории /etc/conf.d/ и располагаются в директории /etc/init.d/.

В отличии от того же systemd, писать конфиг нужно с использованием bash, гибко, но придется в прямом смысле «отлаживать» запуск и состояние сервисов. Любой конфиг может иметь процедуры: depend (), start (), stop (). Пример такого конфига для start, stop:

image-loader.svg

Попробуем поменять систему инициализации на уже установленной системе Debian 11 и Kali Linux 2021.3.

Практика

Для практики будем использовать Kali Linux, операционная система по сути является Debian, как утверждает официальная документация, подсистема инициализации этого дистрибутива — systemd. Проверим это, выполнив команду:

cat /proc/1/comm

Так же можно запустить команду:

ls -l /sbin/ | grep init

image-loader.svg

Команда запущена именно так не случайно, для Debian pid 1 используется для процесса, в котором работает подсистема инициализации, для дополнительного так же представлена значение symlink.

Для Debian 11 приведенные выше картинки будут аналогичными, по-умолчанию эта система работает именно с systemd.

Существует 2 вида установки инициализирующей системы — на этапе установки ОС, и путем установки нового пакета в уже работающей системе. Рассмотрим второй вариант. Будем разворачивать sysvinit, для Debian это была проприетарная система инициализации, поэтому замена не должна сказаться на работоспособности системы. В сети есть несколько инструкций как можно сделать подобную замену, включая официальную документацию для ОС, но выполнение всех команд приводит к запирпичиванию системы.

Основной причиной такого поведения может стать использование в качестве графической оболочки GNOME, поэтому для проведения таких можификаций могут рекомендовать использовать Xfce или аналоги.

К сожалению, так и не получилось заменить систему инициализации. Перепроверить поведение можно, если ввести следующие команды:

sudo apt-get -y install sysvinit-core
sudo shutdown -r now

Для ОС Kali Linux, которая базируется на более старой версии Debian, установка просто сломала систему, для Debian 11 все прошло еще интереснее, на данный момент для установки отсутствует пакет sysvinit-core, вместо него в репозиториях есть только systemd-sysv пакет. Этот пакет сделан как раз для того чтобы предоставить трамплин для системы со скриптами и конфигами в sysvinit для запуска systemd. Круг замкнулся, безопасно поменять ничего нельзя, изменения возможны только на этапе установки ОС? Ответ — нет, система по умолчанию устанавливает только systemd-sysv.

На этом наши «вредные эксперименты» подошли к концу. Также хочу пригласить всех желающих на бесплатный двухдневный интенсив, который мы подготовили в рамках старта курса Administrator Linux. Professional. В рамках первого дня интенсива мы настроим простой роутер на Linux для дома, а во второй день поговорим про протоколы динамической маршрутизации.

Узнать подробнее о программе интенсива и записаться можно по ссылкам ниже.

© Habrahabr.ru