От того, как запускается и останавливается работа любой системы, собственно зависит и то, как корректно и надёжно эта система будет функционировать. Запуск и останов Linux как и любой UNIX-подобной системы управляется набором специальных сценариев, выполняемых друг за другом в определённой последовательности. Сами эти сценарии в процессе своей работы выдают много важной информации, которая может помочь более тонко настроить систему, а также выявить и исправить проблемы. И часто именно так и происходит: системные администраторы очень внимательно относятся к файлам регистрации, связанным с работой сценариев запуска, поскольку анализируя эту информацию можно достаточно точно и объективно оценить состояние системы и её готовность к выполнению возлагаемых на неё задач. Естественно, в таких случаях необходимо понимать то, как организована работа, а также функциональная модель сценариев запуска.
Что такое сценарии запуска?
Система не может быть запущена сама по себе. Её полноценный и готовый к эксплуатации образ формируется, настраивается и загружается в память специальными инструкциями, хранящимися в специально отведённых для этого файлах в каталоге /etc/init.d. Каждый сценарий (в большинстве случаев) управляет запуском, завершением работы, а также настройкой как отдельных системных (и не только) демонов, так и целыми функциональными компонентами системы.
Несмотря на то, что оригинальные файлы сценариев запуска находятся в каталоге /etc/init.d, однако существуют также и каталоги /etc/rc0.d, /etc/rc1.d и т. д., в которых хранятся ссылки на оригинальные файлы. Это связано с особенностями функциональной модели запуска и останова системы. Это некая «фишка», которая хорошо демонстрирует, насколько в UNIX/Linux тесно взаимосвязаны, а точнее сказать неотделимы (хотя концептуально это совершенно независимые и автономные системы) операционная система (ОС) и файловая система (ФС), а также и то, насколько широко понятие ФС в UNIX/Linux.
В свою очередь сами сценарии запуска должны кем-то или чем-то запускаться и контролироваться. Ведь на данном этапе никаких процессов ещё не создано. Кроме одного — это демон init. Именно он управляет процессами запуска и завершения работы системы при помощи сценариев запуска, используя модель запуска, завязанную на взаимодействии с ФС. Сам же демон init может запускаться разными способам, но обычно это делается системным загрузчиком GRUB в согласовании с загрузкой системного ядра.
Сценарии запуска обычно выполняют следующие задачи:
- проверка дисков утилитой fsck;
- назначение имени компьютера;
- установка часового пояса;
- монтирование ФС;
- настройка сетевых интерфейсов;
- очистка ФС от временных файлов;
- запуск демонов и сетевых служб.
Когда возникает необходимость внести изменения в работу сценариев запуска, то очень нежелательно редактировать непосредственно сценарии. Лучше и правильнее будет отредактировать соответствующие конфигурационные файлы, если таковые имеются и используются соответствующим сценарием. Однако нужно помнить о том, что конфигурация может быть перезаписана и все изменения пропадут, если используется автоматические обновления системы.
Демон 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) работы системы.