Перейти к содержанию

6.3 Управление уровнями выполнения Linux с помощью init (Managing Linux Runlevels Using init)

Если вам уже доводилось работать с Linux, вы, вероятно, слышали термин «уровень выполнения». Я заметил, что многие начинающие пользователи Linux испытывают трудности с пониманием этой концепции. В данной части главы мы разберём, что такое уровень выполнения и как управлять уровнями выполнения в системе. Будут рассмотрены следующие темы:

  • Как работают уровни выполнения
  • Управление уровнями выполнения и сценариями init

Примечание

Уровни выполнения применяются в первую очередь к дистрибутивам Linux, использующим init. Дистрибутивы, использующие systemd, применяют цели загрузки (boot targets) вместо уровней выполнения. Мы обсудим systemd далее в этой главе.

Начнём с обсуждения принципа работы уровней выполнения.

Как работают уровни выполнения (How Runlevels Work)

Для эффективного администрирования Linux-системы необходимо хорошо понимать принцип работы уровней выполнения. В этой части главы мы рассмотрим следующее:

  • Что такое уровень выполнения?
  • Определение уровней выполнения в /etc/inittab

Начнём с обсуждения того, что представляет собой уровень выполнения.

Что такое уровень выполнения? (What Is a Runlevel?)

Итак, что же такое уровень выполнения (runlevel)? Звучит сложно, но на поверку это вовсе не так. Уровень выполнения — это один из нескольких режимов работы системы Linux. В каком-то смысле уровень выполнения в Linux похож на режим запуска в Windows. Если вы работали с Windows, то знаете, что во время загрузки системы можно нажать клавишу F8 и выбрать один из нескольких режимов запуска. Например, если в Windows возникают проблемы с определённым устройством или драйвером, можно загрузить систему в безопасном режиме, который запускает операционную систему с минимальным набором драйверов для диагностики и устранения неполадок.

Уровни выполнения Linux устроены аналогично. Подобно режимам запуска Windows, уровни выполнения Linux позволяют задать режим, в котором должна работать система. В Linux предусмотрено семь уровней выполнения по умолчанию, как показано в таблице 6-3.

Таблица 6-3. Уровни выполнения Linux

Уровень выполнения Описание
0 Останавливает систему.
1 Запускает Linux в однопользовательском режиме. Используется интерфейс командной строки.
2 Запускает Linux в многопользовательском режиме с отключённой сетью. Используется интерфейс командной строки.
3 Запускает Linux в многопользовательском режиме с включённой сетью. Используется интерфейс командной строки.
4 Не определён по умолчанию. Можно отредактировать файл /etc/inittab и задать собственный уровень выполнения на основе уровня 4.
5 Запускает Linux в многопользовательском режиме с включённой сетью. Используется графический интерфейс пользователя.
6 Перезагружает систему.

Как видно из таблицы 6-3, между уровнями выполнения Linux и режимами запуска Windows есть существенные различия. Во-первых, переход на уровень выполнения 0 останавливает систему, тогда как переход на уровень выполнения 6 перезагружает её. Кроме того, можно задать уровень выполнения по умолчанию, в который система будет загружаться при каждом включении. Более того, между уровнями выполнения можно динамически переключаться во время работы системы. В Windows такого нет!

Эти уровни выполнения определяются через файл /etc/inittab. Рассмотрим, как этот файл работает.

Определение уровней выполнения с помощью /etc/inittab (Defining Runlevels with /etc/inittab)

В дистрибутивах, использующих init, процесс init является прародителем всех остальных процессов системы Linux. Это первый процесс, запускаемый ядром при загрузке, и он отвечает за запуск всех остальных системных процессов, обеспечивающих работу Linux. Процесс init настраивается в файле /etc/inittab. Ниже приведён фрагмент типичного файла inittab для системы openSUSE:

fs2:~ # cat /etc/inittab
# /etc/inittab
id:5:initdefault:
# First script to be executed, if not booting in emergency (-b) mode
si::bootwait:/etc/init.d/boot
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
#l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# what to do in single-user mode
ls:S:wait:/etc/init.d/rc S
~~:S:respawn:/sbin/sulogin
# what to do when CTRL-ALT-DEL is pressed
ca::ctrlaltdel:/sbin/shutdown -r -t 4 now
# special keyboard request (Alt-UpArrow)
# look into the kbd-0.90 docs for this
kb::kbrequest:/bin/echo "Keyboard Request -- edit /etc/inittab to let this work."
# what to do when power fails/returns
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
#pn::powerfail:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
...
# end of /etc/inittab

