При изучении операционной системы 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). Он может иметь собственные характеристики, которые определяют тип. Несколько типов модулей:

  • служба

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

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

  • сокет

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

  • таймер

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

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

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

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

sysvinit

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

OpenRC

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

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

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

Практика

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

cat /proc/1/comm

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

ls -l /sbin/ | grep init

Команда запущена именно так не случайно, для 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 для дома, а во второй день поговорим про протоколы динамической маршрутизации.

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

Комментарии (17)


  1. hellamps
    10.01.2022 18:41
    +3

    О чем статья?

    https://wiki.debian.org/Init#Changing_the_init_system_-_on_a_running_system - это точно не работает?


    1. hellamps
      10.01.2022 18:58

      проверил, там надо еще чуть пакетов скачать: initscripts и sysv-rc, но в целом работает.


      1. GolovinDS Автор
        10.01.2022 19:18
        -3

        Статья как раз показывает что будет, если следовать официальному алгоритму. Здорово, что разобрались и добавили отсутствующие элементы.


  1. Shaz
    10.01.2022 19:13
    +4

    Взяли и внезапно оторвали статью на самом интересном месте. А как же разбор что именно там идёт не так? А как же сутки компиляции из исходников и наложение своих патчей?


    1. hellamps
      10.01.2022 19:15

      да ни в чем, просто менять этот инит надо было уже из скачанных пакетов в systemd rescue режиме, но... до этого дело, похоже, не дошло :)


    1. mapron
      10.01.2022 19:33

      «в статье больше рекламы чем пользы».


  1. nkretov
    10.01.2022 21:38

    эзотерика какая-то.


  1. trokhymchuk
    10.01.2022 23:07
    +3

    Для практики будем использовать Kali Linux

    А можно поинтересоваться, чего так?

    Основной причиной такого поведения может стать использование в качестве графической оболочки GNOME

    Нет, основной причиной может стать тот факт наличия второго инита, что не является штатной работой, которая не протестирована пользователями. Кроме этого сисв ещё и поддерживается по остаточному принципу, разработчики не требуют, чтобы пакеты включали инит-скрипты для этого инита.

    К сожалению, так и не получилось заменить систему инициализации

    Лол, а вы думали, что это как два к двум прибавить? Инит система --- второй по важности элемент дистрибутива. Если ядро --- сердце, то инит --- мозг (аналогия с человеческим телом сложна, может, и печень, ну, надеюсь, важность я смог передать).

    Debian 11 все прошло еще интереснее, на данный момент для установки отсутствует пакет sysvinit-core

    Что? https://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=sysvinit-core

    Круг замкнулся, безопасно поменять ничего нельзя, изменения возможны
    только на этапе установки ОС? Ответ - нет, система по умолчанию
    устанавливает только systemd-sysv.

    В вики написано, как установить отличную от системд инит-систему.

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

    И этому будут обучены люди? Это шутка какая-то? Может, стоило рассказать про, не знаю, недавно вышел Cockpit, вещь интересная, касается администрации линукс-систем, я бы с радостью почитал обзор и, уверен, это было бы куда полезнее "мы пытаемся менять инит-систему".


    1. hellamps
      10.01.2022 23:20
      +2

      зря вы так, мне уже за вики в карму накидали будь здоров, а я тоже повелся, аж поставил с нуля булзай, чтоб проверить этот интересный вывод про дебиан 11...

      Чем больше таких специалистов - тем лучше наша job security.


      1. trokhymchuk
        10.01.2022 23:37
        +2

        Не хочу я такую job security, во вред сообщества (знаете, сколько кали-тем на ЛОРе). Да и лично мне гораздо интереснее учить что-то новое для того, чтобы оставаться конкурентноспособным, а не закрывать глаза на.

        Ну и за ресурс обидно, ведь есть качественные, грамотные, интересные статьи, а не попытка поставить другой инит на кали, инструкцией из дебиана.


        1. hellamps
          11.01.2022 02:16
          +1

          давным давно, когда я был в школе, у нас был интересный персонаж из учительского состава, который открывал в волков коммандере ком файл, менял там какой-нибудь байт и смотрел что будет. Ну а что, у самурая есть только путь...


  1. rPman
    10.01.2022 23:29

    А какая система запуска используется внутри initramfs, ведь в ней почти полноценная операционная система, в некоторых случаях ее в принципе и хватит (туда можно интегрировать ssh сервер и запускать свое приложение)?


    1. lorc
      11.01.2022 01:45
      +1

      Кто как. Местами — тот же systemd. Местами BusyBox'овская имплементация SystemV Init.


  1. ALiEN175
    11.01.2022 01:33
    +4

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

    Ожидание: подмена init, грязные хаки, kernel panic.
    Реальность: ну типа вот… есть там типа sysv, systemd… всё такое… ЭЭЭ… ЫЫЫ… Вот держите рекламную ссылку.
    И при чём тут вообще Кali? Kali и Debian — это разные дистрибутивы.

    *Тут должен быть мем с недорисованным конём*


    1. lorc
      11.01.2022 01:48
      +1

      Угу. Даже до старого прикола с init=/bin/sh не дошли. Система у них окирпичивается...


  1. Zhbert
    11.01.2022 10:38
    +3

    Для практики будем использовать Kali Linux, операционная система по сути является Debian

    Нет. Кали — это склееный на соплях комбайн, предназначенный ТОЛЬКО для пентестов и работы с флешки, о чем пишут сами разработчики на официальном сайте. Он НЕ ПРЕДНАЗНАЧЕН ни для экспериментов, ни для обучения, ни для установки в качестве рабочей ОС, ибо падает и разваливается, если попытаться его даже просто обновить. Не учите плохому, и так полно каликакеров, которые потом идут в сообщество и не могут даже консоль открыть, когда их о чем-то спрашивают.


    1. GolovinDS Автор
      11.01.2022 12:32
      +1

      Это всего лишь эксперимент, показанный на практике. Но в любом случае спасибо за комментарии. Сделаю выводы на будущее)