После выхода из интерактивного режима (или при автоматической загрузке, когда завершает работу командный интерпретатор, запущенный с правами root) программа init выполняет сценарии запуска системы. Они являются сценариями интерпретатора Bourne shell (sh), а их точное местоположение и содержимое зависит от системы.
Наиболее широко распространены два способа организации работы со стартовыми сценариями, уходящие корнями в историю. В BSD-системах эти файлы хранятся в каталоге /etc и их имена начинаются с префикса «rc». В системах семейства System V файлы сценариев располагаются в каталоге /etc/init.d, а ссылки на них созданы в каталогах /etc/rc0.d, /etc/rc1.d и т.д. второй вариант организации является более четким и позволяет аккуратнее выполнять останов системы.
Ниже приведен перечень задач, которые часто выполняется инициализационные сценариями:
-
задание имени компьютера;
-
установка часового пояса;
-
проверка дисков с помощью команды fsck (только в автоматическом режиме);
-
монтирование системных дисков;
-
удаление файлов из каталога /tmp;
-
конфигурирование сетевых плат;
-
запуск процессов-демонов и сетевых служб.
Большинство стартовых сценариев выводит на консоль подробную информацию о выполняемых ими задачах. Это может оказать существенную помощь при отладке или поиске зависания в процессе начальной загрузки.
В старых системах нередко приходилось модифицировать стартовые сценарии, чтобы настроить их для конкретной среды. Сегодня сценарии, поставляемые разработчиком системы, должны быть достаточно общими, чтобы работать в системах любой конфигурации. Сведенья о локальной конфигурации системы не задаются в самом сценарии, а помещается в отдельный файл (или набор файлов). Конфигурационные файлы, как правило, представляют собой небольшие файлы Bourne shell, включаемые в стартовые сценарии для получения доступа к некоторым переменным командного интерпретатора.
Стартовые сценарии в системах семейства System V
Сегодня сценарии в стиле System V наиболее распространены. Они используются в трех из четырех рассматриваемых нами операционных систем. Мы в первую очередь опишим общие принципы запуска системы, а затем перейдем к анализу особенностей конкретных ОС.
В системах семейства System V программа init определяет 7 «уровней выполнения», на каждом из которых должен выполнятся конкретный набор системных сценариев.
-
Уровень 0 говорит о том, система полностью прекратила работу.
-
Уровень 1 или S означает однопользовательский режим.
-
Уровни 2 – 5 предназначены для многопользовательского режима.
-
Уровень 6 определяет этап перегрузки системы.
Уровни 0 и 6 отличаются тем, что система в действительности не может в них оставаться. Переход на эти уровни означает, что система либо завершает работу, либо перегружается. В многопользовательском режиме чаще всего установлен уровень выполнения 2 или 3; уровни 4 и 5 используются редко. Уровни 1 и S различны для каждой системы.
Однопользовательскому режиму традиционно соответствует уровень 1. на этом уровне запрещены все многопользовательские сеансы и процессы удаленной регистрации, а в системе выполняется минимальный набор программ. Поскольку в данном режиме доступ к системе осуществляется с правами пользователя root, администраторам необходимо, чтобы при загрузке в таком режиме система выдавала приглашение на ввод пароля. Для этой цели предназначен уровень S: в нем создается отдельный процесс, выдающий требуемое приглашение на экран. В Solaris уровень S является вполне самостоятельным, но в Linux он носит переходной характер и завершается сразу после ввода пароля.
Создается впечатление, что уровней выполнения больше, чем нужно. Обычно это объясняется тем, что в телефонном коммутаторе 7 уровней, поэтому в UNIX-системе должно быть столько же. В Red Had поддерживается до 10-ти уровней, хотя уровни 7 – 9 не определенны.
В файле /etc/inittab содержатся параметры, определяющие, что должна делать программа init на каждом из уровней. Формат файла зависит от системы, но основная идея состоит в том, что в нем задаются команды, которые должны быть выполнены (или продолжать выполнятся), когда система переходит на конкретный уровень.
В процессе загрузки программа init последовательно продвигается от уровня 0 к уровню, заданному по умолчанию в файле /etc/inittab. Чтобы осуществить переход между соседними уровнями, программа init выполняет команды из этого файла. Аналогичные действия производятся в обратном порядке при останове системы.
К сожалению, структура файла /etc/inittab довольно сложна и не всегда согласуется с тем, как на самом деле происходит запуск и останов сервисов в UNIX-системах. Чтобы сделать этот файл более полезным, многие системы семейства System V реализуют дополнительный, абстрактный уровень. Он обычно представлен в виде команды. Которая запускается из файла /etc/inittab и осуществляет смену уровней. На этом уровне выполняются сценарии из каталога, зависящего от целевого уровня; они переводят систему в новое состояние.
Системным администраторам обычно нет необходимости работать непосредственно с файлом /etc/inittab, так как существующие сценарии подходят для большинства случаев. Далее в главе мы не будем упоминать это файл и все те механизмы, которые связывают программу init со стартовыми сценариями. Просто когда мы говорим о том, что программа init выполняет такой-то сценарий, нужно понимать: связь со сценарием может быть косвенной.
Основные копии стартовых сценариев хранятся в каталоге init.d. Он, в свою очередь, может располагаться в каталоге /etc, но это не всегда так. Каждый сценарий отвечает за запуск одного демона или определенной подсистемы. Сценариям можно передавать аргументы start и stop, которые означают, что соответствующий сервис должен быть либо запущен, либо остановлен. Большинство сценариев также аргумент restart, который эквивалентен связке start+stop. Обладая правами администратора, можно вручную или останавливать отдельные сервисы вызывая нужный сценарий из каталога init.d и передавая ему требуемый аргумент.
Ниже показан простой сценарий, позволяющий запускать, останавливать или перезапускать демон sshd:
#! /bin/sh
test –f /usr/local/sbin/sshd || exit 0
case “$1” in
start)
echo –n “Starting sshd: sshd”
/usr/local/sbin/sshd
echo “.”
;;
stop)
echo –n “Stoping sshd: sshd”
kill ‘cat /var/run/sshd.pid’
echo “.”
;;
restart)
echo –n “Stoping sshd: sshd”
kill ‘cat /var/run/sshd.pid’
echo “.”
echo –n “Starting sshd: sshd”
/usr/local/sbin/sshd
echo “.”
;;
*)
echo “Usage: /etc/init.d/sshd start|stop|restart”
exit 1
;;
esac
Чтобы перейти на требуемый уровень, программа init должна получить дополнительную информацию о том, какие сценарии и с какими аргументами запускать. Но она не просматривает непосредственно каталог init.d, а обращается к каталогу rcуровень.d, где уровень – это номер требуемого уровня выполнения, к которому осуществляется переход (rc0.d, rc1.d и т.д.).
В каталогах rcуровень.d обычно содержатся символические ссылки на сценарии в каталоге init.d. Имена ссылок начинаются с префикса S или K, за которым идет номер и имя сервиса, управляемого сценарием (например, S34named). Если программа init переходит к более высокому уровню, она выполняет все сценарии с префиксом S (“start” - запуск) в порядке возврастания номеров, причем каждому сценарию передается аргумент start. Когда осуществляется переход к более низкому уровню, запускаются сценарии с префиксом K (“kill” - уничтожить) в порядке убывания номеров, и всем им передается аргумент stop. В зависимости от системы, программа init может просматривать только каталог rcуровень.d, относящийся к целевому уровню, либо все каталоги на пути от исходного к целевому уровню.
Чтобы сообщить системе, когда следует запускать тот или иной демон, необходимо создать символическую ссылку в соответствующем каталоге. В большинстве систем основная часть сетевых демонов запускается на уровне 2. следующие команды информируют систему о том, что демон sshd должен быть запущен на уровне 2 и остановлен при завершении работы системы:
# ln -s /etc/init.d/sshd /etc/rc2.d/S99ssh2
# ln -s /etc/init.d/sshd /etc/rc2.d/K25ssh2
Первая ссылка говорит о том, что сценарий /etc/init.d/sshd следует запустить в самом конце этапа перехода на уровень 2 и передать ему аргумент start. Вторая ссылка сообщает, что в процессе завершения работы системы сценарий /etc/init.d/sshd должен быть запущен относительно рано, причем с аргументом stop. В некоторых системах процессы останова и перезагрузки трактуются по-разному, поэтому необходимо также поместить символическую ссылку в каталог /etc/rc6.d, чтобы обеспечить корректный останов демона при перезагрузке системы.
Solaris
Системы Solaris, HR-UX и Red Hat используют сценарии в стиле System V, которые хранятся в каталоге init.d. В Solaris этот каталог, как и каталоги rcуровень.d находятся в каталоге /etc.
Раньше стартовые сценарии Solaris обращались к конфигурационным файлам, разбросанным по всей системе, что приводило к невообразимой путанице. В последних версиях системы компании Sun устранила большинство проблем. Стартовые сценарии теперь значительно улучшены и большей частью самодостаточны.
Некоторые конфигурационные файлы собраны в каталоге /etc/defaults (табл. 2.3), однако общее число настраиваемых параметров не так уж велико. Остальные файлы по-прежнему распределены между различными каталогами.
Таблица 2.3 Конфигурационные файлы стартовых сценариев Solaris
|
Файл
|
Назначение
|
|
/etc/.UNCONFIGURED
|
Сообщает стартовым сценариям о необходимости полностью переконфигурировать систему (обычно используется только в процессе инсталляции)
|
|
/etc/hostname.интерфейс
|
Содержит имя узла, связанное с указанным сетевым интерфейсом (сетевой платой)
|
|
/etc/dhcp.интерфейс
|
Сообщает о том, что сетевой интерфейс должен быть сконфигурирован с помощью протокола DHCP
|
|
/etc/defaultrouter
|
Содержит имя узла и адрес стандартного шлюза
|
HP-UX
В HR-UX стартовые сценарии хранятся в каталоге /sbin/init.d. Каталоги символических ссылок также находятся в каталоге /sbin. Конфигурационные файлы размещаются в каталоге /etc/rc.config.d. Их имена соответствуют именам стартовых сценариев. Например, сценарий
/sbin/init.d/SnmpMaster
извлекает конфигурационную информацию из файла
/etc/rc.config.d/SnmpMaster
и вызывается программой init с помощью таких ссылок:
/sbin/rc2.d/S560SnmpMaster
/sbin/rc1.d/K440SnmpMaster
Результаты работы стартовых сценариев сохраняются в файле /etc/rc.log. Если какой-то из сценариев не смог выполнится, просмотрите этот файл на предмет наличия сообщений об ошибках или другой информации, позволяющей выявить суть проблемы. Это настолько полезная и несложная в реализации особенность, что просто удивительно, почему поставщики других систем не догадались сделать нечто подобное.
Конфигурационные файлы могут быть сложны для понимания, хотя они снабжены хорошими комментариями. В табл. 2.4. описано назначение файлов, которые модифицируются чаще других.
Таблица 2.4. Конфигурационные файлы HR-UX (каталог /etc/rc.config.d)
|
Файл(ы)
|
Назначение
|
|
SnmpMaster
|
Включает или отключает поддержку протокола SNMP
|
|
Snmp*
|
Другие параметры связанные с протоколом SNMP
|
|
acct
|
Включает или отключает подсистему учета процессов; см. acct(1M)
|
|
auditing
|
Управляет работой подсистемы аудита; см. audsys(1M) и audevent()1M
|
|
cde
|
Содержит настройки CDE (Common Desktop Environment – единая настольная среда)
|
|
clean*
|
Управляет операциями очистки, выполняемыми на этапе загрузки
|
|
desktop
|
Определяет, какой из имеющихся рабочих столов будет выбран по умолчанию
|
|
hpbase100conf
|
Конфигурирует устройства Fast Ethernet
|
|
hpetherconf
|
Конфигурирует Ethernet-платы; см. lanadmin(1M)
|
|
list_mode
|
Управляет отображением меню стартовой загрузки
|
|
lp
|
Включает или отключает подсистему буферизации печати
|
|
mailservs
|
Запускает утилиту sendmail или задает почтовый сервер
|
|
nameservs
|
Конфигурирует или запускает демон службы имен
|
|
nddconf
|
Задает параметры ядра, устанавливаемые на этапе загрузки с помощью демона ndd
|
|
netconf
|
Задает параметры конфигурации сети (IP-адрес и т.п.)
|
|
netdaemons
|
Указывает на то, какие сетевые демоны следует запустить
|
|
nettle
|
Конфигурирует подсистемы сетевой трассировки и регистрации; см. nettle(1M), nettlconf(1M) и nettlgen.conf(4)
|
|
nfsconf
|
Задает параметры NFS (Network File System – сетевая файловая система)
|
|
pd
|
Конфигурирует сервис распределенной печати HR-UX
|
|
vt
|
Запускает демон vtdaemon
|
|
xfs
|
Включает и отключает сервис шрифтов X Windows
|
Для большинства этих файлов вполне подходят стандартные установки. Чаще всего модифицируются файлы netconf, netdaemons и, возможно, nddconf.
Red Hat
Стартовые сценарии – это то, отличает дистрибутивы Linux друг от друга. Например, сценарии Debian очень напоминают сценарии Solaris, а сценарии Slackware сходны со своими «родственниками» во FreeBSD. В Red Hat используются гибридные сценарии, сочетающие в себе черты сценариев System V и FreeBSD плюс еще несколько «наворотов», добавленных только для того, чтобы сделать жизнь администраторов сложнее.
В сценариях Red Hat достаточно сложно разобратся, так как в них могут присутствовать комментарии вида
# дурацкий прием, но должен работать
и
# это неправильно!
Программа init в Red Hat в основном соответствует своему аналогу в System V. На каждом уровне выполнения программа вызывает сценарий /etc/rc.d/rc, передавая ему номер уровня в качестве аргумента. Этот сценарий может выполнятся как в обычном режиме, так и в режиме подтверждения, в котором перед выполнением каждого стартового сценария выдается запрос. Управлять символическими ссылками на стартовые сценарии можно с помощью команды chkconfig.
В Red Hat имеется также сценарий rc.local, напоминающий одноименный сценарий во FreeBSD. В процессе загрузки он выполняется последним. Не стоит добавлять в него собственные команды; лучше воспользоваться средствами System V.
Вот пример загрузки в Red Hat:
[информация о ядре]
INIT: version 2.77 booting
Welcome to Red Hat Linux
Press ‘I’ to enter interactive startup.
Mounting proc filesystem [OK]
Setting clok (utc): Fri Mar 10 07:16:41 MST 2000 [OK]
Loading default keymap [OK]
Activating swap partitions [OK]
. . .
Когда появляется сообщение «Welcome to Red Hat Linux», можно нажать клавишу <I>, чтобы продолжить загрузку в режиме подтверждения. Однако подтверждение о нажатии самой клавиши выдано не будет. Red Hat спокойно продолжит монтировать локальные файловые системы, активизировать разделы диска подкачки, загружать таблицы клавиш и вести поиск модулей ядра. Только после перехода на уровень 3 программа init начнет выдавать запросы:
Welcome to Red Hat Linux
Press ‘I’ to enter interactive startup.
Mounting proc filesystem [OK]
Setting clok (utc): Fri Mar 10 07:16:41 MST 2000 [OK]
Loading default keymap [OK]
Activating swap partitions [OK]
Setting hostname redhat.synack.net [OK]
Checking root filesystem [OK]
/dev/hda1: clean, 73355/191616 files, 214536/383032 blocks [OK]
Finding module dependencies [OK]
Checking filesystem [OK]
Mounting local filesystem [OK]
Turning on user and group quotas for local filesystem [OK]
Enabling swap space [OK]
INIT: Entering runlevel: 3
Entering interactive startup
Start service kudzu (Y)es/(N)o continue? [Y]
Режимы интерактивной и однопользовательской загрузки начинаются с одного и того же места. Если в процессе загрузки возникли серьезные проблемы и этой точки достичь невозможно, воспользуйтесь спасательной загрузочной дискетой.
Можно передать загрузчику LILO параметр init=/bin/sh, чтобы заставить его вызвать командный интерпритатор однопользовательского режима еще до того, как будет запущена программ init . В этом случае все действия по запуску системы придется производить вручную, включая выполнение программы fsck и монтирование локальных файловых систем.
Повлиять на процесс загрузки в Red Hat можно путем модификации конфигурационных файлов, расположенных в каталоге /etc/sysconfig. Принципы работы с ними такие же, как и с файлами в каталоге /etc/rc.config.d в HP-UX, хотя самих файлов меньше, а опций в них больше (табл. 2.5)
Таблица 2.5. Файлы и подкаталоги каталога /etc/sysconfig в Red Hat
|
Файл/подкаталог
|
Название или содержимое
|
|
apmd
|
Список аргументов для демона подсистемы APM (Advanced Power Management – расширенное управление питанием)
|
|
clock
|
Задает тип системных часов (почти всегда UTC)
|
|
console
|
Загадочный каталог, который всегда пуст
|
|
hwconf
|
Включает всю информацию о системном оборудовании; используется сервисом Kudzu
|
|
i18n
|
Содержит региональные установки системы (формат представления даты/времени, язык и т.д.)
|
|
init
|
Определяет, как отображаются сообщения, постопающие от стартовых сценариев
|
|
keyboard
|
Задает тип клавиатуры (используйте идентификатор «us» для стандартной 101-клавишной клавиатуры)
|
|
mouse
|
Задает тип мыши; используется системой X Windows и программой gpm
|
|
network
|
Задает глобальные сетевые опции (имя узла, шлюз, маршрутизация и т.д.)
|
|
network-scripts
|
Каталог, в котором содержатся вспомогательные сценарии и сетевые конфигурационные файлы
|
|
pcmcia
|
Сообщает, следует ли запускать демоны PCMCIA, и содержит необходимые опции
|
|
sendmail
|
Задает параметры для утилиты sendmail
|
Некоторые элементы из списка заслуживают дополнительных комментариев:
-
Файл hwcong просматривается сервисом Kudzu, который проверяет, было ли добавлено или удалено какое-нибудь устройство, и запрашивает у пользователя дополнительные инструкции. В промышленных системах этот сервис можно деактивировать, поскольку он сильно задерживает процесс загрузки. Каждый раз, когда обнаруживается изменение аппаратной конфигурации, возникает задержка в 30 с.
-
Каталог network-scripts содержит вспомогательные файлы, связанные с сетевой конфигурацией. Все, что может потребоваться в ней изменить, - это файлы с именами ifcfg-интерфейс. Например, файл network-scripts.ifcfg-eth0 включает параметры платы с идентификатором eth0, в частности ее IP-адрес. О конфигурации сетевых плат рассказывается в параграфе 13.10.
-
Файл sendmail содержит две переменные: DAEMON и QUEUE. Если переменная DAEMON равна yes, система запустит утилиту sendmai в процессе загрузки. Переменная QUEUE информирует утилиту sendmail о том, сколько времени после возникновения ошибки сообщение должно находится в очереди, прежде чем будет предпринята попытка повторной отправки.
FreeBSD
Представленная ниже информация касается FreeBSD, но общие принципы организации стартовых сценариев применимы ко всем BSD-системам.
Программа init во FreeBSD выполняет только один, главный сценарий - /etc/rc. Он, в свою очередь, запускает остальные сценарии, которые расположены в каталоге /etc и носят имена вида rc.имя. Сценарии запускаются в определенном порядке, а концепция уровней выполнения не поддерживается.
Сценарий /etc/rc начинает свою работу с выполнения трех сценариев, определяющих конфигурационную информации.:
-
/etc/defaults/rc.conf
-
/etc/rc.conf
-
/etc/rc.conf.local
В этих файлах задаются другие каталоги, в которых необходимо искать стартовые сценарии (имена каталогов заносятся в переменную local.startup). кроме того, в них определяется ряд переменных интерпретатора shell, используемых последующими сценариями. Сценарий /etc/rc применяет команду source (точнее, ее оригинальный псевдоним '.'), чтобы преобразовать конфигурационные и все последующие сценарии в единый поток выполнения. Эта процедура включает в себя конкатенацию файлов в один большой сценарий.
Файл /etc/defaults/rc.conf содержит огромный перечень всех конфигурационных параметров и их стандартных значений. Его нельзя редактировать. Если требуется изменить значение какой-либо переменной, просто переопределите ее в файлах /etc/rc.conf и /etc/rc.conf.local. на страницах интерактивного руководства, посвященных файлу /etc/rc, приведен исчерпывающий список переменных, которые можно менять.
Заглянув в каталог /etc, вы можете обнаружить в нем много различных сценариев:
% ls /etc/rc*
rc rc.diskless1 rc.isdn rc.pccard
rc.atm rc.diskless2 rc.local rc.resume
rc.conf rc.firewall rc.serial rc.devfs
rc.i386 rc.network rc.shutdown rc.suspend
Если ядро сконфигурировано как бездисковый клиент, в первую очередь вызывается сценарий rc.diskless1. затем вызывается сценарий rc.sysctl, rc.serial, rc.pccard и rc.network, после чего сценарий /etc/rc переходит к выполнению служебных функций. В качестве завершающего аккорда запускается сценарий rc.local. Если какой-то сценарий не определен. Он просто пропускается (в приведенном выше списке сценарий rc.sysctl отсутствует).
Стандартный сценарий rc.serial ничего не делает, а лишь определят набор функций, которые позволяют инициализировать последовательные порты и устройства на этапе загрузки.
Если в одном из файлов rc.conf задана поддержка интерфейсов PCMCIA/CardBus, сценарий rc.pccard загружает модули ядра, связанные с контролером PCMCIA, и запускает демон pccard, управляющий динамическим конфигурированием устройств PCMCIA по мере их подключения и отключения.
Сценарий rc.network инициализирует сетевую среду компьютера. Он использует переменные, определенные в файлах rc.conf, для конфигурирования сетевых интерфейсов, протоколов DHCP и PPP, маршрутизаторов и брандмауэров. Редактировать этот сценарий нет необходимости, так как все параметры содержатся в файлах rc.conf. он вызывает другие сетевые стартовые сценарии: rc.atm, rc.isdn и rc.firewall.
Для конфигурирования сетевого интерфейса во FreeBSD предназначены три переменные: hostname, defaultrouter и ifconfig_инт (где инт – имя интерфейсного устройства). Переменная ifconfig_инт должна содержать строку опций, передаваемых команде ifconfig при инициализации устройства. Например, в строках сценария
hostname=”my.fullyqualified.name”
ifconfig_de0=”inet 192.168.1.2 netmask 0xffffff00”
defaultrouter=”192.168.1.1”
узлу назначается IP-адрес 192.168.1.2 и задается стандартный адрес шлюза 192.168.1.1. Если данное интерфейсное устройство должно конфигурироваться динамически по протоколу DHCP, задайте строку следующего вида:
ifconfig_de0=”DHCP”
Сервер DHCP автоматически назначает узлу IP-адрес, доменное имя и маршрут по умолчанию.