Первый параметр, определённый в файле inittab, задаёт уровень выполнения по умолчанию. Он имеет вид id:5:initdefault:. Эта строка предписывает процессу init загружаться по умолчанию в уровень выполнения 5. Напомним, что уровень выполнения 5 запускает Linux в многопользовательском режиме с включённой сетью и графическим рабочим столом.

Далее файл inittab предписывает процессу init выполнить сценарий /etc/init.d/boot:

si::bootwait:/etc/init.d/boot

Параметр bootwait указывает init запустить этот сценарий и ждать его завершения, прежде чем продолжать процесс загрузки.

Кроме того, файл inittab определяет, какие сценарии init выполняются на каждом уровне выполнения. Это задаётся следующими строками:

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
#l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

Синтаксис команд в файле inittab таков: идентификатор:уровень_выполнения:действие:команда. Действие wait, указанное в этих командах, предписывает процессу init ожидать завершения сценариев для указанного уровня выполнения, прежде чем продолжать работу. Обратите также внимание, что определение уровня выполнения 4 закомментировано. В каждом дистрибутиве Linux, с которым я работал, уровень выполнения 4 остаётся неопределённым по умолчанию.

Файл /etc/inittab также задаёт поведение системы при нажатии сочетания клавиш Ctrl+Alt+Del. По умолчанию файл inittab вызывает перезагрузку системы при нажатии этих клавиш, как показано ниже:

ca::ctrlaltdel:/sbin/shutdown -r -t 4 now

Если вы хотите изменить поведение системы при нажатии этих клавиш, отредактируйте файл /etc/inittab в текстовом редакторе и измените эту строку, указав нужную команду.

Внимание

Будьте очень осторожны при редактировании файла inittab. Ошибка в нём может привести к невозможности загрузки системы.

Обратите внимание, что в примере файла inittab также определён однопользовательский режим (S):

# what to do in single-user mode
ls:S:wait:/etc/init.d/rc S
~~:S:respawn:/sbin/sulogin

Однопользовательский режим чрезвычайно полезен при устранении проблем с системой. При переходе в однопользовательский режим выполняется команда /sbin/sulogin, позволяющая войти в систему с правами суперпользователя root и устранить проблему, препятствующую нормальной работе системы. Чтобы перейти в однопользовательский режим во время работы системы, введите init S в приглашении командной строки. После этого система запросит пароль суперпользователя root. После ввода пароля вы получите доступ с правами root в однопользовательском режиме. Это показано на рис. 6-13.

Рис. 6-13. Переход в однопользовательский режим.

Рис. 6-13. Переход в однопользовательский режим.

Войти в однопользовательский режим можно также при запуске системы, введя S в поле «Boot Options» меню GRUB.

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

# what to do when power fails/returns
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
#pn::powerfail:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

В файле inittab есть также блок, указывающий init, какие процессы входа в систему на уровне выполнения (называемые процессами Get TTY, или getty) запускаются для предложения пользователю ввести имя пользователя и пароль. Это показано ниже:

1:2345:respawn:/sbin/mingetty --noclear tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

Как видно из этого примера, процессы входа создаются на уровнях выполнения 2, 3, 4 (если он определён) и 5.

Если вы внесли изменения в файл inittab, необходимо уведомить init об этих изменениях и заставить его перечитать свою конфигурацию. Для этого введите команду init q в приглашении командной строки.

Имея этот базовый материал, вы готовы к изучению управления уровнями выполнения в системе. Перейдём к этой теме.

Управление уровнями выполнения и сценариями init (Managing Runlevels and init Scripts)

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

Вспомните, что в предыдущей главе я упоминал: одно из первых, что я делаю после установки новой системы Linux, — это отключение всех ненужных служб, запускающихся автоматически. Это экономит оперативную память и ресурсы ЦПУ, а также устраняет потенциальные уязвимости безопасности системы. В этой части главы мы обсудим, как это делается. Будут рассмотрены следующие темы:

  • О сценариях init
  • Настройка уровня выполнения по умолчанию
  • Изменение уровней выполнения из командной строки
  • Настройка служб для автоматического запуска на заданном уровне выполнения

