Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Gentoo_x86_Handbook.doc
Скачиваний:
38
Добавлен:
19.09.2019
Размер:
924.16 Кб
Скачать

4. Инициализационные скрипты

4.A. Уровни запуска

Загрузка вашей системы

Когда вы загружаете вашу систему, вы можете заметить много текста. Если вы изучите его поближе, вы увидите, что этот текст одинаковый каждый раз, когда вы перезагружаете вашу систему. Последовательных всех этих действий называется последовательностью загрузки и (более или менее) статически определено.

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

Этот процесс затем проверяет, что все файловые системы (определенные в /etc/fstab) смонтированы и готовы к использованию. Затем он выполняет некоторые скрипты, расположенные в /etc/init.d, которые запустят все сервисы, которые вам нужны, чтобы ваша система успешно загрузилась.

В конце, когда все скрипты выполнены, init активирует терминалы (в большинстве случаев это просто виртуальные консоли, которые скрыты за Alt-F1, Alt-F2, и т. д.), подсоединяя специальный процесс, названный agetty к ним. Затем этот процесс разрешает вам залогиниться в этих терминалах, запуская login.

Инициализационные скрипты

Теперь init не просто запускает скрипты в /etc/init.d случайным образом. Более того, он не запускает все скрипты в /etc/init.d, а только те, которые ему сказали запустить. Он решает, какие скрипты запустить, смотря в /etc/runlevels.

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

Когда все скрипты с ссылкой в /etc/runlevels/boot выполнены, init продолжает запускать скрипты, которые имеют символическую ссылку в /etc/runlevels/default. Снова, он будет использовать алфавитный порядок, чтобы решить, какой скрипт запустить первым, если только скрипт не будет иметь в себе информацию о зависимости. В этом случае порядок изменяется, чтобы получилась правильная последовательность загрузки.

Как работает init

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

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

Код 1.1: Строка с инициализацией системы в /etc/inittab

si::sysinit:/sbin/rc sysinit

Эта строка говорит init, что он должен запустить /sbin/rc, чтобы инициализировать систему. Скрипт /sbin/rc выполняет инициализацию, так что вы можете сказать, что init, в общем-то, не так уж и много делает — он передает задачу инициализации системы другому процессу.

Далее init выполняет все скрипты, на которые есть символические ссылки в /etc/runlevels/boot. Это определяется следующей строкой:

Код 1.2: Инициализация системы, продолжение

rc::bootwait:/sbin/rc boot

И опять, скрипт rc выполняет необходимые задачи. Заметьте, что опция, которую передают программе rc (boot) та же самая, как и поддиректория каталога /etc/runlevels, которая используется.

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

Код 1.3: Строка с initdefault

id:3:initdefault:

В данном случае (которую будут использовать большинство пользователей Gentoo), уровень запуска равен 3. Используя данную информацию, init проверит, что ему нужно запустить на уровне запуска 3:

Код 1.4: Определение уровней запуска

l0:0:wait:/sbin/rc shutdown

l1:S1:wait:/sbin/rc single

l2:2:wait:/sbin/rc nonetwork

l3:3:wait:/sbin/rc default

l4:4:wait:/sbin/rc default

l5:5:wait:/sbin/rc default

l6:6:wait:/sbin/rc reboot

Строка, определяющая уровень 3, снова использует скрипт rc, чтобы запустить сервисы (теперь с аргументом default). Снова заметьте, что аргумент rc такой же, как и название поддиректории в /etc/runlevels.

Когда rc закончил работу, init решает, какие виртуальные консоли ему нужно активировать, и какие команды нужно запустить в каждой консоли:

Код 1.5: Определение виртуальных консолей

c1:12345:respawn:/sbin/agetty 38400 tty1 linux

c2:12345:respawn:/sbin/agetty 38400 tty2 linux

c3:12345:respawn:/sbin/agetty 38400 tty3 linux

c4:12345:respawn:/sbin/agetty 38400 tty4 linux

c5:12345:respawn:/sbin/agetty 38400 tty5 linux

c6:12345:respawn:/sbin/agetty 38400 tty6 linux

Что такое уровень запуска?

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

В Gentoo существует семь определенных уровней запуска: три встроенных уровней запуска, и четыре уровня запуска определенных пользователем. Встроенные уровни запуска называются sysinit, shutdown и reboot, и делают именно то, что означают их имена — инициализируют систему, выключают систему и перезагружают систему.

Уровни запуска определенные пользователем это скрипты с соответствующей поддиректорией /etc/runlevels — boot, default, nonetwork и single. Уровень запуска boot запускает все необходимые для системы сервисы, которые используют все остальные уровни запуска. Оставшиеся три уровня запуска различаются в том, какие сервисы они запускают: default используется для повседневных операций, nonetwork используется в случае, когда нет соединения с сетью, а single используется, когда вам нужно починить систему.

Работа с инициализационными скриптами

Скрипты, которые выполняет процесс rc называются инициализационными скриптами. Каждый скрипт в /etc/init.d может выполняться с аргуентами start, stop, restart, pause, zap, status, ineed, iuse, needsme, usesme или broken.

Чтобы запустить, остановить, или перезапустить сервис (и все от него зависящие), нужно использовать start, stop и restart:

Код 1.6: Запускаем Postfix

# /etc/init.d/postfix start

Заметка: Только сервисы, которым нужен данный сервис будут остановлены или перезапущены. Другие зависимые сервисы (которые используют сервис, но не требуют его) будут оставлены нетронутыми.

Если вы хотите остановить сервис, но не сервисы, которые от него зависит, вы можете использовать аргумент pause:

Код 1.7: Остановим Postfix, но оставим запущенными зависимые сервисы

# /etc/init.d/postfix pause

Если вы хотите посмотреть, какой статус у сервиса (started, stopped, paused,...), вы можете использовать аргумент status:

Код 1.8: Информация о статусе для postfix

# /etc/init.d/postfix status

Если информация о статусе говорит вам, что сервис запущен, но вы знаете, что он не запущен, то вы можете сбросить информацию о статусе в «stopped» с помощью аргумента zap:

Код 1.9: Сбрасываем информацию о статусе для postfix

# /etc/init.d/postfix zap

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

Код 1.10: Требуем список всех необходимых сервисов, от которых зависит Postfix

# /etc/init.d/postfix ineed

Похожим образом, вы можете спросить, какие сервисы требуют какой-то сервис (needsme) или могут его использовать (usesme):

Код 1.11: Требуем список всех сервисов, которые требуют Postfix

# /etc/init.d/postfix needsme

Вы можете также спросить, какие зависимости необходимые сервису отсутствуют:

Код 1.12: Требуем список отсутствующих зависимостей для Postfix

# /etc/init.d/postfix broken

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]