Сценарии запуска в Linux

От того, как запускается и останавливается работа любой системы, собственно зависит и то, как корректно и надёжно эта система будет функционировать. Запуск и останов Linux как и любой UNIX-подобной системы управляется набором специальных сценариев, выполняемых друг за другом в определённой последовательности. Сами эти сценарии в процессе своей работы выдают много важной информации, которая может помочь более тонко настроить систему, а также выявить и исправить проблемы. И часто именно так и происходит: системные администраторы очень внимательно относятся к файлам регистрации, связанным с работой сценариев запуска, поскольку анализируя эту информацию можно достаточно точно и объективно оценить состояние системы и её готовность к выполнению возлагаемых на неё задач. Естественно, в таких случаях необходимо понимать то, как организована работа, а также функциональная модель сценариев запуска.

Что такое сценарии запуска?

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

Несмотря на то, что оригинальные файлы сценариев запуска находятся в каталоге /etc/init.d, однако существуют также и каталоги /etc/rc0.d,  /etc/rc1.d и т. д., в которых хранятся ссылки на оригинальные файлы. Это связано с особенностями функциональной модели запуска и останова системы. Это некая «фишка», которая хорошо демонстрирует, насколько в UNIX/Linux тесно взаимосвязаны, а точнее сказать неотделимы (хотя концептуально это совершенно независимые и автономные системы) операционная система (ОС) и файловая система (ФС), а также и то, насколько широко понятие ФС в UNIX/Linux.

В свою очередь сами сценарии запуска должны кем-то или чем-то запускаться и контролироваться. Ведь на данном этапе никаких процессов ещё не создано. Кроме одного — это демон init. Именно он управляет процессами запуска и завершения работы системы при помощи сценариев запуска, используя модель запуска, завязанную на взаимодействии с ФС. Сам же демон init может запускаться разными способам, но обычно это делается системным загрузчиком GRUB в согласовании с загрузкой системного ядра.

Сценарии запуска обычно выполняют следующие задачи:

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

Демон init и его связь со сценариями запуска

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

  • уровень 0 — полное прекращение работы системы;
  • уровень 1 и/или S – работа в однопользовательском режиме;
  • уровни 2 — 5 — работа в режиме поддержки сети;
  • уровень 6 — перезагрузка системы;

Как можно видеть, переход на уровни 0 или 6 сопровождается либо перезагрузкой, либо завершением работы системы, т. е. система не может оставаться на этих уровнях. Уровень 5 предназначен для функционирования системы X Windows. Уровень S отличается от уровня 1 тем, что для первого уровня существует отдельный процесс, реализующий вывод приглашения о вводе пароля. По-умолчанию большинство дистрибутивов Linux полностью загружаются на уровень 5.

Благодаря параметрам, которые содержатся в файле /etc/inittab, демон init знает, какие действия нужно выполнять, находясь на определённом уровне выполнения. Другими словами в файле /etc/inittab содержится конфигурация главного управляющего сценария демона init. Демон init, когда происходит запуск системы, последовательно выполняет инструкции, переходя от уровня 0 к уровню, определённому по-умолчанию всё в том же файле /etc/inittab. При завершении работы или при перезагрузке выполняются те же инструкции запуска, но в обратном порядке и с другими параметрами. Так, для запуска системы в сценариях запуска в основном используется параметр start, а для остановки/перезагрузки — stop/restart.

Уровень выполнения демона init можно изменять — для этого существует команда telinit. Достаточно выполнить, передав её в качестве параметра номер уровня выполнения:

$ sudo telinit 3

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

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

Организация работы сценариев запуска

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

$ sudo /etc/init.d/apache2 restart

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

$ sudo /etc/init.d/apache2 status

В самом общем случае код типичного сценария запуска может быть следующим (на примере демона sshd):

#!/bin/sh
test -f /usr/bin/sshd || 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

Поскольку сценариями запуска управляет демон init, в частности он же осуществляет переход между уровнями, логично задаться вопросом, каким образом демон init узнаёт, какие сценарии, в какой последовательности нужно выполнить и с какими аргументами, чтобы переход на следующий уровень выполнения мог быть осуществлён?

Дело в том, что как уже ранее отмечалось, в каталоге /etc существуют подкаталоги rc0.d, rc1.d и т. д., наименования которых соответствует записи rc/номер_уровеня.d. И в этих каталогах находятся ссылки на оригинальные файлы сценариев из /etc/init.d. В свою очередь в каталогах  rc0.d, rc1 ссылки имеют наименования, начинающиеся с префиксов S и K, за которыми следует порядковый номер демона (службы) и его имя. Например, имя ссылки на сценарий запуска веб-сервера Apache может быть следующим: S01apache2. Таким образом, главный демон init (точнее сказать его управляющий сценарий), когда необходимо произвести переход на новый уровень выполнения, просматривает каталоги  rc/номер_уровеня.d и согласно порядковым номерам в именах находящихся в нём ссылок на оригинальные сценарии (каталог /etc/init.d) выполняет запуск сценариев в нужной последовательности. Префиксы S и K подсказывают демону init, какие параметры нужно передать сценарию — start (S) или stop (K или kill). Вот так, используя архитектурные особенности ФС выполняются одни из важнейших процессов — настройка компонентов системы, запуск и останов демонов и самой системы. Такой механизм иногда называют механизмом хуков (hook – крюк, зацеп).

Таким образом, следуя этому механизму, системные администраторы довольно легко могут изменять и создавать алгоритмы и целые схемы запуска, не редактируя сами сценарии и не вмешиваясь напрямую в их работу. Всё сводится к тому, чтобы добавить (или удалить, но только осторожно и осмотрительно) ссылку на оригинальный файл сценария запуска в соответствующем каталоге /rc/номер_уровеня.d:

# ln -s /etc/init.d/cups /etc/rc2.d/S80cups
# ln -s /etc/init.d/cups /etc/rc0.d/K80cups

В этом примере модифицируется схема запуска, для которой демон печати cupsd будет запускаться (префикс S — S80cups) при старте системы (уровень 2 — каталог rc2.d) в последовательности запуска под номером 80, а также он будет завершаться (префикс K- K80cups) при завершении (уровень 0 — каталог rc0.d) работы системы.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

ИТ Проффи

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: