Как использовать Systemctl для управления службами и модулями Systemd

Вступление

Systemd - это система инициализации и системный менеджер, которая широко становится новым стандартом для машин Linux. Несмотря на то, что существует множество мнений о том, является лиsystemd улучшением по сравнению с традиционными системами инициализацииSysV, которые он заменяет, большинство дистрибутивов планируют принять его или уже сделали.

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

В этом руководстве мы обсудим командуsystemctl, которая является центральным инструментом управления системой инициализации. Мы расскажем, как управлять сервисами, проверять состояния, изменять состояния системы и работать с файлами конфигурации.

Обратите внимание, что хотяsystemd стал системой инициализации по умолчанию для многих дистрибутивов Linux, он не реализован повсеместно во всех дистрибутивах. По мере прохождения этого руководства, если ваш терминал выдает ошибкуbash: systemctl is not installed, вероятно, на вашем компьютере установлена ​​другая система инициализации.

Управление Сервисом

Основная цель системы инициализации - инициализация компонентов, которые должны быть запущены после загрузки ядра Linux (традиционно называемые компонентами «пользовательского пространства»). Система init также используется для управления службами и демонами для сервера в любой момент, когда система работает. Имея это в виду, мы начнем с некоторых простых операций управления услугами.

Вsystemd целью большинства действий являются «единицы», то есть ресурсы, которымиsystemd знает, как управлять. Единицы классифицируются по типу ресурса, который они представляют, и они определяются с помощью файлов, известных как файлы единиц. Тип каждой единицы может быть выведен из суффикса в конце файла.

Для задач управления службами целевой единицей будет сервисная единица, которая имеет файлы единиц с суффиксом.service. Однако для большинства команд управления службами вы можете фактически опустить суффикс.service, посколькуsystemd достаточно умен, чтобы знать, что вы, вероятно, хотите работать со службой при использовании команд управления службами.

Запуск и остановка сервисов

Чтобы запустить службуsystemd, выполняя инструкции в файле модуля службы, используйте командуstart. Если вы работаете как пользователь без полномочий root, вам придется использоватьsudo, поскольку это повлияет на состояние операционной системы:

sudo systemctl start application.service

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

sudo systemctl start application

Хотя вы можете использовать приведенный выше формат для общего администрирования, для ясности мы будем использовать суффикс.service для остальных команд, чтобы точно указать цель, над которой мы работаем.

Чтобы остановить работающую в данный момент службу, вы можете вместо этого использовать командуstop:

sudo systemctl stop application.service

Перезапуск и перезагрузка

Чтобы перезапустить работающую службу, вы можете использовать командуrestart:

sudo systemctl restart application.service

Если рассматриваемое приложение может перезагрузить свои файлы конфигурации (без перезапуска), вы можете выполнить командуreload, чтобы запустить этот процесс:

sudo systemctl reload application.service

Если вы не уверены, есть ли у службы возможность перезагрузить конфигурацию, вы можете ввести командуreload-or-restart. Это перезагрузит конфигурацию на месте, если доступно. В противном случае он перезапустит службу, поэтому будет выбрана новая конфигурация:

sudo systemctl reload-or-restart application.service

Включение и отключение служб

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

sudo systemctl enable application.service

Это создаст символическую ссылку из системной копии служебного файла (обычно в/lib/systemd/system или/etc/systemd/system) на место на диске, гдеsystemd ищет файлы автозапуска (обычно/etc/systemd/system/some_target.target.wantsс. Мы рассмотрим, что является целью позже в этом руководстве).

Чтобы отключить автоматический запуск службы, введите:

sudo systemctl disable application.service

Это удалит символическую ссылку, которая указала, что служба должна быть запущена автоматически.

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

Проверка статуса услуг

Чтобы проверить статус службы в вашей системе, вы можете использовать командуstatus:

systemctl status application.service

Это предоставит вам состояние сервиса, иерархию cgroup и первые несколько строк журнала.

Например, при проверке состояния сервера Nginx вы можете увидеть вывод наподобие этого:

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2015-01-27 19:41:23 EST; 22h ago
 Main PID: 495 (nginx)
   CGroup: /system.slice/nginx.service
           ├─495 nginx: master process /usr/bin/nginx -g pid /run/nginx.pid; error_log stderr;
           └─496 nginx: worker process
Jan 27 19:41:23 desktop systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 27 19:41:23 desktop systemd[1]: Started A high performance web server and a reverse proxy server.

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

Существуют также методы для проверки конкретных состояний. Например, чтобы проверить, активен ли в данный момент (работает) объект, вы можете использовать командуis-active:

systemctl is-active application.service

Это вернет текущее состояние устройства, которое обычно составляетactive илиinactive. Код выхода будет «0», если он активен, что упростит программный синтаксический анализ результата.
Чтобы узнать, включен ли модуль, вы можете использовать командуis-enabled:

