Работа со сценариями запуска системы

После выхода из однопользовательского режима (или — при стандартной загрузке — по завершении работы интерпретатора команд, запущенного с правами суперпользователя) демон init выполняет сценарии запуска системы. Они являются сценариями интерпретатора sh (на самом деле bash), а их местонахождение, содержимое и организация зависят от изготовителя системы.

В большинстве систем используется подход, в котором сценарии нумеруются и выполняются по порядку. Сценарии хранятся в каталоге /etc/init.d, а ссылки на них созданы в каталогах /etc/rcO. d, /etc/rcl. d и т.д. Такая организация совершенно ясна, и поскольку сценарии выполняются по порядку, система может обеспечивать соответствующие зависимости между службами. Эти "пусковые" сценарии как запускают службы, так и останавливают их, поэтому такая архитектура также позволяет надлежащим образом остановить систему.

Ниже приведен перечень задач, которые часто выполняются этими сценариями.

  • Задание имени компьютера
  • Установка часового пояса
  • Проверка дисков с помощью команды £ sck
  • Монтирование дисков систем
  • Удаление старых файлов из каталога /tmp
  • Конфигурирование сетевых интерфейсов
  • Запуск демонов и сетевых служб

 

Сценарии запуска обычно довольно многословны и выводят подробную информацию о выполняемых ими задачах. Это может оказать существенную помощь при отладке сценариев или поиске причин зависания системы в процессе загрузки.

Администраторам не следует заниматься модификацией сценариев запуска. Те сценарии, которые принимают данные конфигурации, читают их в форме отдельного файла конфигурации (специфичного для конкретного узла). Вы можете модифицировать вспомогательный сценарий конфигурации и должны быть уверены, что он не будет перезаписан обновлениями.

Сценарии процесса init используются в определенной степени всеми шестью операционными системами, которые рассматриваются здесь в качестве примеров. Процесс запуска системы Solaris 10 был полностью переработан (см. раздел 3.6). Ubuntu использует "версию" процесса init, известную как Upstart, но мы все же рассмотрим ее в этом разделе, поскольку она имеет сходство с традиционным процессом init.

В следующих разделах мы сначала представим общие принципы системы, а затем опишем индивидуальные особенности каждой системы.

 

Демон init и его уровни выполнения

Демон init — это первый процесс, который выполняется после завершения загрузки системы, и во многих отношениях он считается самым важным. Его идентификационный номер (PID) всегда равен 1, и сам он является базовым для всех пользовательских и почти для всех системных процессов. Реализации демона init незначительно различаются в разных системах.

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

  • Уровень 0 означает, что система полностью прекратила работу.
  • Уровень 1 и S означает однопользовательский режим.
  • Уровни 2—5 предназначены для поддержки работы в сети.
  • Уровень 6 определяет этап перезагрузки системы.

Уровни 0 и 6 характерны тем, что система не может на них оставаться. Если она на них переходит, то в качестве побочного эффекта происходит завершение работы или перезагрузка. В большинстве случаев система по умолчанию находится на уровне 2 или 3. В Linux уровень 5 используется регистрационными процессами X Windows. Уровень 4 используется редко.

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

Для этой цели был введен уровень S: здесь создается отдельный процесс, отображающий приглашение ввести пароль. В Solaris и AIX уровень S означает, что однопользовательский режим "в действии", но в Linux уровень S носит переходный характер и завершается сразу после ввода пароля.

Создается впечатление, что уровней выполнения больше, чем нужно. Обычно это объясняется тем, что в телефонном коммутаторе 7 уровней, поэтому считалось, что в UNIX-системе должно быть как минимум столько же. В действительности в системах Linux и АГХ поддерживается до десяти уровней, хотя большинство уровней не определено. В стандартной конфигурации системы AIX значимым является только уровень 2. Уровни 0 и 1 зарезервированы для операционной системы, а уровни 3—9 открыты для использования администраторами.

В файле /etc/inittab содержатся параметры, определяющие, что должен делать демон init на каждом уровне. Формат файла зависит от системы, но основная идея состоит в том, что в нем задаются команды, которые должны быть выполнены (или продолжить выполнение), когда система переходит на конкретный уровень.

В процессе загрузки демон init последовательно продвигается от уровня 0 к уровню по умолчанию, заданному в файле /etc/inittab. Чтобы осуществить переход между соседними уровнями, демон выполняет команды из этого файла. Аналогичные действия, только в обратном порядке, происходят при останове системы.