Начнём с изучения сценариев init.

О сценариях init (About init Scripts)

Системные процессы на Linux-системе запускаются и останавливаются с помощью сценария init (init script). Сценарий init используется процессом init для запуска процессов при загрузке системы и при изменении текущего уровня выполнения. Эти сценарии хранятся в специальном каталоге системы Linux. Каталог зависит от дистрибутива. Большинство дистрибутивов Linux используют один из двух типов сценариев init:

  • Дистрибутивы System V, использующие сценарии init в стиле System V, хранят их в каталоге /etc/rc.d. Внутри /etc/rc.d находится ряд подкаталогов с именами от rc0.d до rc6.d. Каждый из этих каталогов связан с определённым уровнем выполнения. Внутри каждого подкаталога — символьные ссылки, указывающие на сценарии init для демонов системы, которые расположены в /etc/rc.d/init.d.
  • Дистрибутивы BSD, использующие сценарии init в стиле BSD, хранят их в каталоге /etc/init.d. Внутри /etc/init.d находится ряд каталогов с именами от rc0.d до rc6.d. Как и в случае сценариев init System V, эти каталоги связаны с определённым уровнем выполнения. Они содержат ссылки, указывающие на сценарии init в /etc/init.d.

Помимо запуска этих сценариев с помощью процесса init, их можно также выполнять из командной строки. Для этого достаточно ввести /etc/init.d/имя_сценария в приглашении командной строки (в системе BSD-типа) или /etc/rc.d/init.d/имя_сценария (в системе System V-типа). Если вы не знаете, какое именно имя сценария использовать, можно воспользоваться командой ls для вывода списка сценариев в каталоге init, как показано ниже:

fs2:/etc/init.d # ls
...
aaeventd             boot.lvm                         lm_sensors              rpmconfigcheck
acpid                boot.md                          mcelog                  rsyncd
alsasound            boot.multipath                   mdadmd                  setserial
atd                  boot.proc                        multipathd              single
auditd               boot.rootfsck                    network                 skeleton
autofs               boot.startpreload                network-remotefs        skeleton.compat
autoyast             boot.swap                        nfs                     smartd
avahi-daemon         boot.sysctl                      nmb                     smb
avahi-dnsconfd       boot.udev                        nscd                    smolt
bluez-coldplug       boot.udev_retry                  ntp                     splash
boot                 cifs                             openvpn                 splash_early
boot.apparmor        cron                             pm-profiler             sshd
boot.cleanup         cups                             postfix                 stoppreload
boot.clock           dbus                             powerd                  svnserve
boot.crypto          dnsmasq                          powerfail               syslog
boot.crypto-early    earlysyslog                      random                  vmtoolsd
boot.cycle           earlyxdm                         raw                     xdm
boot.d               fbset                            rc                      xfs
boot.device-mapper   gpm                              rc0.d                   xinetd
boot.dmraid          haldaemon                        rc1.d                   ypbind
boot.fuse            halt                             rc2.d
boot.ipconfig        halt.local                       rc3.d

Конкретный набор сценариев в вашем каталоге init зависит от того, какие службы установлены в системе. При установке службы с помощью утилиты rpm соответствующий сценарий init автоматически помещается в каталог сценариев init. После этого можно выполнять любой сценарий, просто запустив его из командной строки. Синтаксис для системы BSD-типа выглядит следующим образом:

/etc/init.d/имя_сценария start | stop | restart

При запуске сценариев init можно использовать следующие параметры:

  • start — запустить соответствующую службу.
  • stop — остановить соответствующую службу.
  • status — просмотреть состояние службы, например, запущена ли она в данный момент.
  • restart — остановить и затем снова запустить соответствующую службу. Это очень полезный параметр, если вы внесли значительные изменения в конфигурацию службы, требующие перезапуска для их применения.
  • reload — повторно прочитать конфигурационный файл службы без её перезапуска. Не все демоны поддерживают этот параметр.