systemctl is-enabled application.service

Это выведет, является ли службаenabled илиdisabled, и снова установит код выхода на «0» или «1» в зависимости от ответа на вопрос команды.

Третья проверка - находится ли устройство в неисправном состоянии. Это указывает на то, что возникла проблема с запуском рассматриваемого устройства:

systemctl is-failed application.service

Это вернетactive, если он работает правильно, илиfailed, если произошла ошибка. Если блок был намеренно остановлен, он может вернутьunknown илиinactive. Состояние выхода «0» означает, что произошел сбой, а состояние выхода «1» означает любой другой статус.

Обзор состояния системы

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

Список текущих единиц

Чтобы увидеть список всех активных юнитов, о которых знаетsystemd, мы можем использовать командуlist-units:

systemctl list-units

Это покажет вам список всех модулей, которыеsystemd в настоящее время активны в системе. Вывод будет выглядеть примерно так:

UNIT                                      LOAD   ACTIVE SUB     DESCRIPTION
atd.service                               loaded active running ATD daemon
avahi-daemon.service                      loaded active running Avahi mDNS/DNS-SD Stack
dbus.service                              loaded active running D-Bus System Message Bus
dcron.service                             loaded active running Periodic Command Scheduler
dkms.service                              loaded active exited  Dynamic Kernel Modules System
[email protected]                        loaded active running Getty on tty1
. . .

Вывод имеет следующие столбцы:

  • UNIT: имя юнитаsystemd

  • LOAD: была ли проанализирована конфигурация устройстваsystemd. Конфигурация загруженных блоков сохраняется в памяти.

  • ACTIVE: сводное состояние о том, активен ли модуль. Обычно это довольно простой способ определить, успешно ли запущен модуль или нет.

  • SUB: это состояние нижнего уровня, которое указывает более подробную информацию об устройстве. Это часто зависит от типа устройства, состояния и фактического метода, в котором работает устройство.

  • DESCRIPTION: краткое текстовое описание того, что это / делает модуль.

Поскольку командаlist-units по умолчанию показывает только активные единицы, для всех приведенных выше записей в столбце НАГРУЗКА будет указано «загружено», а в столбце «АКТИВНО» - «активно». Это отображение фактически является поведениемsystemctl по умолчанию при вызове без дополнительных команд, поэтому вы увидите то же самое, если вызоветеsystemctl без аргументов:

systemctl

Мы можем указатьsystemctl выводить различную информацию, добавив дополнительные флаги. Например, чтобы увидеть все модули, которыеsystemd загрузил (или пытался загрузить), независимо от того, активны ли они в данный момент, вы можете использовать флаг--all, например:

systemctl list-units --all

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

Вы можете использовать другие флаги для фильтрации этих результатов. Например, мы можем использовать флаг--state=, чтобы указать состояния LOAD, ACTIVE или SUB, которые мы хотим видеть. Вам нужно будет сохранить флаг--all, чтобыsystemctl позволял отображать неактивные единицы:

systemctl list-units --all --state=inactive

Другой распространенный фильтр - это фильтр--type=. Мы можем указатьsystemctl отображать только единицы того типа, который нас интересует. Например, чтобы увидеть только активные сервисные единицы, мы можем использовать:

systemctl list-units --type=service

Перечисление всех файлов модуля

Командаlist-units отображает только единицы, которыеsystemd пытался проанализировать и загрузить в память. Посколькуsystemd будет читать только те модули, которые, по его мнению, ему необходимы, это не обязательно будет включать все доступные модули в системе. Чтобы увидеть доступный файл модуляevery в путяхsystemd, включая те, которыеsystemd не пытался загрузить, вы можете вместо этого использовать командуlist-unit-files:

systemctl list-unit-files

Единицы представляют собой ресурсы, о которых знаетsystemd. Посколькуsystemd не обязательно прочитал все определения модулей в этом представлении, он представляет только информацию о самих файлах. Вывод имеет два столбца: файл модуля и состояние.

UNIT FILE                                  STATE
proc-sys-fs-binfmt_misc.automount          static
dev-hugepages.mount                        static
dev-mqueue.mount                           static
proc-fs-nfsd.mount                         static
proc-sys-fs-binfmt_misc.mount              static
sys-fs-fuse-connections.mount              static
sys-kernel-config.mount                    static
sys-kernel-debug.mount                     static
tmp.mount                                  static
var-lib-nfs-rpc_pipefs.mount               static
org.cups.cupsd.path                        enabled
. . .

Состояние обычно будет «включено», «отключено», «статично» или «замаскировано». В этом контексте статический означает, что файл модуля не содержит раздела «установка», который используется для включения модуля. Таким образом, эти устройства не могут быть включены. Обычно это означает, что модуль выполняет одноразовое действие или используется только как зависимость от другого модуля и не должен запускаться сам по себе.

