
Уровни выполнения
В Linux схема начальной загрузки слегка сложнее, чем обычная .d
. Связано это с тем, что одну и ту же систему в разных случаях бывает необходимо загружать с разным набором служб. Если, скажем, использование сети нежелательно, удобнее сказать что-то вроде «Система! Загружайся без сети!», чем вручную удалять стартовые сценарии всех предположительно сетевых служб из .d
-каталога. Необходимость выбора также возникает, если компьютер используется в качестве рабочей станции с запуском графической среды и всего с нею связанного или в качестве стоечного сервера, управлять которым лучше с системной консоли.
Поэтому в Linux предусмотрено несколько вариантов начальной загрузки, называемых уровнями выполнения (run levels). Уровни выполнения нумеруются с 0 до 9:
- Уровень 1 соответствует однопользовательскому режиму загрузки системы. При загрузке на уровень 1 не запускается никаких служб, и даже системная консоль, как правило, бывает доступна только одна, так что в системе может работать не более одного пользователя. В однопользовательском режиме изредка работает администратор - исправляет неполадки системы, изменяет ключевые настройки, обслуживает файловые системы.
- Уровень 2 соответствует многопользовательскому режиму загрузки системы с отключенной сетью. В этом режиме не запускаются никакие сетевые службы, что, с одной стороны, соответствует строгим требованиям безопасности, а с другой стороны, позволяет запускать службы и настраивать сеть вручную.
- Уровень 3 соответствует многопользовательскому сетевому режиму загрузки системы. Сеть при загрузке на этот уровень настроена, и все необходимые сетевые службы запущены. На этом уровне обычно работают компьютеры-серверы.
- Уровень 5 соответствует многопользовательскому графическому режиму загрузки системы. На этом уровне обычно функционируют рабочие станции, предоставляя пользователям возможность работать с графической подсистемой X11. Сеть на этом уровне настроена, а вот список запущенных сетевых служб может быть меньше, так как рабочая станция не всегда выполняет серверные функции (хотя, безусловно, может).
- Уровни 0 и 6 - специальные. Они соответствуют остановке и перезагрузке системы. В сущности, это удобные упрощения для действий, обратных загрузке на уровень: все службы останавливаются, диски размонтируются. В случае остановки даже электропитание можно отключать программно, если аппаратура позволяет, а в случае перезагрузки система идет на повторную загрузку.
Остальные уровни никак специально в Linux не описаны, однако администратор может использовать и их, определяя особый профиль работы системы. Переход с уровня на уровень выполняется очень просто: по команде init номер_уровня. На какой уровень загружаться при старте системы, написано в inittab
(в поле действия должно быть написано initdefault
, а в поле уровни - только одна цифра). Узнать текущий уровень выполнения можно с помощью команды runlevel
:
[root@localhost root]# grep initdefault /etc/inittab
id:3:initdefault:
[root@localhost root]# runlevel
N 3
Пример 10.7. Задание и просмотр уровня выполнения
Уровень выполнения. Сохраненный профиль загрузки системы. В Linux реализован выполнением всех сценариев остановки и запуска служб из подкаталога rc.d
каталога /etc
или /etc/rc.d
Схема .d
легко учитывает уровни выполнения. В каталоге /etc/rc.d
заводится несколько .d
-подкаталогов, соответствующих каждому уровню выполнения: /etc/rc.d/rc_уровень.d
. Именно оттуда их запускает стартовый сценарий /etc/rc.d/rc
:
[root@localhost root]# ls -F /etc/rc.d
init.d/ rc.powerfail* rc0.d/ rc2.d/ rc4.d/ rc6.d/
rc* rc.sysinit* rc1.d/ rc3.d/ rc5.d/ scripts/
[root@localhost root]# ls /etc/rc2.d
K10power K75netfs S15random S31klogd S37gpm S54sshd
K44rawdevices K95kudzu S30sound S32hotplug S40crond S98splash
K50xinetd S10network S30syslogd S35keytable S41anacron S99local
[root@localhost root]# ls -l /etc/rc2.d/ K75netfs
lrwxrwxrwx 1 root root 15 Nov 9 01:16 /etc/rc2.d/K75netfs ->
../init.d/netfs
Пример 10.8. Содержимое каталогов /etc/rc.d и /etc/rc.d/rc2.d
Переход с уровня на уровень должен сопровождаться не только запуском, но и остановкой служб. Это касается не только уровней 0 и 6, но и любых других. Например, при переходе с уровня 3 на уровень 2 необходимо остановить все сетевые службы. Поэтому схема .d
была расширена: сначала с параметром stop
запускаются сценарии, имена которых начинаются на K
(Kill), а затем, с параметром start
- те, имена которых начинаются на S
(Start). В приведенном примере при переходе на уровень 2 останавливается несколько служб, в том числе сетевой метадемон (K50xinetd) и монтирование по сети удаленных файловых систем (K75netfs). Если при переходе с уровня на уровень некой службе не требуется менять своего состояния, сценарий не запускается вовсе. Так, при переходе с уровня 3 на уровень 2 сетевые настройки остаются активными, поэтому соответствующий сценарий (S10network), скорее всего, запущен не будет.
Долгое время считалось, что определение порядка загрузки - дело системного администратора, поэтому расставлять символьные ссылки в каталогах rc*.d
приходилось вручную. Однако одно из другого не следует: можно предусмотреть и более простой способ наполнения этих каталогов ссылками. Один из способов такой: поставить в стартовый сценарий комментарий особого вида, в котором описать, на каких уровнях служба должна быть активизирована, и какой по порядку должна быть запущена и остановлена:
[root@localhost root]# grep chkconfig /etc/init.d/netfs
# chkconfig: 345 25 75
[root@localhost root]# chkconfig --list netfs
netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off
[root@localhost root]# ls /etc/rc.d/rc*.d/*netfs
/etc/rc.d/rc0.d/K75netfs /etc/rc.d/rc3.d/S25netfs
/etc/rc.d/rc6.d/K75netfs
/etc/rc.d/rc1.d/K75netfs /etc/rc.d/rc4.d/S25netfs
/etc/rc.d/rc2.d/K75netfs /etc/rc.d/rc5.d/S25netfs
Пример 10.9. Управление порядком выполнения стартовых сценариев
Здесь Иван использовал утилиту chkconfig
, которая ищет в стартовом сценарии комментарий вида chkconfig
: уровни вкл выкл, и самостоятельно проставляет ссылки в соответствии с этими полями: во всех каталогах, упомянутых в уровнях соответствующий netfs
сценарий имеет вид Sвклnetfs
, а во всех остальных - Kвыклnetfs
. Эта же утилита позволяет добавлять и удалять службу на каждом уровне в отдельности или запрещать ее вовсе.