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

6.4 Управление целями загрузки Linux (Managing Linux Boot Targets)

В дополнение к традиционному демону init, который управляет практически всем в вашей системе Linux, вместо init можно использовать два альтернативных демона для управления запуском задач и уровнями выполнения в Linux:

  • Upstart
  • systemd

Upstart был представлен в середине 2000-х годов и был принят весьма прохладно. Главная проблема состояла в том, что он разительно отличался от init и требовал значительных усилий для освоения. В результате лишь очень ограниченное число дистрибутивов Linux по-прежнему его использует.

Однако systemd появился лишь несколько лет назад и фактически занял господствующее положение. Большинство дистрибутивов Linux сегодня начали переход от init к systemd. Как и Upstart, systemd является заменой традиционного демона init. Однако, в отличие от Upstart, systemd может функционировать как полнозначная замена init. Если вы знакомы с init, переход на systemd окажется значительно менее болезненным.

Одно из преимуществ systemd — возможность загружать службы параллельно при запуске системы. Традиционный процесс init запускает службы по одной в последовательном порядке. Параллельный запуск служб позволяет значительно сократить время, необходимое для приведения системы в рабочее состояние. Демон systemd также поддерживает снимки состояния (snapshots), которые предоставляют возможность при необходимости восстановить состояние системы.

В связи с широкой распространённостью systemd мы сосредоточимся именно на нём в этой главе. Необходимо рассмотреть следующие темы:

  • Управление целями загрузки
  • Управление службами

Начнём с того, как управлять уровнями выполнения в системе Linux, использующей systemd.

Управление целями загрузки (Managing Boot Targets)

Если вы знакомы с уровнями выполнения в init, то работа с уровнями выполнения в systemd будет для вас достаточно понятной. Команды для управления уровнями выполнения в systemd отличаются, однако концепции схожи. Одна из ключевых особенностей systemd состоит в том, что он использует концепцию целей загрузки (boot targets), которые функционируют аналогично уровням выполнения. Каждая цель загрузки представлена файлом в /usr/lib/systemd/system с расширением .target. В приведённом ниже списке традиционные уровни выполнения init показаны вместе с соответствующими файлами целей загрузки systemd:

  • runlevel 3 = multi-user.target или runlevel3.target
  • runlevel 5 = graphical.target или runlevel5.target

Обратите внимание, что для каждого уровня выполнения предусмотрено два файла целей. Следует знать, что runlevel3.target — это лишь символьная ссылка, указывающая на файл multi-user.target. Аналогично, файл runlevel5.target является символьной ссылкой, указывающей на файл graphical.target.

В системе, использующей systemd, для управления службами и уровнями выполнения применяется команда systemctl. Вместо init, chkconfig или service для управления большинством аспектов системы на базе systemd используется systemctl. Например, для смены уровней выполнения нужно выполнить systemctl и указать конкретную цель загрузки. Синтаксис: systemctl isolate цель_загрузки.

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

  • systemctl isolate runlevel5.target
  • systemctl isolate graphical.target

И точно так же, как в случае с традиционным процессом init, изменение цели загрузки «на лету» с помощью systemd изменяет только текущий уровень выполнения. При перезагрузке системы она снова загрузится в уровень выполнения по умолчанию. В systemd для задания уровня выполнения по умолчанию файл inittab больше не используется. Вместо этого файл /etc/systemd/system/default.target управляет целью загрузки по умолчанию. Как видно из следующего примера, этот файл фактически является символьной ссылкой, указывающей на файл цели загрузки, который должен использоваться по умолчанию:

openSUSE:/etc/systemd/system # ls -l default.target
lrwxrwxrwx 1 root root 40 Nov 12 09:05 default.target ->
/usr/lib/systemd/system/runlevel5.target

Примечание

Некоторые дистрибутивы, использующие systemd, по-прежнему сохраняют файл inittab для обратной совместимости.

Чтобы изменить цель загрузки по умолчанию, необходимо изменить файл загрузки, на который указывает данная символьная ссылка. Это делается с помощью команды systemctl set-default цель_загрузки. Например, чтобы задать в качестве цели загрузки по умолчанию графический режим, следует ввести systemctl set-default graphical.target или systemctl set-default runlevel5.target.