Мы кратко рассмотрим, что означает «замаскированный».

Управление подразделением

До сих пор мы работали со службами и отображали информацию об объектах и ​​файлах объектов, о которых знаетsystemd. Тем не менее, мы можем узнать более конкретную информацию о юнитах, используя некоторые дополнительные команды.

Отображение файла модуля

Чтобы отобразить файл модуля, которыйsystemd загрузил в свою систему, вы можете использовать командуcat (она была добавлена ​​вsystemd версии 209). Например, чтобы увидеть файл модуля демона планированияatd, мы могли бы ввести:

systemctl cat atd.service
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target

Результатом является файл модуля, известный текущему запущенному процессуsystemd. Это может быть важно, если вы недавно изменили файлы модулей или если вы переопределяете определенные параметры во фрагменте файла модулей (мы рассмотрим это позже).

Отображение зависимостей

Чтобы увидеть дерево зависимостей юнита, вы можете использовать командуlist-dependencies:

systemctl list-dependencies sshd.service

Это отобразит иерархию, отображающую зависимости, с которыми необходимо разобраться, чтобы запустить рассматриваемый модуль. Зависимости, в этом контексте, включают те единицы, которые требуются или требуются единицами над ним.

sshd.service
├─system.slice
└─basic.target
  ├─microcode.service
  ├─rhel-autorelabel-mark.service
  ├─rhel-autorelabel.service
  ├─rhel-configure.service
  ├─rhel-dmesg.service
  ├─rhel-loadmodules.service
  ├─paths.target
  ├─slices.target
. . .

Рекурсивные зависимости отображаются только для единиц.target, которые указывают на состояние системы. Чтобы рекурсивно перечислить все зависимости, включите флаг--all.

Чтобы показать обратные зависимости (единицы измерения, которые зависят от указанной единицы), вы можете добавить к команде флаг--reverse. Другие полезные флаги - это флаги--before и--after, которые можно использовать для отображения единиц, зависящих от указанной единицы, начиная до и после себя, соответственно.

Проверка свойств объекта

Чтобы увидеть низкоуровневые свойства юнита, вы можете использовать командуshow. Это отобразит список свойств, которые установлены для указанного блока, используя форматkey=value:

systemctl show sshd.service
Id=sshd.service
Names=sshd.service
Requires=basic.target
Wants=system.slice
WantedBy=multi-user.target
Conflicts=shutdown.target
Before=shutdown.target multi-user.target
After=syslog.target network.target auditd.service systemd-journald.socket basic.target system.slice
Description=OpenSSH server daemon
. . .

Если вы хотите отобразить одно свойство, вы можете передать флаг-p с именем свойства. Например, чтобы увидеть конфликты, которые есть у модуляsshd.service, вы можете ввести:

systemctl show sshd.service -p Conflicts
Conflicts=shutdown.target

Маскирующие и демаскирующие устройства

В разделе управления службами мы видели, как остановить или отключить службу, ноsystemd также может пометить устройство какcompletely как не запускаемое, автоматически или вручную, связав его с/dev/null . Это называется маскированием объекта и возможно с помощью командыmask:

sudo systemctl mask nginx.service

Это предотвратит запуск службы Nginx, автоматически или вручную, до тех пор, пока она маскируется.

Если вы отметитеlist-unit-files, вы увидите, что служба теперь указана как замаскированная:

systemctl list-unit-files
. . .
kmod-static-nodes.service              static
ldconfig.service                       static
mandb.service                          static
messagebus.service                     static
nginx.service                          masked
quotaon.service                        static
rc-local.service                       static
rdisc.service                          disabled
rescue.service                         static
. . .

Если вы попытаетесь запустить службу, вы увидите следующее сообщение:

sudo systemctl start nginx.service
Failed to start nginx.service: Unit nginx.service is masked.

Чтобы демаскировать юнит и снова сделать его доступным для использования, просто используйте командуunmask:

sudo systemctl unmask nginx.service

Это вернет устройство в его предыдущее состояние, позволяя запустить или включить его.

Редактирование файлов юнитов

Хотя конкретный формат файлов модулей выходит за рамки этого руководства,systemctl предоставляет встроенные механизмы для редактирования и изменения файлов модулей, если вам нужно внести изменения. Эта функция была добавлена ​​вsystemd версии 218.

Командаedit по умолчанию открывает фрагмент файла модуля для рассматриваемого модуля:

sudo systemctl edit nginx.service

Это будет пустой файл, который можно использовать для переопределения или добавления директив к определению модуля. В каталоге/etc/systemd/system будет создан каталог, содержащий имя устройства с добавленным.d. Например, дляnginx.service будет создан каталог с именемnginx.service.d.

