После выхода из однопользовательского режима (или — при автоматической загрузке — по завершении работы интерпретатора команд, запущенного с правами пользователя root
) демон init
выполняет сценарии запуска системы. Они являются сценариями интерпретатора sh
(на самом деле bash
), а их местонахождение и содержимое зависят от системы.
Ниже приведен перечень задач, которые часто выполняются этими сценариями:
- задание имени компьютера;
- установка часового пояса;
- проверка дисков с помощью команды
fsck
(только в автоматическом режиме); - монтирование дисков систем;
- удаление старых файлов из каталога
/tmp
; - конфигурирование сетевых интерфейсов;
- запуск демонов и сетевых служб.
Сценарии запуска обычно довольно многословны и выводят подробную информацию о выполняемых ими задачах. Это может оказать существенную помощь при отладке сценариев или поиске причин зависания системы в процессе загрузки.
В старых системах нередко приходилось модифицировать сценарии, чтобы настроить их для конкретной среды. Однако разбиение программного обеспечения на узкоспециализированные пакеты и частая публикация их обновлений в Internet привели к применению более надежного подхода. Современные системы включают в себя множество небольших сценариев запуска системы, устанавливаемых различными программами, и эти сценарии считывают информацию о своей локальной конфигурации из отдельных файлов. Как правило, файлы локальной конфигурации имеют форму мини-сценариев интерпретатора sh
, которые устанавливают значения переменных интерпретатора. Затем эти переменные уточняются сценариями.
Демон init и уровни выполнения
Традиционно демон init
определяет 7 уровней выполнения, на каждом из которых должен выполняться конкретный набор системных служб.
- Уровень 0 означает, что система полностью прекратила работу.
- Уровень 1 или S означает однопользовательский режим.
- Уровни 2—5 предназначены для многопользовательского режима.
- Уровень 6 определяет этап перезагрузки системы.
Уровни 0 и 6 характерны тем, что система не может в них оставаться, а переходит на них в процессе завершения работы или перезагрузки. В многопользовательском режиме система чаще всего находится на уровне 2 или 3. Уровень 5 используется регистрационными процессами X Window, например программой xdm
. Уровень 4 используется редко, а уровни 1 и S различны для каждой системы.
Однопользовательскому режиму традиционно соответствовал уровень 1. На нем запрещены все многопользовательские сеансы и процессы удаленной регистрации, а в системе выполняется минимальный набор программ. Но поскольку в этом режиме доступ к системе осуществляется с правами пользователя root, администраторам необходимо, чтобы при загрузке система выдавала приглашение на ввод пароля. Для этой цели был введен уровень S: здесь создается отдельный процесс, отображающий требуемое приглашение. В Linux уровень S носит переходный характер и завершается сразу после ввода пароля.
Создается впечатление, что уровней выполнения больше, чем нужно. Обычно это объясняется тем, что в телефонном коммутаторе 7 уровней, поэтому считалось, что в UNIX-системе должно быть как минимум столько же. В действительности в Linux поддерживается до десяти уровней, хотя уровни 7—9 не определены.
В файле /etc/inittab
содержатся параметры, определяющие, что должен делать демон init на каждом из уровней. Формат файла зависит от системы, но основная идея состоит в том, что в нем задаются команды, которые должны быть выполнены (или продолжить выполнение), когда система переходит на конкретный уровень.
В процессе загрузки демон init
последовательно продвигается от уровня 0 к уровню по умолчанию, заданному в файле /etc/inittab
. Чтобы осуществить переход между соседними уровнями, демон выполняет команды из этого файла. Аналогичные действия, только в обратном порядке, происходят при останове системы.
К сожалению, структура файла inittab
несколько устарела. Чтобы сделать этот файл более эффективным, Linux-системы реализуют дополнительный, абстрактный уровень. Он представлен в виде сценария (обычно /etc/init.d/rc
), который запускается из файла inittab
и осуществляет смену уровней. Этот сценарий, в свою очередь, выполняет другие сценарии из каталога, зависящего от целевого уровня. Они-то и переводят систему в новое состояние.
Большинство современных дистрибутивов Linux по умолчанию выполняет загрузку на 5 уровень, что может быть не подходящим для серверов, которым не требуется запускать X Window. Изменение используемого по умолчанию уровня выполнения не представляет сложности. Следующий фрагмент файла 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 || 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 "."
;;
default=0
timeout=10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Red Hat Linux (2.6.9-5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.9-5 ro root=/dev/hda1
Сценарии каталога /etc/init.d
способны запускать и останавливать отдельные службы, но, чтобы перейти на требуемый уровень, главный управляющий сценарий, выполняемый демоном init
, должен получить дополнительную информацию о том, какие сценарии и с какими аргументами нужно запустить. Управляющий сценарий не просматривает непосредственно каталог init.d
, а обращается к каталогу rcУровень.d, где уровень — это номер требуемого уровня выполнения, на который осуществляется переход (rc0.d, rc1.d и т.д.).
В каталогах rcУровень.d обычно содержатся символические ссылки на сценарии каталога init.d
. Имена ссылок начинаются с префикса S
или K
, за которым следует номер и имя службы, управляемой сценарием (например, S34named). Если демон init
переходит на более высокий уровень, он выполняет все сценарии с префиксом S
(“start
” — запуск) в порядке возрастания номеров, причем каждому сценарию передается аргумент start
. Когда осуществляется переход на более низкий уровень, запускаются сценарии с префиксом K
(“kill
” — уничтожить) в порядке убывания номеров, и всем им передается аргумент stop
.
Эта схема позволяет администраторам очень точно управлять порядком запуска служб. Например, запуск службы SSH до запуска сетевых интерфейсов лишен смысла. Хотя в системе Fedora и сеть, и служба выполняются на 2 уровне, сценарию network
присваивается порядковый номер 10, а сценарию sshd
— 55. Поэтому можно не сомневаться, что сценарий network
будет запущен раньше. При добавлении новых служб необходимо учитывать подобные взаимосвязи.
Чтобы сообщить системе, когда следует запускать тот или иной демон, нужно создать символическую ссылку в соответствующем каталоге. Например, следующие команды информируют систему о том, что демон CUPS должен быть запущен на уровне 2 и остановлен при завершении работы системы:
# ln -s /etc/init.d/cups /etc/rc2.d/S80cups
# ln -s /etc/init.d/cups /etc/rc0.d/K80cups
Первая ссылка свидетельствует о том, что сценарий /etc/init.d/cups
должен быть запущен одним из последних при переходе на уровень 2 и ему должен быть передан аргумент start
. Вторая ссылка сообщает, что в процессе завершения работы системы сценарий /etc/init.d/cups
должен быть запущен относительно поздно, причем с аргументом stop
. В некоторых системах процессы останова и перезагрузки трактуются по-разному, поэтому необходимо также создать символическую ссылку в каталоге /etc/rc6.d
, чтобы обеспечить корректный останов демона при перезагрузке системы.
Сценарии запуска Red Hat и Fedora
Исторически так сложилось, что в сценариях Red Hat и Fedora непросто разобраться, так как в них могут присутствовать комментарии вида
# Несколько громоздкое, но необходимое действие
На каждом уровне выполнения демон init
вызывает сценарий /etc/rc.d/rc
, передавая ему номер уровня в качестве аргумента. Этот сценарий может выполняться как в обычном режиме, так и в режиме подтверждения, когда перед выполнением каждого сценария выдается запрос.
Управлять службами можно с помощью команды chkconfig
. Эта команда добавляет или удаляет сценарии запуска из системы, управляет уровнями выполнения, на которых они работают, и выводит уровни, для которых сконфигурирован сценарий. Для получения информации о применении этого простого и удобного средства можно использовать команду man chkconfig
.
В Red Hat есть также сценарий rc.local
, напоминающий одноименный сценарий в BSD-системах. В процессе начальной загрузки он выполняется последним. В предыдущих версиях Red Hat файл rc.local
перезаписывался пакетом initscripts
. Однако теперь ситуация изменилась, и в этот файл можно безбоязненно помещать собственные параметры запуска.
Ниже приведен пример сеанса запуска системы Red Hat:
[kernel information]
INIT: version 2.85 booting
Setting default font (latarcyrhev-sun16): [ OK ]
Welcome to Red Hat Linux
Press 'I' to enter interactive startup.
Starting udev: [ OK ]
Initializing hardware... storage network audio done
Configuring kernel parameters: [ OK ]
Setting clock (localtime): Tue Mar 29 20:50:41 MST 2005: [ OK ]
Когда появится сообщение “Welcome to Red Hat Enterprise Linux”, можно нажать клавишу <i
>, чтобы продолжить загрузку в режиме подтверждения. Однако подтверждение о нажатии клавиши не отображается. Система продолжит монтировать локальные файловые системы, активизировать разделы подкачки, загружать таблицы клавиш и вести поиск модулей ядра. Только после перехода на уровень 3 демон init
начнет выдавать запросы:
Welcome to Red Hat Enterprise Linux WS
Press 'I' to enter interactive startup.
Starting udev: [ OK ]
Initializing hardware... storage network audio done
Configuring kernel parameters: [ OK ]
setting clock (localtime): tue mar 29 20:50:41 mst 2005: [ OK ]
Setting hostname rhel4: [ OK ]
Checking root filesystem
/dev/hda1: clean, 73355/191616 files, 214536/383032 blocks [ OK ]
Remounting root filesystem in read-write mode: [ OK ]
Setting up Logical Volume Management: [ OK ]
Checking filesystems
Mounting local filesystems: [ OK ]
Enabling local filesystem quotas: [ OK ]
Enabling swap space: [ OK ]
INIT: Entering runlevel: 3
Entering interactive startup
Start service kudzu (Y)es/(N)o/(C)ontinue? [Y]
Режимы интерактивной и однопользовательской загрузки начинаются в одной и той же точке. Если в процессе загрузки возникли серьезные проблемы и этой точки достичь невозможно, воспользуйтесь загрузочной дискетой или компакт-диском.
Можно передать загрузчику LILO параметр init=/bin/sh
, чтобы заставить его вызвать интерпретатор команд однопользовательского режима еще до того, как будет запущен демона init
. В этом случае все действия по запуску системы придется осуществлять вручную, включая выполнение команды fsck
и монтирование локальных файловых систем.
Повлиять на процесс начальной загрузки в Red Hat можно путем модификации конфигурационных файлов, находящихся в каталоге /etc/sysconfig
. Назначение элементов этого каталога описано в табл. 1
Таблица 1. Файлы и подкаталоги каталога /etc/sysconfig в Red Hat
Файл/подкаталог | Назначение или содержимое |
clock | Задает тип системных часов (почти всегда UTC) |
console | Загадочный каталог, который всегда пуст |
httpd | Определяет модель обработки Apache, которую необходимо использовать |
hwconf | Содержит всю информацию о системных аппаратных средствах; используется службой Kudzu |
i18n | Содержит региональные установки системы (форматы представления даты/времени, языки и т.д.) |
init | Определяет способ отображения сообщений, поступающих от сценариев запуска системы |
keyboard | Задает тип клавиатуры (используйте идентификатор “us” для стандартной 101-клавишной клавиатуры) |
mouse | Задает тип мыши; используется системой X и программой gpm |
network | Задает глобальные сетевые опции (имя компьютера, шлюз, переадресация и т.д.) |
network-scripts | Каталог, содержащий вспомогательные сценарии и сетевые конфигурационные файлы |
sendmail | Задает параметры программы sendmail |
- Файл
hwconf
содержит всю информацию об имеющемся оборудовании. Он просматривается службойKudzu
, которая проверяет, было ли добавлено или удалено какое-нибудь устройство, и запрашивает у пользователя дополнительные инструкции. В системах промышленного уровня эту службу можно отключить, поскольку она существенно задерживает процесс начальной загрузки. Каждый раз, когда обнаруживается изменение аппаратной конфигурации, возникает задержка длительностью 30 секунд. - Каталог
network-scripts
содержит вспомогательные файлы, связанные с конфигурацией сети. Единственное, что может потребоваться в нем изменить, — это файлы с именами ifcfg-интерфейс. Например, файлnetwork-scripts/ifcfg-eth0
хранит параметры конфигурации интерфейса eth0, в частности его IP-адрес и сетевые опции. - Файл
sendmail
содержит две переменные: DAEMON и QUEUE. Если переменная DAEMON равна yes, система запустит программуsendmail
в режиме демона (-bd
) в процессе начальной загрузки. ПеременнаяQUEUE
информирует программуsendmail
о том, каков интервал обработки очереди почтовых сообщений. Стандартная установка — 1 час.
Сценарии запуска SUSE
Хотя сценарии запуска системы SUSE подобны сценариям RHEL и Fedora, это область, в которой SUSE превосходит другие дистрибутивы Linux. Эти сценарии четко организованы, надежны и хорошо документированы. Стоит сказать спасибо разработчикам, которые отвечают за эту часть операционной системы.
Как и в системах Red Hat и Fedora, на каждом уровне выполнения демон init вызывает сценарий /etc/rc.d/rc
, передавая ему номер уровня в качестве аргумента. Сценарии данного пакета хранятся в каталоге /etc/init.d
, а их файлы конфигурации — в каталоге /etc/sysconfig
. Прекрасное краткое описание процесса запуска системы SUSE можно найти в файле /etc/init.d/README
.
Хотя файлы конфигурации запуска как системы SUSE, так и RHEL/Fedora собраны в каталоге /etc/sysconfig
, конкретные файлы внутри этого каталога в значительной мере различны. (В частности, в целом файлы SUSE снабжены достаточно подробными комментариями.) Необходимые параметры вызываются посредством установки переменных среды интерпретатора, к которым затем обращаются сценарии, хранящиеся в каталоге /etc/init.d
. Некоторые подсистемы требуют более подробного конфигурирования. Такие системы, нуждающиеся в нескольких файлов конфигурации, имеют приватные подкаталоги вроде sysconfig/network
.
Файл windowmanager
— типичный пример файла, хранящегося в каталоге sysconfig
:
## Path: Desktop/Window manager
## Description:
## Type: string(kde,fvwm,gnome,windowmaker)
## Default: kde
## Config: profiles,kde,susewm
#
# Here you can set the default window manager (kde, fvwm, ...)
# changes here require at least a re-login
DEFAULT_WM="kde"
## Type: yesno
## Default: yes
# install the SUSE extension for new users
# (theme and additional functions)
#
INSTALL_DESKTOP_EXTENSIONS="yes"
Каждой переменной предшествует информация о конфигурации, считываемая утилитой YaST, и подробное описание назначения переменной. Например, в файле windowmanager
переменная DEFAULT_WM определяет диспетчер окна рабочего стола, используемый системой X.
Особенно удачно решение SUSE о помещении файлов конфигурации сети в подкаталог /etc/sysconfig/network
. Этот каталог содержит как файлы глобальной конфигурации (с параметрами настройки которые относятся ко всем сетевым интерфейсам), так и файлы конфигурации конкретных сетевых интерфейсов. Например, файл network/routes
содержит глобальную информацию маршрутизации. В типичной системе SUSE содержимое этого файла может выглядеть следующим образом:
# Destination Dummy/Gateway Netmask Device
default 192.168.10.254 0.0.0.0 eth0
Маршруты, которые должны присутствовать только во время работы конкретного интерфейса, можно указывать в файле ifroute-имя. Например, в интерфейсе eth1 этот файл имел бы имя ifroute-eth1
, а его содержимым могло бы быть:
# Destination Dummy/Gateway Netmask Device
10.10.0.0/24 10.10.0.254
При желании можно указать маску сети и устройство, но сценарии запуска будут определять правильные значения.
Пакет SUSE содержит также команду chkconfig
, которая позволяет управлять сценариями запуска системы. Она коренным образом отличается о версии, предоставляемой системой Red Hat, но также является эффективным средством управления сценариями.
Независимо от того, используется утилита YaST
либо команда chkconfig
или сценарии запуска системы обрабатываются вручную, желательно просмотреть файл /etc/sysconfig
и проанализировать его содержимое.
Типичный сеанс запуска системы SUSE может выглядеть следующим образом:
[kernel information]
INIT: version 2.85 booting
System Boot Control: Running /etc/init.d/boot
Mounting /proc filesystem done
Mounting sysfs on /sys done
Mounting /dev/pts done
Boot logging started on /dev/tty1(/dev/console) at Tue Mar 29 14:04:12 2005
Mounting shared memory FS on /dev/sh done
Activating swap-devices in /etc/fstab...
Adding 1052248k swap on /dev/hda2. Priority:42 extents:1 done
Checking root file system...
...
Сценарии запуска Debian и Ubuntu
Если SUSE является примером системы с четко продуманным планом управления сценариями запуска, то Debian — ее антипод. Сценарии Debian ненадежны, недокументированны и невероятно противоречивы. Печально, но отсутствие стандартных правил организации сценариев запуска привело в данном случае к хаосу.
На каждом уровне выполнения демон init
вызывает сценарий /etc/init.d/rc
, передавая ему номер уровня в качестве аргумента. Все сценарии должны самостоятельно искать свою конфигурационную информацию, которая хранится в файлах каталога /etc
, /etc/default
или другого подкаталога каталога /etc
либо в самих сценариях.
Имя компьютера хранится в файле /etc/hostname
, который читается сценарием /etc/init.d/hostname.sh
. Параметры сетевых интерфейсов и стандартных шлюзов находятся в файле /etc/network/interfaces
, который читается командой ifup
, вызываемой из сценария /etc/init.d/networking
. Некоторые сетевые опции могут быть также заданы в файле /etc/network/options
.
Системы Debian и Ubuntu предоставляют своего рода скрытую программу управления сценариями запуска —
update-rc.d
. Хотя посвященная ей страница руководства предостерегает против ее интерактивного использования, мы сочли ее полезной, хотя и менее удобной, заменой командыchkconfig
. Например, для запускаsshd
на уровнях выполнения 2, 3, 4 и 5 и для останова на уровнях 0, 1 и 6 можно использовать следующую команду:
$ sudo /usr/sbin/update-rc.d sshd start 0123 stop 456