Например, чтобы запустить службу smb, следует ввести /etc/init.d/smb start в приглашении командной строки. Чтобы остановить её — /etc/init.d/smb stop. Чтобы перезапустить — /etc/init.d/smb restart.

В некоторых дистрибутивах, например в SUSE Linux, можно также использовать сценарий rc для запуска, остановки или перезапуска службы без указания полного пути к файлу сценария. Синтаксис: rcимя_сценария start | stop | restart. Например, чтобы запустить службу smb, можно ввести rcsmb start в приглашении командной строки. Для остановки — rcsmb stop. Для перезапуска — параметр restart.

При загрузке системы init запускает сценарии, определённые в /etc/inittab для конкретного уровня выполнения, в который производится загрузка. Например, если система настроена на загрузку в уровень выполнения 5, то init запускает сценарии, содержащиеся в /etc/rc.d/rc5.d или /etc/init.d/rc5.d — в зависимости от дистрибутива. Сценарии уровня выполнения 5 для типичной системы openSUSE показаны на рис. 6-14.

Рис. 6-14. Сценарии init в /etc/init.d/rc5.d.

Рис. 6-14. Сценарии init в /etc/init.d/rc5.d.

Как видно из рис. 6-14, настоящие сценарии, запускающие и останавливающие службы, находятся не в подкаталоге rc5.d. Вместо этого файлы в rc5.d — это символьные ссылки, указывающие на настоящие файлы сценариев в каталоге init (в данном случае /etc/init.d).

Помимо сценариев init, в /etc/init.d или /etc/rc.d/init.d находится несколько других важных файлов сценариев, о которых необходимо знать. Они перечислены в таблице 6-4.

Таблица 6-4. Важные файлы в /etc/init.d

Файл Стиль init Функция
rc BSD и System V Этот сценарий используется для переключения между уровнями выполнения в процессе работы системы.
halt BSD Этот сценарий может остановить или перезагрузить систему. Запускается при смене текущего уровня выполнения на 0 или 6.
boot BSD Этот сценарий запускается init при первоначальном запуске системы. Выполняет сценарии, содержащиеся в /etc/init.d/boot.d. Эти сценарии выполняют разнообразные задачи запуска: загрузку модулей ядра, проверку файловых систем, установку системных часов и другое.
boot.local BSD Этот сценарий также запускается init при запуске системы. Содержит дополнительные команды инициализации. Сценарий чрезвычайно полезен: если вы хотите автоматически выполнять определённую команду при каждом запуске системы, вставьте её в этот файл с помощью текстового редактора.
rc.sysinit System V Функция этого сценария аналогична функции сценария boot в системе BSD-типа. Используется для задания переменной PATH, проверки файловой системы на ошибки, установки системных часов и так далее.
rc.local System V Функция этого сценария аналогична функции сценария boot.local в системе BSD-типа. Можно добавить собственные команды в этот сценарий, чтобы обеспечить их выполнение при каждой загрузке системы.

Таким образом, в процессе инициализации системы BSD-типа процесс init выполняет следующие задачи:

  • Запускает сценарий /etc/init.d/boot для подготовки системы
  • Обрабатывает /etc/inittab для определения соответствующего уровня выполнения и сценариев
  • Запускает сценарии в соответствующем каталоге уровня выполнения в /etc/init.d
  • Запускает сценарий /etc/init.d/boot.local

В системе System V-типа процесс init при запуске системы выполняет следующее:

  • Запускает сценарий /etc/rc.d/sysinit для подготовки системы
  • Обрабатывает /etc/inittab для определения соответствующего уровня выполнения и сценариев
  • Запускает сценарии в соответствующем каталоге уровня выполнения в /etc/rc.d/
  • Запускает сценарий /etc/rc.d/rc.local

Настройка уровня выполнения по умолчанию (Configuring the Default System Runlevel)

Как вы уже знаете из этой главы, уровень выполнения по умолчанию задаётся в файле /etc/inittab. Изменить уровень выполнения по умолчанию можно, просто изменив второе значение в соответствующей строке на нужный уровень выполнения. Например, если я хочу изменить уровень выполнения по умолчанию с 5 на 3, мне достаточно открыть /etc/inittab в текстовом редакторе и заменить значение 5 на 3. После сохранения файла и перезагрузки система загрузится в уровень выполнения 3.

