Система 5 init
расскажет вам лишь небольшую часть истории.
Есть какая-то близорукость, которая влияет на мир Linux. Люди думают, что они используют то, что называется «Система 5 init
», и это то, что является традиционным, и лучшее место для старта. На самом деле это не так.
На самом деле, традиция не совсем такая, как говорят такие люди. Система 5 init
и Система 5 rc
относятся к AT & T UNIX System 5, которая была почти такой же далекой после первой UNIX, как мы сейчас (скажем) после первой версии Linux-Mandrake.
Только первое издание UNIX имело init
. Не было rc
. Язык ассемблера 1-го издания init
( чей код был восстановлен и доступен Уорреном Туми и др. ) Непосредственно породил 12 getty
процессов, смонтировал 3 встроенные файловые системы из встроенной таблицы и непосредственно запустил программу из домашнего каталога пользователь по имени mel
. getty
Стол был также непосредственно в образе программы.
Еще одно десятилетие после UNIX System 5 появилась так называемая «традиционная» система инициализации Linux. В 1992 году Микель ван Смуренбург (пере) написал Linux init
+ rc
и связанные с ним инструменты, которые люди теперь называют «Системой 5 init
», хотя на самом деле это не программное обеспечение UNIX System 5 (и не только init
).
Система 5 init
/ rc
- не лучшее место для старта, и даже если добавить знания о systemd, которые не покрывают половину того, что нужно знать. В области проектирования систем инициализации (для Linux и BSD) было проделано много работы только за последние два десятилетия. Все виды инженерных решений были обсуждены, приняты, спроектированы, реализованы и реализованы на практике. Коммерческие Unices тоже многое сделали.
Существующие системы для изучения и изучения
Вот неполный список некоторых основных систем инициализации, отличных от этих двух, и один или два из их (нескольких) существенных моментов:
- Конец Иоахима Нильссона пошел по пути использования более удобочитаемого файла конфигурации.
- Минит Феликса фон Лейтнера был направлен на создание системы конфигурации «файловая система - база данных», небольшие объемы памяти и зависимости «старт / стоп» среди всего, что
init
начинается.
- Рунит Геррита Пейпа был основан на том, что я ранее описал как подход «только порождающий четыре сценария оболочки» .
- Цель InitNG - иметь зависимости, именованные цели, несколько файлов конфигурации и более гибкий синтаксис конфигурации с целой загрузкой большего количества параметров для дочерних процессов.
- upstart пошел на полную модернизацию, моделируя систему вовсе не как сервисы и взаимозависимости, а как события и задания, вызванные ими.
- Конструкция nosh включает вытеснение всего управления службами (включая даже
getty
порождение и зомби) в отдельный диспетчер служб и просто обработку специфичных для операционной системы устройств / символических ссылок / каталогов / каталогов и системных событий.
- Синит это очень простой инициат. Он выполняет
/bin/rc.init
чью работу - запускать программы, монтировать файловую систему и т. Д. Для этого вы можете использовать что-то вроде minirc .
Более того, около 10 лет назад среди пользователей daemontools и других пользователей обсуждалась возможность использования в svscan
качестве процесса № 1, что привело к таким проектам, как svscan Пола Жарка в качестве исследования процесса 1 , идеи Геррита Папе и svscan Лорана Берко в качестве процесса 1 .
Что подводит нас к тому, что делают программы №1.
Что делают программы процесса № 1
Представления о том, что процесс «1» должен делать, по своей природе субъективны. Значимым объективным критерием разработки является то, что должен делать процесс № 1 как минимум . Ядро предъявляет к нему несколько требований. И всегда есть некоторые специфические для операционной системы вещи разных видов, которые она должна делать. Когда дело доходит до того, что процесс № 1 традиционно выполнял, то мы не достигли такого минимума и никогда не были на самом деле.
Есть несколько вещей, которые различные ядра операционной системы и другие программы требуют от процесса № 1, от которого просто невозможно уйти.
Люди скажут вам, что fork()
создание вещей и выступление в роли родителя осиротевших процессов является основной функцией процесса # 1. Как ни странно, это не соответствует действительности. Работа с потерянными процессами является (с последними ядрами Linux, как объяснено на https://unix.stackexchange.com/a/177361/5132 ) частью системы, которую можно в значительной степени выделить из процесса № 1 в другие процессы, такие как выделенный менеджер по обслуживанию . Все это сервис-менеджеры, которые работают с процессом № 1:
Точно так же, как объяснено в https://superuser.com/a/888936/38062 , вся /dev/initctl
идея не должна быть рядом с процессом # 1. По иронии судьбы, именно высокоцентрализованный systemd демонстрирует, что его можно вывести из процесса # 1.
И наоборот, обязательные вещи для init
, что люди обычно забывают в их вне-топ-оф-головки конструкции, такие вещи, как обработка SIGINT
, SIGPWR
, SIGWINCH
и так далее отправляется из ядра и введения в действие различные запросы на изменение состояния системы , посланные из программ, которые «знают», что определенные сигналы для обработки # 1 означают определенные вещи. (Например: как объяснено на https://unix.stackexchange.com/a/196471/5132 , наборы инструментов BSD «знают», что SIGUSR1
имеет особое значение.)
Существуют также разовые задачи инициализации и финализации, от которых невозможно уйти или которые они сильно пострадают, например, монтирование файловых систем «API» или очистка кеша файловой системы.
Основы работы с файловыми системами «API» мало чем отличаются от работы с init
1-й редакцией UNIX: у каждого есть список информации, встроенной в программу, а у одного просто mount()
все записи в списке. Вы найдете этот механизм в таких разнообразных системах, как BSD (sic!) init
, Через nosh system-manager
, для systemd.
«настроить систему на простую оболочку»
Как вы уже заметили, init=/bin/sh
файловые системы «API» не монтируются, вылетает неуклюже, без сброса кеша при вводе exit
( https://unix.stackexchange.com/a/195978/5132 ) и вообще оставляет его (супер) пользователю вручную выполнить действия, которые делают систему минимально пригодной для использования.
Чтобы увидеть, что у человека на самом деле нет другого выбора, кроме как выполнять программы процесса № 1, и, таким образом, выбрать правильный курс для достижения заявленной цели проектирования, лучше всего посмотреть на совпадения в работе рунита Геррита Папе, Феликса фон Минит Лейтнера и system-manager
программа из пакета nosh. Первые два показывают две попытки быть минималистскими, но все же работают с вещами, которых невозможно избежать.
Последнее полезно, как я полагаю, для обширного ручного ввода для system-manager
программы, в котором подробно описывается, какие файловые системы «API» монтируются, какие задачи инициализации выполняются и какие сигналы обрабатываются; в системе, которая по замыслу имеет системного менеджера, просто порождает три другие вещи (диспетчер служб, сопровождающий регистратор и программу для запуска изменений состояния) и выполняет только неизбежное в процессе # 1.