Сценарии системы

Сценарии инициализации системы

Файлы, выполняемые системой при её инициализации, хранятся в каталоге /etc/rc.d. Дистрибутив использует расположение сценариев инициализации в стиле BSD. Каждое задание или runlevel (уровень загрузки) имеет свой rc-файл. Таким образом, получается организованная структура, которой легко пользоваться.

Есть несколько категорий сценариев инициализации. Начальная загрузка системы, уровни загрузки, инициализация сети и SystemV-совместимые.

Начальная загрузка системы

Первая программа, запускаемая в системе после ядра Linux — это init(8). Эта программа читает файл /etc/inittab(5), чтобы узнать, как загружать систему. Запускает сценарий /etc/rc.d/rc.S для подготовки перед переключением на выбранный уровень загрузки (runlevel). Файл rc.S активизирует виртуальную память, подключает файловые системы, очищает определённые каталоги, инициализирует устройства Plug and Play, загружает модули ядра, настраивает PCMCIA-устройства, активизирует последовательные порты и запускает загрузочные сценарии SystemV (если таковые присутствуют). Скрипт rc.S выполняет много задач самостоятельно, но также до завершения своей работы, он вызовет сценарии из каталога /etc/rc.d, представленные в табл. 2.1.

Таблица 1.2. Сценарии из каталога /etc/rc.d

Скрипт

Описание

rc.S

Это и есть скрипт инициализации

rc.modules

Загружает такие модули ядра, как поддержка сетевой карты, PPP и другие. Если сценарий находит rc.netdevice, то он выполнит и его

rc.pcmcia

Проверяет наличие и настраивает все PCMCIA устройства, присутствующие в системе. Это наиболее полезно для пользователей портативных компьютеров, у которых, наверняка есть PCMCIA модем или сетевая карта

rc.serial

Настраивает последовательные порты, запуская соответствующие команды setserial

rc.sysvinit

Ищет инициализационные сценарии SystemV, соответствующие выбранному уровню загрузки и выполняет их

Уровни выполнения системы

Уровни выполнения являются режимами работы init и определяют выполняемые системные процессы и предоставляемые сервисы. Уровни выполнения обозначаются номерами (табл. 4.3). Нет единого мнения по поводу использования определяемых администратором уровней выполнения (2-5). Одни системные администраторы настраивают разные уровни выполнения для разных вариантов работы системы, другие ограничиваются одним вариантом, и не меняют уровни выполнения вовсе. Разные дистрибутивы Linux поставляются с разными настройками. Обычно выбор определяется предпочтениями администратора или пользователя.

Таблица 1.3. Уровни выполнения

Уровни

Назначение

0

Выключение системы.

1

Однопользовательский режим (для администрирования в сложных случаях).

2-4

Нормальная работа (настраивается администратором).

5

Нормальная работа (запускается X Window System).

6

Перезагрузка.

Уровни выполнения настраиваются в /etc/inittab строками вида:

l2:2:wait:/etc/rc.d/rc.S

Первое поле является меткой-идентификатором. Второе определяет, что данная строка применима только для уровня выполнения 2. Третье определяет, что init должен выполнить команду в четвертом поле только один раз и ждать (при переходе на данный уровень) и подождать ее выполнения. Скрипт /etc/rc.d/rc.S выполняет все команды для запуска и остановки сервисов, работающих на уровне выполнения 2.

Команда в четвертом поле выполняет все работы по переходу на уровень 2. Она запускает сервисы, которые еще не запущены, и завершает сервисы, которые на данном уровне работать не должны. Как именно производится вся настройка зависит от дистрибутива Linux.

Когда init запускается, он ищет в /etc/inittab строку, в которой указан уровень выполнения, указанный по умолчанию:

id:2:initdefault:

Можно указать, чтобы init при запуске установил не уровень выполнения по умолчанию, передав при загрузке в качестве параметра аргумент single или emergency. Ядерные параметры командной строки могут быть переданы, например, через LILO. Это позволяет выбрать, например, однопользовательский режим (уровень выполнения 1).