Помимо смены уровня выполнения при загрузке, можно также изменять его «на лету» во время работы системы. Рассмотрим, как это делается.

Изменение уровней выполнения из командной строки (Changing Runlevels from the Shell Prompt)

Если изменение уровня выполнения по умолчанию кажется простым, то изменение уровня выполнения «на лету» ещё проще. Это делается с помощью команды init. Синтаксис: init уровень_выполнения. Например, если система работает на уровне выполнения 5 и нужно переключиться на уровень 3, достаточно ввести init 3 в приглашении командной строки. После ввода команды система переключается на уровень выполнения 3, как показано на рис. 6-15.

Рис. 6-15. Переключение на уровень выполнения 3 «на лету».

Рис. 6-15. Переключение на уровень выполнения 3 «на лету».

Совет

Перед выполнением команды init необходимо переключиться на учётную запись суперпользователя root.

При изменении уровня выполнения с помощью команды init процесс init запускает сценарий rc и указывает ему перейти на соответствующий уровень. Сценарий rc читает /etc/inittab для определения текущего уровня выполнения и останавливает все службы, связанные с этим уровнем, с помощью сценариев в соответствующем каталоге уровня выполнения в каталоге init. Затем сценарий rc снова читает /etc/inittab и запускает соответствующие стартовые сценарии в каталоге нового уровня выполнения.

Если заглянуть в каталог rcx.d внутри каталога init вашего дистрибутива, вы увидите два сценария для каждого системного процесса. Один начинается с буквы S, другой — с буквы K. Сценарии, начинающиеся с S, используются для запуска процесса, а начинающиеся с K — для его остановки (от англ. kill — завершить). Когда процесс init вызывает rc и задаёт уровень выполнения для перехода, процесс rc запускает все сценарии в соответствующем каталоге rcx.d для запуска и остановки служб в соответствии с требованиями нового уровня выполнения. Именно эти сценарии задействуются при переключении между уровнями выполнения «на лету», как описано выше.

Хотя мы называем эти файлы «сценариями», они не являются ими в полном смысле. На самом деле это символьные ссылки, указывающие на настоящие файлы сценариев в каталоге сценариев init. Это значительно упрощает обновление системы Linux. Если бы индивидуальные сценарии init хранились в каждом каталоге rcx.d и нужно было применить обновление к определённой службе, каждый сценарий init в каждом каталоге rcx.d пришлось бы обновлять отдельно. Это было бы очень трудоёмко и несло бы огромный риск ошибок и несогласованности!

Поскольку все файлы в различных каталогах rcx.d — лишь символьные ссылки на один экземпляр сценария init службы в каталоге init, любые обновления нужно применять только к одному файлу.

Выборка сценариев из каталога rc5.d показана на рис. 6-14. Файлы S вызывают соответствующий сценарий init с параметром start, а файлы K — с параметром stop.

Обратите также внимание на рис. 6-14, что за буквой K или S следует число, а затем имя сценария init. Число в имени файла играет важную роль. Когда init вызывает сценарий rc для смены уровня выполнения, сценарий rc сначала просматривает каталог rcx.d для текущего уровня выполнения и сравнивает его с каталогом rcx.d уровня выполнения, на который осуществляется переход. Если для службы есть сценарий остановки (K) в каталоге rcx.d текущего уровня выполнения и сценарий запуска (S) для той же службы в каталоге rcx.d нового уровня выполнения, сценарий rc оставляет службу запущенной, поскольку она должна работать на обоих уровнях.

Если же для службы есть сценарий остановки в каталоге rcx.d текущего уровня выполнения, но нет стартового сценария в каталоге rcx.d нового уровня выполнения, сценарий rc запускает сценарий остановки для завершения работы службы. И наоборот, если для службы есть стартовый сценарий в каталоге rcx.d нового уровня выполнения, но нет стартового сценария в каталоге rcx.d текущего уровня, сценарий rc запускает стартовый сценарий для запуска службы.

Число в имени сценария остановки или запуска вступает в дело именно на этом этапе. Оно определяет последовательность, в которой запускаются сценарии. Это гарантирует, что службы, от которых зависят другие службы, будут запущены первыми. Например, сценарию с номером 01 будет отдан приоритет перед сценарием с номером 02. Это означает, что файл S02network в rc5.d выполняется после S01dbus, но перед S03syslog.