Чтобы просмотреть текущий уровень выполнения, введите systemctl get-default. Пример показан здесь:

openSUSE:/etc/systemd/system # systemctl get-default
runlevel5.target

Рассмотрим теперь управление службами в системе Linux, использующей systemd.

Управление службами (Managing Services)

Управление системными демонами в системе на базе systemd осуществляется примерно так же, как и в системе на базе init. Однако используемая команда отличается. Если вам нужно остановить, запустить, перезапустить службу или просмотреть её состояние, введите systemctl, затем выполняемое действие, а затем имя службы. Используйте следующий синтаксис:

  • Для запуска службы введите systemctl start служба.service. Например, чтобы запустить демон ntp, введите systemctl start ntp.service.
  • Для остановки службы введите systemctl stop служба.service. Например, чтобы остановить демон ntp, введите systemctl stop ntp.service.
  • Для перезапуска службы введите systemctl restart служба.service. Например, чтобы перезапустить демон ntp, введите systemctl restart ntp.service.
  • Для проверки состояния службы введите systemctl status служба.service. Например, чтобы проверить состояние демона ntp, введите systemctl status ntp.service.

Команду systemctl можно также использовать для включения или отключения конкретной службы при загрузке системы, а также для проверки того, включена ли она. Для этого используются следующие команды:

  • Для включения службы при запуске системы введите systemctl enable служба.service. Например, чтобы включить демон ntp при загрузке системы, введите systemctl enable ntp.service.
  • Для отключения службы при запуске системы введите systemctl disable служба.service. Например, чтобы отключить демон ntp при загрузке системы, введите systemctl disable ntp.service.
  • Чтобы проверить, включена ли служба при запуске системы, введите systemctl is-enabled служба.service. Например, чтобы проверить состояние демона ntp, введите systemctl is-enabled ntp.service.

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

В этом упражнении вы попрактикуетесь в управлении целями загрузки в вашей системе Linux. Упражнение можно выполнить на виртуальной машине, прилагаемой к данной книге. Запустите снимок 6-2 для получения правильно настроенной среды.

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

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

  1. Загрузите систему Linux и войдите в систему как обычный пользователь с паролем student.
  2. Откройте сеанс терминала.
  3. Переключитесь на учётную запись суперпользователя root, введя su – с последующим вводом пароля суперпользователя root (student).
  4. Измените цель загрузки по умолчанию на эквивалент уровня выполнения 3, выполнив следующее: a. Откройте сеанс терминала. b. В приглашении командной строки перейдите на учётную запись суперпользователя root с помощью команды su –. c. В приглашении командной строки введите systemctl set-default multi-user.target. d. Перезагрузите систему, введя init 6 в приглашении командной строки.

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

    e. Войдите в систему как суперпользователь root. f. В приглашении командной строки используйте команду systemctl для изменения цели загрузки по умолчанию обратно на графическую. g. Выключите систему, введя init 0 в приглашении командной строки. Снова обратите внимание, что команда работает, хотя система не использует демон init. h. Включите систему и снова войдите в систему как обычный пользователь.

  5. Потренируйтесь в включении демона ntp при загрузке системы. Выполните следующее: a. Откройте сеанс терминала и перейдите на учётную запись суперпользователя root. b. В приглашении командной строки введите vi /etc/ntp.conf. c. Прокрутите до строк:

    server         127.127.1.0 #local clock (LCL)
    fudge          127.127.1.0 stratum 10 #LCL is unsynchronized
    
    d. Нажмите Insert. e. Добавьте новую строку после строки fudge. f. Добавьте следующую директиву на новой строке:
    server bigben.cac.washington.edu
    
    Эта директива настраивает службу ntp для синхронизации времени локального компьютера с временем публичного NTP-сервера bigben.cac.washington.edu в Интернете. g. Нажмите Esc, затем введите :exit. h. Запустите службу ntp, введя systemctl start ntp.service в приглашении командной строки. i. Проверьте состояние демона ntp, введя systemctl status ntp.service в приглашении командной строки.

Завершим эту главу обсуждением процедуры завершения работы системы Linux.