Когда система работает, можно поменять уровень выполнения командой telinit. При смене уровня выполнения, init выполнит соответствующие команды из файла /etc/inittab.

Инициализационные сценарии уровней загрузки

После того, как инициализация системы завершена, init переходит к инициализации уровня загрузки. Уровень загрузки определяет, в каком режиме будет работать компьютер: в многопользовательском (multiuser logins) режиме или только в однопользовательском (single user), требуются ли сетевые сервисы и будет ли использоваться X Window или agetty(8) для управления входом в систему (logins). Файлы, приведённые ниже, определяют разные уровни загрузки.

Инициализация сети

Уровни загрузки 2, 3 и 4 запустят сетевые сервисы. Следующие файлы осуществляют инициализацию сети:

Совместимость с SystemV

Многие дистрибутивы Linux используют этот формат вместо формата BSD. В этом стиле каждому уровню загрузки предоставляется каталог для сценариев, а в BSD-стиле каждому уровню загрузки соответствует только один сценарий.

Скрипт rc.sysinit произведёт поиск всех сценариев SystemV в каталоге /etc/rc.d и выполнит их, если уровень загрузки соответствующий. Это полезно, если используются коммерческое программное обеспечение, которое устанавливает сценарии SystemV, в то же время, можно пользоваться и сценариями BSD. Другие файлы

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

Для активизации сценария достаточно добавить ему разрешение на выполнение при помощи программы chmod. Чтобы выключить сценарий, необходимо удалить разрешение на выполнение соответствующего файла.

Процесс init

Эта глава описывает процесс init, который является первым процессом уровня пользователя, запускаемым ядром. init имеет много важных режимов работы, таких как запуск getty (чтобы пользователи могли войти в систему), изменение уровня выполнения системы и удаление ненужных процессов. Эта глава объясняет, как настроить init и как можно менять и использовать различные уровни выполнения. Процесс init запускается первым

init является одной из тех программ, которые абсолютно необходимы для системы Linux. Дистрибутивы Slackware/MOPSLinux поставляются с настройками для init, которые подходят для большинства систем.

Когда ядро запущено (загружено в память, получило управление и инициализировало все драйверы устройств и структуры), оно запускает программу уровня пользователя. Первой такой программой всегда является именно init. Таким образом, init всегда является первым процессом (номер процесса всегда 1).

Ядро ищет init в нескольких местах, в которых он располагается по традиции. В системах Slackware/MOPSLinux обычно используется имя /sbin/init. Если ядро не нашло init, оно пробует запустить /bin/sh. Если и тут происходит неудача, система выдает ошибку и останавливается.

Когда init запущен, он завершает процесс загрузки системы и выполняет ряд административных задач, таких как проверка файловых систем, очистка каталога /tmр, запуск различных сервисов и запуск процесса getty для каждого терминала и виртуальной консоли откуда пользователи могут входить в систему.

После нормального запуска системы init перезапускает getty для каждого терминала после того, как пользователь завершил работу с системой (чтобы следующий пользователь мог зарегистрироваться в системе). init также перехватывает ничейные процессы: когда процесс запускает порожденный процесс и завершает работу до своего потомка, его потомок немедленно становится порожденным из init. Это важно по различным техническим причинам. Имеется несколько вариантов init. Настройка init для запуска getty: файл настроек /etc/inittab

При запуске системы init читает файл настроек /etc/inittab. Когда система уже работает, он перечитает данный файл при получении сигнала HUP. Такое свойство избавляет от необходимости перезагружать систему, чтобы сделать изменения конфигурации актуальными для init.

Файл /etc/inittab устроен довольно просто. Каждая строка в файле состоит из четырех полей, разделенных двоеточиями:

id:runlevels:action:process