Для наглядности рассмотрим пример. Предположим, вам нужно переключить систему с уровня выполнения 3 на уровень 5. Вот что происходит:

  1. Вы вводите init 3 в приглашении командной строки (от имени суперпользователя root).
  2. Процесс init проверяет конфигурационный файл /etc/inittab, который обычно указывает на выполнение сценария /etc/init.d/rc, и предписывает ему перевести систему на уровень выполнения 5.
  3. Процесс rc запускает сценарии остановки в каталоге текущего уровня выполнения для всех запущенных служб, которые должны быть отключены на новом уровне.
  4. Процесс rc запускает стартовые сценарии в каталоге нового уровня выполнения для всех служб, которые в данный момент не запущены, но должны работать на новом уровне.

Примечание

При вводе init 0 или init 6 система будет остановлена (init 0) или перезагружена (init 6). Вместо init для смены уровня выполнения можно также использовать команду telinit. Функциональность и синтаксис идентичны.

Можно также изменить уровень выполнения при загрузке системы, передав его ядру Linux в качестве параметра через загрузчик. Например, в некоторых дистрибутивах достаточно добавить нужный уровень выполнения последним параметром в поле «Boot Options» меню загрузки GRUB. На рис. 6-16, например, цифра 3 добавлена в качестве последнего параметра загрузки. Это число передаётся процессу init и указывает ему, в какой уровень выполнения загружаться.

Рис. 6-16. Настройка уровня выполнения системы при загрузке.

Рис. 6-16. Настройка уровня выполнения системы при загрузке.

Далее рассмотрим процесс настройки служб для запуска на конкретных уровнях выполнения.

Настройка служб для автоматического запуска на заданном уровне выполнения (Configuring Services to Run by Default at a Specified Runlevel)

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

При установке демона — как в процессе установки системы, так и с помощью утилиты rpm — сценарий init копируется в каталог init (/etc/init.d или /etc/rc.d/init.d). Для настройки уровней выполнения, с которыми связан каждый из сценариев init, можно использовать команды insserv или chkconfig.

Команда insserv читает информацию из блока INIT INFO сценария init для определения уровней выполнения, на которых соответствующая служба должна работать по умолчанию. Блок INIT INFO сценария init для демона ntp в системе openSUSE показан в следующем примере:

### BEGIN INIT INFO
# Provides:       ntp ntpd xntpd
# Required-Start: $remote_fs $syslog $named
# Required-Stop: $remote_fs $syslog
# Should-Start: network-remotefs
# Should-Stop: network-remotefs
# Default-Start: 3 5
# Default-Stop:   0 1 2 6
# Short-Description: Network time protocol daemon (ntpd)
# Description:    Start network time protocol daemon (NTPD).
### END INIT INFO

Как видно из этого примера, блок INIT INFO предоставляет несколько ключевых сведений о демоне Linux:

  • Служба, которой управляет данный сценарий init (Provides)
  • Службы, которые должны быть запущены до запуска данной службы (Required-Start)
  • Уровни выполнения по умолчанию, на которых должен работать демон (Default-Start)
  • Уровни выполнения по умолчанию, на которых демон не должен работать (Default-Stop)

Параметры Default-Start и Default-Stop используются командой insserv для определения каталогов уровней выполнения, в которых должны быть созданы соответствующие стартовые сценарии и сценарии остановки. Основываясь на блоке INIT INFO из приведённого выше примера, команда insserv создаст ссылки стартовых сценариев в каталогах rc3.d и rc5.d, а также ссылки сценариев остановки в каталогах rc1.d и rc2.d.

Синтаксис использования insserv: insserv имя_службы. Эта команда активирует указанный демон на уровнях выполнения, перечисленных в директиве Default-Start блока INIT INFO сценария init службы. Кроме того, она деактивирует демон на уровнях выполнения, перечисленных в директиве Default-Stop.

Утилиту insserv также можно использовать для отключения службы (удаляя все ссылки на неё в различных каталогах rcx.d) и остановки службы, если она запущена. Синтаксис: insserv –r имя_службы.