Команда telinit позволяет изменить уровень выполнения демона init, когда система полностью функциональна. Например, команда telinit 3 переводит демон init на уровень 3. Самым полезным аргументом команды telinit является -q, который предписывает init перечитать файл /etc/inittab.

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

Этот дополнительный уровень не до конца разработан в системах AIX. Поэтому управление службами в системах AIX определяется только содержимым файла inittab. Кроме того, AIX-сценарии запуска немного отличаются от соответствующих сценариев в других системах.

Большинство современных дистрибутивов Linux по умолчанию выполняет загрузку на уровень 5, что может быть не подходящим для систем, которым не требуется запускать дисплейный сервер (в среде X Window System). Изменение используемого по умолчанию уровня выполнения не представляет сложности. Следующая строка из файла inittab компьютера, работающего под управлением системы SUSE, определяет уровень 5 выполнения в качестве используемого по умолчанию, id:5:initdefault:

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

 

Обзор сценариев запуска

Основные копии сценариев запуска хранятся в каталоге /etc/init. d. Каждый сценарий отвечает за запуск одного демона или определенной подсистемы. Сценариям можно передавать аргументы start и stop, которые означают, что соответствующая служба должна быть запущена либо остановлена. Большинство сценариев понимает также аргумент restart, который эквивалентен связке stop+start. Обладая правами системного администратора, можно вручную запускать или останавливать нужные службы, вызывая соответствующий сценарий из каталога init. d и передавая ему требуемый аргумент.

Ниже показан несложный сценарий, позволяющий запускать, останавливать и перезапускать демон sshd.

#!/bin/sh

test -f /usr/bin/sshd | I exit 0 case "$1" in start)

echo -n "Starting sshd: sshd"

/usr/sbin/sshd

echo "."

stop)

echo -n "Stopping sshd: sshd" kill 'cat /var/run/sshd.pid' echo "."

restart)

echo -n "Stopping sshd: sshd"

kill 'cat /var/run/sshd.pid'

echo "."

echo -n "Starting sshd: sshd"

/usr/sbin/sshd

echo "."

*)

echo "Usage: /etc/init.d/sshd start|stop|restart" exit 1

esac

Сценарии каталога /etc/init.d способны запускать и останавливать отдельные службы, но, чтобы перейти на требуемый уровень, главный управляющий сценарий, выполняемый демоном init, должен получить дополнительную информацию о том, какие сценарии и с какими аргументами нужно запустить. Управляющий сценарий не просматривает непосредственно каталог init. d, а обращается к каталогу тсуровень. й, где уровень — это номер требуемого уровня выполнения, на который осуществляется переход (rcO. d, rcl. d и т.д.).

В каталогах тсуровень. й обычно содержатся символические ссылки на сценарии каталога init.d. Имена ссылок начинаются с префикса S или к, за которым следует номер и имя службы, управляемой сценарием (например, S34named).

Если демон init переходит на более высокий уровень, он выполняет все сценарии с префиксом S ("start" — запуск) в порядке возрастания номеров, причем каждому сценарию передается аргумент start. Когда осуществляется переход на более низкий уровень, запускаются сценарии с префиксом К ("Ш" — уничтожить) в порядке убывания номеров, и всем им передается аргумент stop.

Эта схема позволяет администраторам очень точно управлять порядком запуска служб. Например, запуск сценария sshd до запуска сетевых интерфейсов лишен смысла. Хотя в системе Red Hat и сеть, и сценарий sshd выполняются на уровне 3, сценарию network присваивается порядковый номер 10, а сценарию sshd — 55. Поэтому можно не сомневаться, что сценарий network будет запущен раньше. При добавлении новых служб необходимо учитывать подобные взаимосвязи.

Чтобы сообщить системе, когда следует запускать тот или иной демон, нужно создать символическую ссылку в соответствующем каталоге. Например, следующие команды информируют систему о том, что демон печати cupsd должен быть запущен на уровне 2 и остановлен при завершении работы системы.

In -s /etc/init.d/cups /etc/rc2.d/S80cups

In -s /etc/init.d/cups /etc/rcO.d/K80cups

Первая ссылка свидетельствует о том, что сценарий запуска /etc/init.d/cups должен быть выполнен одним из последних при переходе на уровень 2 и ему должен быть передан аргумент start. Вторая ссылка сообщает, что в процессе завершения работы системы сценарий /etc/init.d/cups должен быть запущен относительно рано, причем с аргументом stop. В некоторых системах процессы останова и перезагрузки трактуются по-разному, поэтому необходимо также создать символическую ссылку в каталоге /ete/гсб. d, чтобы обеспечить корректный останов демона при перезагрузке системы.

Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.