Linux: работа со сценариями запуска системы

Андрей Волков

Андрей Волков

Системное, сетевое администрирование +DBA. И немного программист!))  Профиль автора.

Сценарии запуска системы в LinuxПосле выхода из однопользовательского режима (или — при автоматической загруз­ке — по завершении работы интерпретатора команд, запущенного с правами пользова­теля 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

 

Вас заинтересует / Intresting for you:

Основа операционной системы Li...
Основа операционной системы Li... 1257 просмотров Андрей Волков Wed, 09 Jan 2019, 05:36:45
Сигналы в Linux
Сигналы в Linux 990 просмотров Fortan Tue, 05 Feb 2019, 16:18:38
Процессы Linux
Процессы Linux 1975 просмотров Doctor Wed, 23 Jan 2019, 16:47:24
Краткая история Linux
Краткая история Linux 1340 просмотров Андрей Волков Wed, 09 Jan 2019, 02:46:59
Войдите чтобы комментировать