Для чего нужна служба init linux
Процесс INIT — это движущая сила, которая обеспечивает работу компьютера под управлением Linux
Сейчас существует несколько способов реализации процесса «init». Вы можете использовать классическую программу Микеля ван Смаренбурга, которая поставляется с модулем SysVinit, simpleinit Питера Орбака (его можно найти среди модулей приложений util-linux), или простой шелловский скрипт (например, тот, который приведен в этой статье, правда, он обладает гораздо меньшими возможностями, чем любое приложение языка С).
Если Вы настраиваете ограниченную изолированную систему, можно выбрать любое приложение, которое будет использоваться в качестве процесса «init». Некоторые мазохисты, которым не нравится многозадачность, могут даже перенести command.com на Linux и запустить его в качестве процесса «init», хотя Вам никогда не удастся ограничить себя 640 Kb оперативной памяти, пока загружен кернел Linux.
Вне зависимости от того, какую программу Вы выбрали, доступ к ней должен осуществляться по пути /sbin/init, /etc/init или /bin/init, так как именно эти пути жестко скомпиллированы в кернел. Если ни одна из этих программ не может быть найдена и запущена на выполнение, система считается неисправной и кернел порождает шелл администратора системы, пользователя root, чтобы дать возможность исправить ситуацию (таким образом, в качестве процесса «init» используется шелл /bin/sh).
Для достижения максимальной гибкости разработчики кернела предоставили возможность выбирать другой, альтернативный путь для запуска процесса «init». Кернел воспринимает командную строку «init=» именно для этой цели. Параметры кернела могут быть переданы интерактивно во время загрузки, либо можно использовать команду «append=» в файле /etc/lilo.conf. Silo, Milo, Loadlin и другие загрузчики также позволяют передавать некоторые параметры кернелу.
Как Вы уже догадываетесь, простейший путь для получения прав доступа супервизора системы и его администратора на компьютере с ОС Linux — это напечатать строку «init=/bin/sh» в ответ на приглашение загрузчика LILO. Учтите, что это не является «прорехой» в безопасности системы, потому что настоящей угрозой безопасности системы является физический доступ к компьютеру и его системной консоли. Если Вы опасаетесь возможности ввода параметров «init=» в процессе загрузки, то сам загрузчик LILO может предотвратить возможность подобного несанкционированного управления при помощи защиты своим собственным паролем.
Задача процесса Init
Мы уже знаем, что имя «Init» не собственное, а, скорее, нарицательное, и его может использовать почти любая программа. Вопрос лишь в том, чем в самом деле должен заниматься «Init»? Будучи первым (и единственным) процессом, выполняемым кернелом, «Init» должен заботиться о запуске всех остальных процессов в системе, включая различные программы-демоны, используемые операционной системой, а также обеспечивать сеансы связи с текстовыми консолями. «Init» также должен перезапускать некоторые из своих порожденных процессов после завершения их работы. Обычно это касается всех сеансов связи через консоли. Как только Вы отключаетесь от системы, она должна вновь запустить программу getty, чтобы предоставить возможность следующего соединения. Кроме этого, «Init» заботится о мертвых процессах и отделывается от них. В соответствии с понятием процессов в UNIX, процесс не может быть удален из системной таблицы процессов, пока о его смерти не будет сообщено процессу, породившему данный процесс (или другому процессу-предку, в случае, если процесс-родитель больше не существует). В случае, если процесс прекращает работу после системного вызова exit, он остается в состоянии зомби-процесса, пока кто-нибудь не позаботится о нем. «Init», будучи предком любого другого процесса, должен собирать информацию о состоянии завершения каждого усыновленного зомби-процесса. Следует отметить, что грамотно написанная программа должна сама заботиться о всех порожденных собой процессах, зомби появляются только как следствие некорректного поведения программ. Если бы «Init» не собирал все зомби-процессы, то ленивые программисты легко и быстро исчерпали бы все системные ресурсы и компьютер с переполненной системной таблицей процессов просто завис бы.
Последняя задача «Init» — забота об отключении системы. Программа «Init» должна остановить все процессы и размонтировать все файловые системы, когда системный администратор решит, что пришло время выключать компьютер. Программа shutdown не делает ничего, она только сообщает процессу «Init», что все закончено.
Как видно, задача «Init» не так уж трудно выполнима, и простой шелловский скрипт может справиться с большинством из поставленных задач. Вспомним, что любой шелл сам прекрасно заботится о порожденных собой же процессах, так что забота об умерших потомках — не проблема для простого скрипта. Но настоящий «Init» должен заниматься контролем над поведением всей системы и выполнять его достаточно эффективно, надежно и быстро.
Использование /bin/sh в качестве минимального выбора
Как говорилось выше, шелл может использоваться в качестве программы «Init». Использование «голого»шелла (init=/bin/sh) просто открывает сеанс связи системного администратора на абсолютно несконфигурированном компьютере. Эта глава описывает, как скрипт шелла может выполнить все задачи, необходимые для работы системы в минимальной конфигурации. Этот вид упрощенной программы «Init» может использоваться в изолированных системах либо в случаях ограничения системных ресурсов, когда нужно экономить каждый бит памяти. Самым радикальным решением для изолированных систем является прямое использование конкретного приложения в качестве процесса «Init», в результате мы получим закрытую систему (без возможности взаимодействия с ее администратором, что, несомненно, вызовет проблемы), но иногда такая конфигурация удовлетворяет конкретным технологическим требованиям. Типичным примером системы Linux без реальной программы «Init» служит установочный диск с дистрибутивом операционной системы, в ней /sbin/init — это символьная ссылка на программу установки.
Продолжение следует
Алессандро РубиниLinux Journal, issue 55, November 1998, перевод Игоря Греня
Компьютерная газета. Статья была опубликована в номере 49 за 1998 год в рубрике soft :: unix
Системы инициализации Linux
В операционной системе Linux и других системах семейства Unix после завершения загрузки ядра начинается инициализация Linux системы, сервисов и других компонентов. За это отвечает процесс инициализации, он запускается ядром сразу после завершения загрузки, имеет PID 1, и будет выполняться пока будет работать система.
Процесс инициализации запускает все другие процессы, которые должны быть запущены, это родительский процесс для всего, что выполняется в системе. Другие процессы могут тоже создавать дочерние процессы, но если родительский процесс завершается, для его дочерних процессов родительским становится процесс инициализации.
Системы инициализации Linux
За время развития операционных систем были созданы различные системы инициализации Linux. В разных дистрибутивах использовались разные системы. В этой статье мы рассмотрим лучшие системы инициализации, которые вы можете сейчас использовать. Мы начнем с более старых систем с меньшим функционалом, чтобы понять с чего все начиналось, затем подойдем к более новым, созданным в последнее время.
1. System V Init
Почти все дистрибутивы Linux изначально использовали SysV. Исключением была только Gentoo, в которой использовалась собственная система инициализации и Slackware, с инициализацией в стиле BSD.
Основные возможности SysV:
Никакой параллельной загрузки, системы зависимостей, запуска по требованию и автоматического запуска здесь не было и в помине.
С момента ее разработки прошло много лет и из-за некоторых недостатков были разработаны другие системы для ее замены, они хоть и имели новые функции и были более эффективны, но они были по-прежнему совместимы с SysV.
2. OpenRC
Кроме стандартных возможностей SysV, здесь поддерживается также:
По сравнению с SysV тут появилось много новых возможностей, но все еще не все те, что нужны для оптимальной работы системы.
3. Systemd
Systemd очень сильно отличается от всех существующих систем инициализации, тем как она работает с сервисами, и даже конфигурационными файлами сервисов. Совместимости со скриптами SysV нет, их нужно преобразовать в linux systemd unit файлы.
Вот ее основные особенности:
4. Runinit
Здесь есть некоторые интересные особенности, которых нет в других системах инициализации:
5. Upstart
Это гибридная система инициализации, она использует как SysV скрипты запуска, так и файлы служб Systemd. Вот ее самые заметные особенности:
Большинство ее возможностей работают благодаря интеграции с системой инициализации Systemd. В последнее время всё меньше используются скрипты SysV init и всё больше применяются юнит файлы Systemd. Рано или поздно Systemd вытеснит и полностью заменит Upstart в Ubuntu.
Выводы
Как я уже говорил, система инициализации запускает и управляет всеми другими процессами в системе Linux. SysV до недавнего времени была основной системой инициализации в большинстве дистрибутивов Linux, но из-за некоторых своих недостатков для нее было разработано несколько замен, в том числе Systemd.
Какие системы инициализации Linux используются в вашем дистрибутиве? В списке обозначены не все существующие системы, какую из них нужно добавить в список? Напишите в комментариях!
Что именно делает init?
Я создаю дистрибутив Linux, и теперь мне нужна программа init. Я очень хорошо умею кодировать на c и знаю немного о linux (не так много, но я использую arch linux для разработки в течение 4 лет), поэтому я подумал, что должен попробовать написать свой базовый скрипт инициализации на C. просто интересно, какие задачи выполняет init для настройки системы на простую оболочку? (Когда я спрашиваю «что делает init?», Я знаю, что такое init и для чего он. Я просто не знаю, для каких задач он выполняет.)
Система 5 init расскажет вам лишь небольшую часть истории.
Есть какая-то близорукость, которая влияет на мир Linux. Люди думают, что они используют то, что называется «Система 5 init », и это то, что является традиционным, и лучшее место для старта. На самом деле это не так.
На самом деле, традиция не совсем такая, как говорят такие люди. Система 5 init и Система 5 rc относятся к AT & T UNIX System 5, которая была почти такой же далекой после первой UNIX, как мы сейчас (скажем) после первой версии Linux-Mandrake.
Еще одно десятилетие после UNIX System 5 появилась так называемая «традиционная» система инициализации Linux. В 1992 году Микель ван Смуренбург (пере) написал Linux init + rc и связанные с ним инструменты, которые люди теперь называют «Системой 5 init », хотя на самом деле это не программное обеспечение UNIX System 5 (и не только init ).
Существующие системы для изучения и изучения
Вот неполный список некоторых основных систем инициализации, отличных от этих двух, и один или два из их (нескольких) существенных моментов:
Что подводит нас к тому, что делают программы №1.
Что делают программы процесса № 1
Есть несколько вещей, которые различные ядра операционной системы и другие программы требуют от процесса № 1, от которого просто невозможно уйти.
Существуют также разовые задачи инициализации и финализации, от которых невозможно уйти или которые они сильно пострадают, например, монтирование файловых систем «API» или очистка кеша файловой системы.
«настроить систему на простую оболочку»
Как вы уже заметили, init=/bin/sh файловые системы «API» не монтируются, вылетает неуклюже, без сброса кеша при вводе exit ( https://unix.stackexchange.com/a/195978/5132 ) и вообще оставляет его (супер) пользователю вручную выполнить действия, которые делают систему минимально пригодной для использования.
Чтобы увидеть, что у человека на самом деле нет другого выбора, кроме как выполнять программы процесса № 1, и, таким образом, выбрать правильный курс для достижения заявленной цели проектирования, лучше всего посмотреть на совпадения в работе рунита Геррита Папе, Феликса фон Минит Лейтнера и system-manager программа из пакета nosh. Первые два показывают две попытки быть минималистскими, но все же работают с вещами, которых невозможно избежать.
Последнее полезно, как я полагаю, для обширного ручного ввода для system-manager программы, в котором подробно описывается, какие файловые системы «API» монтируются, какие задачи инициализации выполняются и какие сигналы обрабатываются; в системе, которая по замыслу имеет системного менеджера, просто порождает три другие вещи (диспетчер служб, сопровождающий регистратор и программу для запуска изменений состояния) и выполняет только неизбежное в процессе # 1.
7. Сценарии инициализации¶
Уровни запуска¶
Процесс загрузки системы¶
При загрузке вашей системы по экрану пробегает много текста. Если присмотреться, заметно, что этот текст не меняется от загрузки к загрузке. Последовательность всех этих действий называется последовательностью загрузки и в той или иной степени постоянна.
Сценарии инициализации¶
Как работает init¶
Теперь init проверяет свой конфигурационный файл, чтобы определить, какой уровень запуска использовать. Для этого из /etc/inittab считывается строка:
В приведенном примере (который подходит для подавляющего большинства пользователей Calculate) номер уровня запуска — 3. Пользуясь этой информацей, init проверяет, что нужно выполнить для запуска уровня запуска 3. Пример уровней запуска:
Что такое уровень запуска?¶
Как вы заметили, init применяет нумерацию для определения уровня запуска, который надо использовать. Уровень запуска — это то состояние, в котором запускается ваша система; он содержит набор сценариев (сценариев уровня запуска или сценариев инициализации [initscript]), которые следует выполнять при входе и выходе из определенного уровня запуска.
В Calculate определено семь уровней запуска: три служебных и четыре определяемых пользователем. Служебные называются sysinit, shutdown и reboot. Действия, совершаемые ими, в точности соответствуют их названиям: инициализация системы, выключение системы и ее перезагрузка.
Работа со сценариями инициализации¶
Примечание: Останавливаются или перезапускаются только те службы, которым необходима данная служба. Остальные зависимые службы (те, которые используют службу, но не нуждаются в ней) эта операция не затрагивает.
Наконец, можно просмотреть список служб, требующихся для данной, но отсутствующих в системе. Пример запроса списка служб, необходимых Postfix, но отсутствующих:
Использование rc-update¶
Что такое rc-update?¶
Система инициализации Calculate использует дерево зависимостей для определения служб, которые запускаются в первую очередь. Т. к. это очень утомительное занятие, и мы не хотели, чтобы пользователь занимался этим вручную, были разработаны инструменты, упрощающие управление уровнями запуска и сценариями инициализации.
Добавление и удаление служб¶
В процессе установки Calculate вы могли добавлять сценарии инициализации в уровень запуска «default». В тот момент вы, возможно, не имели понятия, что такое «default» и зачем он нужен, но теперь вы это знаете. Сценарию rc-update требуется второй аргумент, определяющий действие: add (добавить), del (удалить) или show (показать).
По команде rc-update show выводится список всех доступных сценариев с указанием соответствующих уровней запуска. Пример получения информации о сценариях инициализации:
Настройка служб¶
Почему нужна дополнительная настройка?¶
Сценарии инициализации могут быть весьма сложны. Поэтому нежелательно допускать непосредственное редактирование сценария пользователями, т.к. это может привнести в систему множество ошибок. Но, с другой стороны, необходимо правильно настроить службу. Например, может понадобиться передать службе дополнительные параметры.
Вторая причина, по которой настройки хранятся отдельно от самого сценария — это возможность обновления сценария без опасения, что все ваши настройки будут утеряны.
Каталог /etc/conf.d¶
Такие файлы настроек содержат одни переменные (наподобие /etc/make.conf), облегчая настройку служб. Это также позволяет нам давать больше информации о переменных (в комментариях).
Написание сценариев инициализации¶
Мне тоже придется. ¶
Нет, написание сценариев инициализации обычно не требуется, т.к. Calculate содержит готовые сценарии для всех поддерживаемых служб. Однако, вы можете установить какую-либо службу, не используя систему Portage; в таком случае, вероятно, вам придется создавать сценарий инициализации самостоятельно.
Структура¶
Основная структура сценария инициализации показана ниже.
Зависимости¶
Виртуальная зависимость — это зависимость от функций, предоставляемых службой, но не какой-то единственной службой. Сценарий может зависеть от службы системного журнала, но таких достаточно много (metalogd, syslog-ng, sysklogd и т.п.). Поскольку нельзя нуждаться в каждой из них (ни в одной корректно работающей системе они не запущены все сразу), мы обеспечили предоставление виртуальной зависимости всеми этими службами.
Давайте взглянем на информацию о зависимостях postfix:
Как можно увидеть, postfix:
Порядок запуска¶
Иногда вам нужна не сама служба, а запуск вашей службы до (или после) другой службы, если та присутствует в системе (обратите внимание на условие: это уже не зависимость) и запускается на том же уровне запуска (отметьте условие: это относится только к службам из одинакового уровня запуска). Такую очередность можно указать, используя значения before (до) или after (после).
Например, рассмотрим значения для службы Portmap. Пример функции depend() службы Portmap:
Также можно использовать знак «*», чтобы охватить все службы данного уровня запуска, хотя это не рекомендуется. Пример запуска сценария первым на уровне запуска:
Стандартные функции¶
Синтаксис сценариев инициализации, применяемых в Calculate, основан на оболочке Борна (Bourne Again Shell — bash), поэтому вы можете свободно использовать внутри своих сценариев bash-совместимые конструкции.
Добавление дополнительных параметров¶
Переменные для настройки служб¶
Для поддержки конфигурационного файла в каталоге /etc/conf.d ничего дополнительно делать не нужно: при запуске вашего сценария инициализации автоматически включаются следующие файлы (т.е., переменные из них становятся доступны):
Если ваш инициализационный сценарий предоставляет виртуальную зависимость (например, net ), то также включается файл, соответствующий этой зависимости (например, /etc/conf.d/net ).
4.e. Изменение поведения уровней запуска
Кто от этого выиграет?¶
Например вы можете создать второй загружаемый уровень запуска «по умолчанию», в котором будут другие сценарии. Затем при загрузке вы сможете выбрать, какой из уровней по умолчанию следует использовать.
Использование программного уровня (softlevel)¶
Использование загрузочного уровня (bootlevel)¶
Использование загрузочного уровня полностью аналогично использованию программного уровня. Единственная разница состоит в том, что вы определяете второй уровень «boot» вместо «default».
Команда init в Linux с примерами
Главное меню » Linux » Команда init в Linux с примерами
Уровни выполнения – это состояние init, в котором определена группа процессов, запускаемых при запуске ОС. Процесс, порожденный init для каждого из этих уровней запуска, определяется в файле /etc/inittab. На каждом уровне выполнения определенное количество остановленных или запущенных служб. Условно семь уровней выполнения существуют числами от нуля до шести.
Стандартные уровни выполнения для распространения на основе Red Hat:
или разрешить вход без полномочий root
По умолчанию большая часть системы на основе LINUX загружается на уровень выполнения 3 или уровень выполнения 5. В дополнение к стандартным уровням выполнения пользователи могут изменять предустановленные уровни выполнения или даже создавать новые в соответствии с требованиями. Уровни выполнения 2 и 4 используются для определенных пользователем уровней выполнения, а уровни выполнения 0 и 6 используются для остановки и перезагрузки системы.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.