Поля описаны ниже. Кроме таких строк файл /etc/inittab может содержать пустые строки и строки комментариев, начинающиеся со знака `#'; такие строки игнорируются системой.

id

Определяет строку в файле. Для строк настройки getty, указывает терминал, на котором будет запущена данная копия (символ после /dev/tty в имени файла устройства). Для других строк данное значение особого значения не имеет и нужно только для выполнения требований формата файла. Значение в данной позиции должно быть уникальным для каждой строки!

runlevels

Уровни выполнения, на которых данная строка рассматривается. Каждый уровень выполнения задается одной цифрой без разделителей.

action

Задает действие, которое должно быть выполнено, например resрawn для того, чтобы выполнить команду в следующем поле многократно или once, чтобы выполнить команду только один раз.

рrocess

Выполняемая команда.

Для запуска getty на первом виртуальном терминале (/dev/tty1), на всех нормальных многопользовательских уровнях выполнения (2-5), применяется строка:

1:2345:resрawn:/sbin/getty 9600 tty1

Первое поле строки указывает, что это строка для устройства /dev/tty1. Второе поле говорит, что это применяется к уровням выполнения 2, 3, 4 и 5. Третье поле означает, что команда должна выполняться многократно (кто-то зашел, вышел и снова зашел в систему с терминала). Последнее поле указывает команду, которая выполняет getty на первом виртуальном терминале.

Если нужно добавить терминалы или телефонные линии с модемами для доступа к системе, следует добавить строки в /etc/inittab по одной на каждый терминал или модемную линию.

Если команда при запуске терпит неудачу, а init сконфигурирован на ее перезапуск, то будет занято много ресурсов системы постоянными перезапусками команды. Во избежание такой ситуации init хранит протокол перезапусков команды, и если частота перезапусков слишком высока, делает паузу в 5 минут перед очередным перезапуском команды. Специальные настройки в файле /etc/inittab

Файл /etc/inittab имеет особые возможности взаимодействия с init в сложных случаях. Строки для таких возможностей помечены специальными ключевыми словами и имеют по три, а не по четыре поля. Примеры:

рowerwait

Передает init сигнал на начало завершения работы системы по причине сбоев в сети питания. Выдается при совместном использовании UPS и программ, которые наблюдают за состоянием UPS и информируют init об отключении внешнего питания.

ctrlaltdel

При нажатии клавиш <ctrl-alt-del> в консоли, дает команду init перезагрузить систему. Администратор может поменять реакцию на нажатие <ctrl-alt-del>, например, на игнорирование или запуск какой-либо произвольной программы.

рoweerok

Если при получении состояния рowerwait питание восстановилось, будет отработано данное состояние. Полезно для возвращения к нормальной работе, если система еще не успела завершить все процессы.

sysinit

Команда, выполняемая при запуске системы. Например, может чистить каталог /tmр.

Данный список не отличается полнотой. Обратитесь к man-руководству на файл inittab за подробностями. Загрузка в однопользовательском режиме

Очень важный уровень выполнения — первый (однопользовательский режим), в котором системный администратор использует только необходимый минимум системных средств. Данный уровень выполнения нужен при выполнении особо важных задач системного администрирования, таких как запуск fsck на файловой системе /usr, для чего данную файловую систему надо размонтировать.

Запущенная система может быть переведена в однопользовательский режим командой telinit с запросом уровня выполнения 1. При загрузке он может быть установлен передачей ядру в командной строке параметра single или emergency. В этом случае init не будет использовать уровень выполнения, заданный по умолчанию.

Загрузка в однопользовательском режиме иногда необходима чтобы выполнить вручную fsck, прежде чем что-нибудь смонтируется или как-то иначе коснется поврежденного раздела (любое действие на разбитой файловой системе, вероятно, разорвет ее еще больше, так что fsck должен быть выполнен как можно скорее).

Стартовый скрипт init автоматически запускает систему в однопользовательском режиме, если fsck при загрузке выявил ошибки на дисках. Такая мера предосторожности защищает те файловые системы, которые fsck не смог исправить самостоятельно. Такая поломка относительно редка, и обычно включает разбитый жесткий диск или экспериментальное ядро.

Как мера защиты, правильно сконфигурированная система будет спрашивать root-пароль перед запуском оболочки в однопользовательском режиме. Иначе, было бы просто только ввести подходящую строку в LILO, чтобы войти как root. С другой стороны, если файл /etc/рasswd поврежден в результате дисковых сбоев, такой подход принесет неприятности.