Команды сопровождения
НАЗВАНИЕ
СИНТАКСИС
ОПИСАНИЕ
Определение уровня выполнения
Процесс init и загрузка системы
Затем процесс init ищет запись initdefault в файле /etc/inittab (см. inittab(4) ). Если запись initdefault :
существует Процесс init обычно использует уровень выполнения, указанный в этой записи, как начальный уровень, на который надо перейти.
не существует (или не существует файла /etc/inittab) Процесс init просит пользователя ввести уровень выполнения с системной консоли.
Если начальный уровень выполнения:
Добавление записей в inittab
Изменения уровня выполнения
Файл /etc/defaults/init
Для перечисленных ниже переменных в файле /etc/default/init можно задать стандартные значения. Например: TZ=US/Pacific
LC_CTYPE Описательная информация о наборе символов.
LC_MESSAGES Язык сообщений.
LC_MONETARY Информация о форматировании денежных величин.
LC_NUMERIC Информация о форматировании чисел.
LC_TIME Информация о формате времени.
LC_ALL Если значение задано, все остальные переменные среды LC_* его наследуют.
Если для службы init отдельной записи нет, будет использована запись для службы » other «.
/etc/inittab контролирует управление процессами, которое осуществляет init
/var/adm/utmpx информация о доступе пользователей и администрировании
/var/adm/wtmpx хронология доступа пользователей и администрирования
/dev/console устройство системной консоли
/etc/default/init переменные среды.
АТРИБУТЫ
Описание следующих атрибутов см. на странице справочного руководства attributes(5):
| ТИП АТРИБУТА | ЗНАЧЕНИЕ АТРИБУТА |
| Доступен в пакете | SUNWcsu |
ССЫЛКИ
Процессы init и telinit может запускать только привилегированный пользователь.
Последнее изменение: 22 февраля 1999 года
Copyleft (no c) 2003 В. Кравчук, OpenXS Initiative, перевод на русский язык
Команда init в Linux с примерами
Главное меню » Linux » Команда init в Linux с примерами
Уровни выполнения – это состояние init, в котором определена группа процессов, запускаемых при запуске ОС. Процесс, порожденный init для каждого из этих уровней запуска, определяется в файле /etc/inittab. На каждом уровне выполнения определенное количество остановленных или запущенных служб. Условно семь уровней выполнения существуют числами от нуля до шести.
Стандартные уровни выполнения для распространения на основе Red Hat:
или разрешить вход без полномочий root
По умолчанию большая часть системы на основе LINUX загружается на уровень выполнения 3 или уровень выполнения 5. В дополнение к стандартным уровням выполнения пользователи могут изменять предустановленные уровни выполнения или даже создавать новые в соответствии с требованиями. Уровни выполнения 2 и 4 используются для определенных пользователем уровней выполнения, а уровни выполнения 0 и 6 используются для остановки и перезагрузки системы.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Исследуем процесс загрузки Linux
(C) В.А.Костромин, 2007
(версия файла от 03.10.2007 г.)
Этап 5: Процесс init и файл /etc/inittab
Init отвечает за продолжение процедуры загрузки, и перевод системы от начального состояния, возникающего после загрузки ядра, в стандартное состояние обработки запросов многих пользователей. Основная задача, которая стоит перед init, заключается в том, чтобы запускать в определенной последовательности другие программы в процессе загрузки системы и останавливать процессы в случае переключения уровня выполнения (в частности, при остановке системы). Init выполняет еще массу различных операций, необходимых для дальнейшей работы системы: проверку и монтирование файловых систем, запуск различных служб (демонов), запуск процедур логирования, оболочек пользователей на различных терминалах и т.д. Но, прежде чем рассматривать работу процесса init более детально, нужно сказать несколько слов о стилях загрузки и так называемых «уровнях выполнения».
5.1. Уровни выполнения
| Уровень | Slackware | Red Hat |
|---|---|---|
| 0 | остановка системы | остановка системы |
| 1 | однопользовательский режим | однопользовательский режим |
| 2 | использование не регламентировано | многопользовательский режим без NFS (то же, что и 3, если компьютер не работает с сетью) |
| 3 | многопользовательский режим | полный многопользовательский режим |
| 4 | запуск системы в графическом режиме (X11 с KDM/GDM/XDM) | использование не регламентировано |
| 5 | использование не регламентировано | запуск системы в графическом режиме |
| 6 | перезагрузка системы | перезагрузка системы; |
В некоторых дистрибутивах (например, в Debian), кроме того, используется дополнительный уровень S (или s) — примерно то же, что и однопользовательский режим, но S и s используются в основном в скриптах.
Как видите, уровни 0, 1 и 6 зарезервированы для особых случаев. Относительно того, как использовать уровни со 2 по 5, единого мнения не существует. Некоторые системные администраторы используют разные уровни для того, чтобы задать разные варианты работы, например, на одном уровне запускается графический режим, на другом работают в сети и т. д. Вы можете сами решить, как использовать разные уровни для создания разных вариантов загрузки. Но для начала проще всего воспользоваться тем способом определения разных уровней, который был задан при установке.
Если вам нужно узнать, на каком уровне выполнения работает ваша система, то можно воспользоваться командой runlevel. Будучи запущенной без параметров, она сообщает предыдущий и текущий уровень выполнения в виде двух цифр (лучше сказать символов, потому что существуют уровни S и s), разделенных пробелом. Если уровень выполнения не изменялся, то первый символ (идентифицирующий предыдущий уровень) примет значение N.
5.2. Файл inittab
Конфигурационный файл /etc/inittab состоит из отдельных строк. Если строка начинается со знака # или пуста, то она игнорируется. Все остальные строки состоят из 4 полей, разделенных двоеточиями:
Кодовое слово respawn заставляет init запустить команду, которая указана в этой строке и, если вызванная программа завершает работу, запустить ее снова. Возьмем, например, следующую строку в файле inittab:
означает, что init при переходе на 5-ый уровень запустит на выполнение команду /etc/rc.d/rc 5 и будет ожидать окончания работы этой программы прежде чем приступить к чему-либо другому.
Этот список не является исчерпывающим. Более подробно о файле inittab можно узнать из man-страниц init (8), inittab (5) и getty (8).
5.3. Стили начальной загрузки
А теперь давайте вспомним, что существует два разных стиля начальной загрузки операционной системы типа UNIX, происхождение которых уходит корями в историю развития UNIX-систем: так называемый стиль BSD (используемый также в таких системах как FreeBSD, NetBSD и OpenBSD), и стиль System V (или стиль ATT). Различие между ними проявляется в организации и размещении стартовых сценариев (скриптов), обеспечивающих управление процессами загрузки системы. В классических BSD-системах эти файлы хранятся в каталоге /etc и их имена начинаются с префикса «rc». В системах семейства System V файлы сценариев располагаются в каталоге /etc/init.d, а ссылки на них созданы в каталогах /etc/rc0.d, /etc/rc1.d и т.д. Как пишет В.Попов в статье [42] главное отличие стиля BSD от стиля System V состоит в организации скриптов rc: если в системах стиля System V вызывается один и тот скрипт rc, только ему передается параметр, задающий уровень выполнения, то для систем BSD-стиля характерно наличие отдельного скрипта для каждого из уровней выполнения. Вариант организации в стиле System V является более четким и позволяет аккуратнее выполнять останов системы. Если вы хотите подробнее узнать о различиях в двух названных стилях загрузки, прочитайте главу 2 книги [41] или статьи [42]-[45].
Большая часть дистрибутивов Linux использует на этапе загрузки стиль System V. К этому классу относятся Debian, все клоны Red Hat, включая Mandrake и российские дистрибутивы ASPlinux и ALT Linux. В стиле BSD организована загрузка в дистрибутивах Gentoo, Slackware (см. [43]-[45]) и производных последнего). Однако тот или иной стиль сценариев начальной загрузки выдерживается не очень четко. Поскольку стиль System V взят за основу при создании стандарта LSB (Linux Standart Base), дистрибутивы, ранее использовавшие стиль BSD, в последнее время заботятся о совместимости с System V. Slackware обеспечивает такую совместимость начиная с версии 7.0.
Структура каталогов, в которых хранятся инициализационные скрипты, в основных дистрибутивах существенно различается:
| Fedora (Red Hat) и Mandriva 2007 |
| Knoppix (клон Debian) |
| Slackware |
| Gentoo |
| SuSE |
Как видите, даже в Red Hat и Debian, которые следуют стилю System V, структура каталогов несколько отличается. А SuSE, хотя и происходит от Slackware, движется в сторону стиля System V, по крайней мере в организации структуры каталогов. А вот Red Hat, наоборот, завел скрипт rc.local, напоминающий одноименный сценарий во FreeBSD. В процессе загрузки он выполняется последним. Правда, в последних версиях Red Hat и Fedora Core этот скрипт «пустой», то есть практически не используется. И авторы книги [41] не советуют добавлять в него собственные команды, рекомендуя лучше воспользоваться средствами System V.
| Fedora Core (Red Hat) |
| Knoppix (клон Debian) |
| Slackware |
| Gentoo |
| SuSE |
При использовании стиля System V используется один и тот же скрипт перехода на заданный уровень, а то, что он делает, определяется содержимым каталога /etc/rc.d/rcN.d. Этот каталог содержит перечень ссылок на скрипты запуска тех системных сервисов, которые должны работать на уровне N. Сами скрипты размещаются в каталоге /etc/init.d или /etc/rc.d/init.d.
В отличие от стиля System V в BSD-стиле каждому уровню загрузки соответствует свой сценарий. И сначала всегда происходит переход на уровень S (однопользовательский), а затем уже переход на заданный уровень. Стиль BSD в наиболее чистом виде (из рассматриваемых примеров) представлен в дистрибутиве Slackware.
Поскольку стиль System V взят за основу при создании стандарта LSB (Linux Standart Base), дистрибутивы, ранее использовавшие стиль BSD, в последнее время заботятся о совместимости с System V. Slackware обеспечивает такую совместимость начиная с версии 7.0. Достигается это путем использования сценария rc.sysinit, который производит поиск всех сценариев стиля System V в каталоге /etc/rc.d и выполнит их, если уровень загрузки соответствующий. Это полезно, если вы пользуетесь коммерческим программным обеспечением, которое ориентируется на стиль System V. В то же время, вы можете пользоваться и BSD сценариями.
5.4. Действия, выполняемые процессом init
Для примера возьмем файл inittab из дистрибутива ASP Linux 11, то есть будет рассматриваться процедура начальной загрузки в стиле System V.
Листинг 10. Файл /etc/inittab системы ASP Linux 11.
Обработка файла /etc/inittab процессом init начинается в однопользовательском режиме (уровень 1), в котором единственным пользователем является root, работающий с консоли. Первым делом init находит строку, которая определяет, какой уровень выполнения запускается по умолчанию:
Это и будет тот уровень, в котором запустится и будет работать система после загрузки, поэтому естественно, что нельзя указывать в строке initdefault уровни 0 и 6.
После этого процесс init просматривает файл /etc/inittab и выполняет скрипты, соответствующие однопользовательскому уровню (1 во втором поле строки):
всем уровням (строки с пустым вторым полем):
и уровню, заданному по умолчанию:
Как видим, вначале вызывается скрипт rc из каталога /etc/rc.d. Какой бы уровень выполнения не был задан, вызывается один и тот скрипт, только в зависимости от уровня выполнения ему передается соответствующее значение параметра вызова, так что, например, для 3-го уровня вызов скрипта осуществляется с параметром 3.
Следующая важная функция, которую выполняет этот процесс (на уровнях со 2 по 5) — запуск шести виртуальных консолей (процессов getty), чтобы предоставить пользователям возможность регистрироваться в системе с терминалов. В нашем примере запускается только 3 виртуальных консоли, поскольку еще 3 строки в файле /etc/inittab закомментированы (я сделал это в целях экономии системных ресурсов, мне вполне хватает трех консолей).
Таким образом, процесс начальной загрузки init постоянно находится в оперативной памяти и при получении соответствующих сигналов повторно выполняет цикл чтения из файла /etc/inittab инструкций о том, что нужно делать, причем этот набор инструкций различен для разных уровней выполнения.
Когда суперпользователь останавливает систему (командой shutdown ), именно init завершает все другие исполняющиеся процессы, размонтирует все файловые системы и останавливает процессор.
К вопросу о том, что делает процесс init после завершения процесса загрузки системы, нам, видимо, еще придется вернуться, а пока обратимся к разбору инициализационных скриптов.
Если вы некорректно модифицируете файл /etc/inittab, система может перестать загружаться. Так что перед внесением каких-либо изменений в этот файл по меньшей мере запаситесь загрузочной дискетой и сохраните копию исходного файла на случай фатальных ошибок.
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».
Системы инициализации 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 используются в вашем дистрибутиве? В списке обозначены не все существующие системы, какую из них нужно добавить в список? Напишите в комментариях!