В этом каталоге будет создан фрагмент с именемoverride.conf. Когда модуль загружен,systemd в памяти объединит фрагмент переопределения с полным файлом модуля. Директивы сниппета будут иметь приоритет над директивами, найденными в исходном файле модуля.

Если вы хотите отредактировать полный файл модуля вместо создания сниппета, вы можете передать флаг--full:

sudo systemctl edit --full nginx.service

Это загрузит текущий файл модуля в редактор, где он может быть изменен. Когда редактор закроется, измененный файл будет записан в/etc/systemd/system, который будет иметь приоритет над определением модуля системы (обычно находится где-то в/lib/systemd/system).

Чтобы удалить любые внесенные вами дополнения, удалите каталог конфигурации устройства.d или измененный служебный файл из/etc/systemd/system. Например, чтобы удалить фрагмент, мы могли бы набрать:

sudo rm -r /etc/systemd/system/nginx.service.d

Чтобы удалить полностью измененный файл модуля, мы должны набрать:

sudo rm /etc/systemd/system/nginx.service

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

sudo systemctl daemon-reload

Настройка состояния системы (уровень выполнения) с помощью целей

Цели - это специальные файлы модулей, которые описывают состояние системы или точку синхронизации. Как и другие модули, файлы, определяющие цели, можно идентифицировать по их суффиксу, которым в данном случае является.target. Цели сами по себе мало что делают, а вместо этого используются для группировки других юнитов.

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

Например, естьswap.target, который используется, чтобы указать, что своп готов к использованию. Блоки, которые являются частью этого процесса, могут синхронизироваться с этой целью, указав в своей конфигурации, что ониWantedBy= илиRequiredBy=swap.target. Модули, для которых требуется свопинг, могут указать это условие с помощью спецификацийWants=,Requires= иAfter=, чтобы указать характер их взаимосвязи.

Получение и установка цели по умолчанию

У процессаsystemd есть цель по умолчанию, которую он использует при загрузке системы. Удовлетворение каскада зависимостей от этой единственной цели приведет систему в нужное состояние. Чтобы найти цель по умолчанию для вашей системы, введите:

systemctl get-default
multi-user.target

Если вы хотите установить другую цель по умолчанию, вы можете использоватьset-default. Например, если у вас установлен графический рабочий стол и вы хотите, чтобы система загружалась на него по умолчанию, вы можете соответствующим образом изменить цель по умолчанию:

sudo systemctl set-default graphical.target

Список доступных целей

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

systemctl list-unit-files --type=target

В отличие от уровней выполнения, несколько целей могут быть активными одновременно. Активная цель указывает, чтоsystemd попытался запустить все отряды, привязанные к цели, и не пытался снова их уничтожить. Чтобы увидеть все активные цели, введите:

systemctl list-units --type=target

Изолирующие цели

Можно запустить все юниты, связанные с целью, и остановить все юниты, которые не являются частью дерева зависимостей. Команда, которая нам нужна для этого, называется, соответственно,isolate. Это похоже на изменение уровня выполнения в других системах инициализации.

Например, если вы работаете в графической среде с активнымgraphical.target, вы можете выключить графическую систему и перевести систему в состояние многопользовательской командной строки, изолировавmulti-user.target. Посколькуgraphical.target зависит отmulti-user.target, но не наоборот, все графические блоки будут остановлены.

Возможно, вы захотите взглянуть на зависимости цели, которую вы изолируете, прежде чем выполнять эту процедуру, чтобы убедиться, что вы не останавливаете жизненно важные службы:

systemctl list-dependencies multi-user.target

Когда вы будете удовлетворены единицами, которые будут поддерживаться в живых, вы можете изолировать цель, набрав:

sudo systemctl isolate multi-user.target

Использование ярлыков для важных событий

Существуют цели, определенные для важных событий, таких как выключение или перезагрузка. Однакоsystemctl также имеет несколько ярлыков, которые добавляют немного дополнительных функций.

Например, чтобы перевести систему в режим восстановления (однопользовательский), вы можете просто использовать командуrescue вместоisolate rescue.target:

sudo systemctl rescue

Это обеспечит дополнительную функциональность оповещения всех зарегистрированных пользователей о событии.

Чтобы остановить систему, вы можете использовать командуhalt:

sudo systemctl halt

Чтобы инициировать полное выключение, вы можете использовать командуpoweroff:

sudo systemctl poweroff

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

sudo systemctl reboot

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

Например, чтобы перезагрузить систему, вы обычно можете набрать:

sudo reboot

Заключение

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

Хотяsystemctl работает в основном с основным процессомsystemd, в экосистемеsystemd есть другие компоненты, которые контролируются другими утилитами. Другие возможности, такие как управление журналами и пользовательские сеансы, обрабатываются отдельными демонами и утилитами управления (journald /journalctl иlogind /loginctl соответственно). Потратив некоторое время на ознакомление с этими другими инструментами и демонами, вы упростите управление.