Если служба уже включена и вы хотите изменить её уровни выполнения по умолчанию, это можно сделать с помощью insserv следующим образом:

  1. Откройте соответствующий сценарий init в каталоге сценариев init и отредактируйте параметры Default-Start и Default-Stop в блоке INIT INFO.
  2. Сохраните изменения в файле.
  3. Введите insserv –d имя_службы в приглашении командной строки.

После этого команда insserv пересоздаст соответствующие ссылки стартовых сценариев и сценариев остановки в различных каталогах rcx.d.

Также можно активировать демон с помощью insserv, полностью игнорируя параметры Default-Start и Default-Stop в его сценарии init. Для этого выполните следующие шаги:

  1. Если демон уже активирован на своих уровнях выполнения по умолчанию, удалите все ссылки стартовых сценариев и сценариев остановки, введя insserv –r имя_службы в приглашении командной строки.
  2. Создайте новые настраиваемые ссылки стартовых сценариев и сценариев остановки, введя insserv имя_службы,start=список_уровней_выполнения_через_запятую. Например, введите insserv ntp,start=3,5.

Помимо insserv, для управления уровнями выполнения демона можно использовать команду chkconfig. Чтобы просмотреть текущую конфигурацию уровней выполнения службы, введите chkconfig –l имя_демона в приглашении командной строки. Можно также ввести chkconfig –l для просмотра состояния всех демонов, установленных в системе. В следующем примере команда chkconfig используется для просмотра конфигурации уровней выполнения демона ntp:

ws1:/etc/init.d # chkconfig -l ntp
ntp                       0:off 1:off               2:off    3:off    4:off    5:off    6:off

Как видно здесь, служба ntp не настроена на запуск ни на одном уровне выполнения. Чтобы настроить демон на запуск на его уровнях выполнения по умолчанию, введите chkconfig имя_демона on. Можно также точно указать, на каких уровнях следует запускать демон, с помощью команды chkconfig. Например, предположим, мы хотим, чтобы демон ntp работал на уровнях выполнения 3 и 5. Это можно сделать, введя chkconfig –s ntp 35. Данная команда задаёт активацию службы ntp (указанной параметром –s) на уровнях выполнения 3 и 5:

ws1:/etc/init.d # chkconfig -s ntp 35
ws1:/etc/init.d # chkconfig -l ntp
ntp                       0:off 1:off               2:off    3:on     4:off    5:on     6:off

Для отключения службы введите chkconfig имя_службы off. Например, чтобы отключить ранее активированную службу ntp, введите chkconfig ntp off:

ws1:/etc/init.d # chkconfig ntp off
ws1:/etc/init.d # chkconfig -l ntp
ntp                       0:off 1:off               2:off    3:off    4:off    5:off    6:off

Можно также использовать chkconfig для просмотра конфигурации уровней выполнения всех служб, установленных в системе, просто введя chkconfig –l:

ws1:/etc/init.d # chkconfig -l
SuSEfirewall2_init        0:off            1:off    2:off    3:on     4:on     5:on     6:off
SuSEfirewall2_setup       0:off            1:off    2:off    3:on     4:on     5:on     6:off
aaeventd                  0:off            1:off    2:off    3:off    4:off    5:off    6:off
acpid                     0:off            1:off    2:on     3:on     4:off    5:on     6:off
alsasound                 0:off            1:off    2:on     3:on     4:off    5:on     6:off
atd                       0:off            1:off    2:off    3:off    4:off    5:off    6:off
auditd                    0:off            1:off    2:off    3:on     4:off    5:on     6:off
autofs                    0:off            1:off    2:off    3:off    4:off    5:off    6:off

Потренируемся работать с уровнями выполнения Linux в следующем упражнении.

Упражнение 6-3. Работа с уровнями выполнения Linux

В этом упражнении вы попрактикуетесь в управлении уровнями выполнения в системе Linux.

Примечание

Данное упражнение нельзя выполнить на виртуальных машинах, прилагаемых к этой книге. Для выполнения упражнения необходимо использовать более старый дистрибутив, использующий init вместо systemd.

VIDEO Посмотрите видео упражнения 6-3 с демонстрацией выполнения этого задания.

