В последнее время дистрибутивы Linux широко используют систему инициализации systemd. Эта система является быстрой и гибкой моделью инициализации, которая позволяет управлять всеми сервисами машины.
Данное руководство охватывает наиболее важные команды systemd. Эта система включена в дистрибутивы Ubuntu 15.04 и выше, Debian 8, CentOS 7, Fedora 15.
Основы управления юнитами
Базовыми компонентами, которыми управляет systemd, являются юниты (unit). Существует множество типов юнитов; самым распространённым типом является сервис (файлы с расширением .service). основным инструментом для управления сервисами является команда systemctl.
Команда systemctl имеет свой эквивалент для каждой стандартной команды системы инициализации. В качестве примера рассмотрим файл nginx.service.
Примечание: Чтобы получить этот файл, установите Nginx.
Чтобы запустить сервис, введите:
sudo systemctl start nginx.service
Чтобы остановить сервис:
sudo systemctl stop nginx.service
Перезапустить сервис можно так:
sudo systemctl restart nginx.service
Чтобы выполнить перезагрузку, не прерывая работы, введите:
sudo systemctl reload nginx.service
Включение и отключение юнитов
По умолчанию большинство юнитов systemd не запускается автоматически. Чтобы настроить автозапуск юнита, нужно его включить. Это соединит юнит с определённым целевым компонентом, и тогда юнит будет запускаться вместе с ним.
Чтобы настроить автозапуск сервиса, введите:
sudo systemctl enable nginx.service
Чтобы отключить сервис:
sudo systemctl disable nginx.service
Состояние системы
Сервер systemd может предоставить информацию, на основе которой можно сделать вывод о текущем состоянии системы.
К примеру, чтобы получить список всех активных юнит-файлов systemd, введите:
systemctl list-units
Чтобы просмотреть список всех юнитов, которые система systemd загрузила или попыталась загрузить в память (включая неактивные юниты), введите:
systemctl list-units --all
Чтобы вывести на экран список всех установленных юнитов (включая те, которые система systemd не загрузила в память), наберите:
systemctl list-unit-files
Просмотр логов
Компонент systemd под названием journald собирает и управляет общесистемными записями в журнале – то есть данными логов приложений и ядра.
Чтобы просмотреть все записи, начиная с самой старой записи, введите:
journalctl
По умолчанию эта команда выведет записи текущей и предыдущих загрузок (если инструмент journald настроен для сохранения записей от предыдущих загрузок). Некоторые дистрибутивы включают это поведение по умолчанию, а некоторые – нет. Чтобы включить сохранение записей от предыдущих загрузок, можно:
- Отредактировать файл /etc/systemd/journald.conf. Измените значение параметра Storage=, указав persistent.
- Создать постоянный каталог при помощи команды:
sudo mkdir -p /var/log/journal
Чтобы просмотреть только записи текущей загрузки, введите:
journalctl -b
Записи ядра (которые, как правило, представлены как dmesg) можно просмотреть при помощи команды:
journalctl -k
Если совместить флаги -k и –b, можно получить записи ядра только для текущей загрузки.
journalctl -k -b
Состояние юнитов
Приведенные выше команды дают доступ к информации об общем состоянии системы. Также команда systemctl позволяет получить данные о состоянии отдельных юнитов.
Чтобы узнать текущее состояние юнита, используйте опцию status. Команда вернёт состояние юнита (включен или отключен), сведения о процессе и последние записи в журнале:
systemctl status nginx.service
Чтобы просмотреть все записи в журнале, сделанные определённым юнитом, используйте флаг –u и команду journalctl:
journalctl -u nginx.service
Как и ранее, ограничить вывод текущей загрузкой можно с помощью флага –b:
journalctl -b -u nginx.service
Проверка юнитов и юнит-файлов
Теперь вы знаете, как запускать и останавливать юниты, как просматривать их состояние и записи журнала, чтобы получить представление о том, что происходит с этим процессом. Пора научиться проверять другие аспекты юнитов и юнит-файлов.
Каждый юнит-файл содержит параметры, при помощи которых система systemd может запустить и остановить его. Чтобы просмотреть содержимое юнит-файла, введите:
systemctl cat nginx.service
Чтобы просмотреть дерево зависимостей юнита (которые будут включены системой systemd во время запуска юнита), введите:
systemctl list-dependencies nginx.service
Эта команда покажет список зависимых юнитов и юниты target (целевые). Чтобы получить расширенный список зависимостей, введите:
systemctl list-dependencies --all nginx.service
Чтобы просмотреть детали настроек юнита, используйте следующую опцию:
systemctl show nginx.service
Эта команда вернёт значения всех параметров, которыми управляет systemd.
Изменение юнит-файлов
Система systemd позволяет изменять юнит-файлы с помощью команды systemctl.
Чтобы добавить сниппет юнит-файла, который в дальнейшем можно использовать для расширения или переопределения параметров стандартных юнит-файлов, используйте опцию edit:
sudo systemctl edit nginx.service
Чтобы полностью отредактировать содержимое файла, не создавая сниппет, используйте флаг –full:
sudo systemctl edit --full nginx.service
Отредактировав юнит-файл, перезапустите процесс systemd, чтобы изменения вступили в силу:
sudo systemctl daemon-reload
Уровни выполнения
Ещё одной важной функцией системы инициализации является переход самого сервера между различными состояниями. В традиционных системах инициализации это обычно называется уровнями выполнения; система может одновременно находиться только на одном уровне выполнения.
В системе systemd концепция уровней выполнения заменена так называемыми целями (targets). Цели – это точки синхронизации, при помощи которых сервер может переключать состояния. Сервисы и другие юнит-файлы можно привязывать к целям. Кроме того, система может использовать несколько целей однвременно.
Чтобы просмотреть доступные цели, введите:
systemctl list-unit-files --type=target
Чтобы просмотреть цель по умолчанию, которую система systemd использует сразу после запуска (она в свою очередь запускает все юнит-файлы, которые являются частью её дерева зависимостей), введите:
systemctl get-default
Чтобы изменить цель по умолчанию, используйте опцию set-default:
sudo systemctl set-default multi-user.target
Чтобы просмотреть юниты, привязанные к цели, введите:
systemctl list-dependencies multi-user.target
С помощью опции isolate можно переключать цели. Однако прежде чем переключить цель, убедитесь, что новая цель не отключит важнейшие сервисы.
sudo systemctl isolate multi-user.target
Остановка и перезапуск сервера
Также система инициализации может использовать сокращённые команды. К примеру, чтобы отключить сервер, введите:
sudo systemctl poweroff
Если вы хотите перезапустить сервер, введите:
sudo systemctl reboot
Чтобы запустить сервер в режиме восстановления, наберите:
sudo systemctl rescue
Большинство операционных систем может использовать традиционные алиасы для наиболее распространённых операций. То есть, вы можете опустить команду systemctl и ввести просто:
sudo poweroff
sudo reboot
Однако имейте в виду: эта функция поддерживается не всегда.
Заключение
Теперь вы знакомы с основными функциями и командами systemd. Конечно, данное руководство не предоставляет полной информации об этой системе инициализации.
Развивая навыки работы с системой инициализации, вы получаете возможность управлять состоянием сервера, его сервисами и процессами.