Новая система инициализации RHEL 6

Классическая схема инициализации System V, на которой базировались дистрибутивы RedHat Enterprise Linux до шестой версии, была привычной и довольно простой для понимания: init описывал весь процесс загрузки в своем конфигурационном файле «/etc/inittab», откуда вызывались другие программы и скрипты на определенном этапе запуска.
В RHEL 6 ситуация поменялась: на смену System V пришел Upstart, что несколько изменило процедуру конфигурации процесса загрузки операционной системы. Upstart, который изначально разрабатывался для Ubuntu, довольно неплохо вписался и в RedHat системы, заменив собой только часть привычной схемы запуска.
Тем не менее, изменения существенные и мало документированные, поэтому в этой статье я постараюсь внести ясность в новую схему загрузки, и что она привнесла.

Первое, что бросается в глаза — это практически пустой «/etc/inittab»: в нем осталась единственная не закомментированная строка, которая указывает на уровень выполнения по умолчанию. Сами уровни выполнения не изменились: третий уровень все так же соответствует обычному многопользовательскому режиму, а на пятом запускается еще и графический сервер.
Строка имеет привычный вид:

id:5:initdefault:

Здесь «5» — уровень выполнения по умолчанию, т.е. данная инсталляция при загрузке будет автоматически запускать графический сервер (или, по крайней мере, попытается).
Основное структурное отличие новой системы инициализации в том, что она функционирует путем отклика на события. Например: выполняется переход на новый уровень запуска -> обрабатывается событие и выполняются скрипты; получено событие по нажатии «Ctrl-Alt-Delete» — выполняются определенные действия. Всеми этими событиями управляет одна программа, которая имеет классическое имя: «init», и лежит в каталоге «/sbin». После получения события, система выполняет действия, описанные в соответствующем файле из каталога «/etc/init». В данном каталоге находятся файлы, которые как раз и описывают поведение системы при получении какого-либо события, и, согласно терминологии, называются файлами задач.
Файл задачи имеет незамысловатый синтаксис: в нем указывается событие, при наступлении которого задание должно запускаться (ключевое слово «start on») или останавливаться (ключевое слово «stop on»), и что должно запускаться (ключевое слово «exec» для одиночных команд, «script» для скриптов).
Самый не простой момент — разобрать и запомнить какие бывают события, и как они называются. Несколько самых распространенных событий:

— startup: первое событие при запуске системы. Соответствует этапу запуска старого скрипта «rc.sysvinit», который в RedHat раньше запускался из «/etc/inittab», а сейчас запускается из upstart.

— runlevel: событие генерируется при смене уровня выполнения. В конфигах обычно указывается номер уровня выполнения, чтобы перехватить событие перехода на конкретный уровень.

— stopped: генерируется после завершения задачи

— started: генерируется после того, как задача запустилась

Рассмотрим процедуру запуска. Загрузилось ядро, вызвало «/sbin/init». Как я уже сказал, первым выполняется событие «startup». Обработчик находится в файле rcS.conf:

start on startup
exec /etc/rc.d/rc.sysinit

В результате выполняется тот же самый «rc.sysinit», который выполнялся и раньше. В этом же файле находится «post-stop» скрипт, который запускается после завершения работы скрипта «rc.sysinit», анализирует /etc/inittab и вызывает событие смены уровня выполнения на уровень по умолчанию. При смене уровня генерируется событие перехода на новый уровень выполнения, и вызываются соответствующие обработчики. Один из центровых — «rc.conf»:

start on runlevel [0123456]
export RUNLEVEL
exec /etc/rc.d/rc $RUNLEVEL

По сути, выполняется то же самое, что и раньше: запускается привычный скрипт «/etc/rc.d/rc» с параметром уровня выполнения, на который выполняется переход, совершающий запуск сервисов из «/etc/init.d/». Здесь же экспортируется переменная «RUNLEVEL», чтобы ее можно было использовать далее по сценарию и в других файлах задач.

Рассмотрим еще один обработчик, описанный в файле «/etc/init/prefdm.conf»:

start on stopped rc RUNLEVEL=5
stop on starting rc RUNLEVEL=[!5]
respawn
respawn limit 10 120
exec /etc/X11/prefdm -nodaemon

Это конфигурационный файл запуска графического сервера. Первая строка указывает на запуск скрипта по событию остановки задачи «rc» (которая соответствует конфигурационному файлу «rc.conf»), а так же выполняется проверка переменной «RUNLEVEL». Вторая — останавливает сценарий при запуске задачи «rc» и на любом уровне выполнения, кроме 5.
Ключевое слово «respawn» означает то же самое, что и раньше: если процесс, описанный после ключевого слова «exec», остановится, то upstart его перезапустит. И ниже идет ограничение: позволяется 10 попыток запуска с интервалом в 120 секунд, чтобы проблема в конфигурации графического сервера не зациклила его запуск в бесконечном цикле.
Из всего выше сказанного можно сделать следующее заключение: upstart внедрен в RedHat частично, по сути содержимое файла «/etc/inittab» теперь разнесено по нескольким файлам конфигурации в каталоге «/etc/init», а старый набор инициализационных и стартовых скриптов каталога «/etc/rc.d» остался не тронутым. Эта схема очень отличается от той, которая используется в той же Ubuntu, для которой upstart изначально разрабатывался, и сервисы запускаются прямо из него, чем обеспечивается параллелизм, мониторинг и некоторые другие функции.
RedHat не реализовывает весь этот функционал, скорее всего для совместимости. Для запуска службы нужно использовать привычную команду «service», или указать полный путь к стартовому скрипту. Внедрение, скорее всего, будет проходить постепенно, а сейчас из преимуществ мы получили бОльшую гибкость настройки системы запуска, возможности мониторинга и, в зачаточном уровне, параллелизм. Особых недостатков я не вижу, система новая и просто не привычна с первого взгляда, а плавный переход позволит постепенно привыкать к системе, и начать ее использовать при решении задач администрирования.


Понравилась статья? Поделись с остальными.

Комментарии закрыты.