Выполните следующее:

  1. Загрузите систему Linux и войдите в систему как обычный пользователь.
  2. Откройте сеанс терминала.
  3. Переключитесь на учётную запись суперпользователя root, введя su – с последующим вводом пароля root.
  4. Потренируйтесь изменять текущий уровень выполнения из командной строки, выполнив следующее: a. Просмотрите текущий уровень выполнения, введя runlevel в приглашении командной строки. Первое число указывает предыдущий уровень выполнения системы; второе число — текущий уровень выполнения.

    Если вы установили графическую систему, текущий уровень выполнения должен быть 5. Если текстовую — 3. Если для первого параметра уровня выполнения отображается N, это означает, что система никогда не находилась на каком-либо другом уровне, кроме текущего.

    b. Переключитесь на уровень выполнения 3, введя init 3 в приглашении командной строки. c. Когда появится запрос, войдите в систему как суперпользователь root. d. Переключитесь обратно на уровень выполнения 5, введя init 5 в приглашении командной строки. e. Снова войдите в систему.

  5. Измените уровень выполнения по умолчанию на 3, выполнив следующее: a. Откройте сеанс терминала. b. В приглашении командной строки перейдите на учётную запись суперпользователя root с помощью команды su –. c. В приглашении командной строки введите vi /etc/inittab. d. Прокрутите до строки id:5:initdefault:. e. Нажмите Insert. f. Измените цифру 5 в этой строке на 3. g. Нажмите Esc и введите :exit. h. Перезагрузите систему, введя init 6 в приглашении командной строки.

    Система должна загрузиться в текстовую оболочку входа.

    i. Войдите в систему как суперпользователь root. j. В приглашении командной строки используйте vi для редактирования /etc/inittab и верните уровень выполнения по умолчанию обратно на 5. k. Выключите систему, введя init 0 в приглашении командной строки. l. Включите систему и снова войдите в систему как обычный пользователь.

  6. Потренируйтесь в активации демона ntp на уровнях выполнения 3 и 5 вашей системы. Демон ntp используется для синхронизации часов локальной системы Linux с часами других компьютерных систем. Выполните следующие шаги: a. Откройте сеанс терминала и перейдите на учётную запись суперпользователя root. b. В приглашении командной строки используйте утилиту rpm для проверки установки пакета ntp, введя rpm –q ntp. Если команда rpm вернёт имя и версию пакета, ntp установлен. Если не вернёт ничего — пакет не установлен.

    !!! note "Примечание" Если пакет ntp не установлен, воспользуйтесь шагами из главы 8 для установки пакета с DVD дистрибутива.

    c. В приглашении командной строки введите vi /etc/ntp.conf. d. Прокрутите до строк:

    server          127.127.1.0 #local clock (LCL)
    fudge           127.127.1.0 stratum 10 #LCL is unsynchronized
    
    e. Нажмите Insert. f. Добавьте новую строку после строки fudge. g. Добавьте следующую директиву на новой строке:
    server bigben.cac.washington.edu
    
    Эта директива настраивает службу ntp для синхронизации времени локального компьютера с временем публичного NTP-сервера bigben.cac.washington.edu в Интернете. h. Нажмите Esc и введите :exit. i. Запустите службу ntp, введя /etc/init.d/ntp restart или /etc/rc.d/init.d/ntp restart в приглашении командной строки. Вы должны увидеть сообщения о запуске демона и получении времени с bigben.cac.washington.edu:
    ws1:~ # /etc/init.d/ntp restart
    Shutting down network time protocol daemon (NTPD)
    done
    Time synchronized with bigben.cac.washington.edu
    Starting network time protocol daemon (NTPD)
    done
    ws1:~ #
    
    j. Настройте автоматический запуск демона ntp на уровнях выполнения 3 и 5, введя chkconfig –s ntp 35 в приглашении командной строки. k. Проверьте состояние демона ntp, введя chkconfig –l ntp в приглашении командной строки. Вы должны увидеть, что уровни выполнения 3 и 5 установлены в значение on:
    ws1:~ # chkconfig -l ntp
    ntp                                  0:off   1:off    2:off     3:on      4:off    5:on
    6:off
    ws1:~ #
    

Имея это в виду, теперь необходимо рассмотреть дистрибутивы Linux, использующие systemd вместо init.