Введение в systemd: Практическое руководство
Введение в systemd: раздел команд 1. Происхождение II. Обзор Systemd Три. Системное управление 3.1 systemctl 3.2 systemd-analyze 3.3 hostnamectl 3.4 localectl 3.5 timedatectl 3.6 loginctl Четыре, единица 4.1 Значение Состояние блока 4.2 4.3 Управление единицей 4.4 Зависимости Пять. Конфигурационный файл Unit 5.1 Обзор 5.2 Состояние конфигурационного файла 5.3 Формат конфигурационного файла 5.4 Блоки конфигурационного файла Шесть, цель Семь. Управление журналами Информация о документе
Автор: Руань Ифэн
Дата: 7 марта 2016 года
Systemd — это инструмент для Linux-систем, используемый для запуска. демон стал стандартной конфигурацией для большинства дистрибутивов.
В этой статье представлено его основное использование, она разделена на две части. Сегодня мы расскажем о его основных командах, Следующая статья. Представьте, как это использовать на практике.
В истории,
Загрузка Linux
постоянно использовать
init
Процесс.
Следующая команда используется для запуска службы.
xxxxxxxxxx
$ sudo /etc/init.d/apache2 start
# Или
$ service apache2 start
У этого метода есть два недостатка.
Во-первых, долгое время запуска.
init
Процессы запускаются последовательно, только после завершения запуска предыдущего процесса запускается следующий процесс.
Во-вторых, сложен скрипт запуска.
init
Процесс просто выполняет стартовый скрипт, не обращая внимания на другие дела. Скрипт должен сам обрабатывать различные ситуации, что часто делает его очень длинным.
Systemd был создан для решения этих проблем. Его основной целью является предоставление полного решения для запуска и управления системой.
Согласно традициям Linux, буква
d
Это сокращение от демона (daemon). Название Systemd означает, что он должен охранять всю систему.
(На изображении автор Systemd) Lennart Poettering )
Используя Systemd, больше не нужно использовать.
init
Системd заменил
initd
Он становится первым процессом системы (PID равен 1), остальные процессы являются его дочерними процессами.
xxxxxxxxxx
$ systemctl --version
Команда выше позволяет просмотреть версию Systemd.
Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的 Философия Unix
(На верхнем изображении схема архитектуры Systemd)
Systemd — это не одна команда, а набор команд, охватывающих все аспекты системного управления.
systemctl
Это основная команда Systemd, используемая для управления системой.
xxxxxxxxxx
# Перезагрузить систему
$ sudo systemctl reboot
# Выключите систему, отключите питание.
$ sudo systemctl poweroff
# ЦПУ перестал работать
$ sudo systemctl halt
# Приостановить систему
$ sudo systemctl suspend
# Перевести систему в спящий режим
$ sudo systemctl hibernate
# Перевести систему в интерактивный режим сна
$ sudo systemctl hybrid-sleep
# Запуск в режим восстановления (однопользовательский режим)
$ sudo systemctl rescue
systemd-analyze
Команда используется для просмотра времени загрузки.
xxxxxxxxxx
# Просмотр времени загрузки
$ systemd-analyze
# Просмотр времени запуска каждого сервиса
$ systemd-analyze blame
# Отображение процесса запуска в виде водопада
$ systemd-analyze critical-chain
# Показать поток запуска указанной службы
$ systemd-analyze critical-chain atd.service
hostnamectl
Команда используется для просмотра информации о текущем хосте.
xxxxxxxxxx
# Показать информацию о текущем хосте
$ hostnamectl
# Установите имя хоста.
$ sudo hostnamectl set-hostname rhel7
localectl
Команда используется для просмотра настроек локализации.
xxxxxxxxxx
# Просмотреть настройки локализации
$ localectl
# Установить параметры локализации.
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB
timedatectl
Команда используется для просмотра текущих настроек часового пояса.
# Просмотреть текущие настройки часового пояса
$ timedatectl
# Показать все доступные часовые пояса
$ timedatectl list-timezones
# Установить текущий часовой пояс
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
loginctl
Команда используется для просмотра текущих вошедших пользователей.
xxxxxxxxxx
# Перечислить текущие сеансы
$ loginctl list-sessions
# Перечислить текущих пользователей системы
$ loginctl list-users
# Вывести информацию о указанном пользователе
$ loginctl show-user ruanyf
Systemd может управлять всеми системными ресурсами. Разные ресурсы обобщаются под названием Unit (единица).
Единица делится на 12 типов.
systemctl list-units
Команда может показать все юниты текущей системы.
xxxxxxxxxx
# Перечислить запущенные единицы
$ systemctl list-units
# Перечислить все Unit, включая те, для которых не найден файл конфигурации или которые не удалось запустить.
$ systemctl list-units --all
# Перечислите все неработающие блоки.
$ systemctl list-units --all --state=inactive
# Перечислите все не загруженные единицы
$ systemctl list-units --failed
# Перечислить все запущенные юниты типа service
$ systemctl list-units --type=service
systemctl status
Команда используется для просмотра состояния системы и состояния отдельного юнита.
xxxxxxxxxx
# Показать состояние системы
$ systemctl status
# Показать состояние отдельного блока
$ sysystemctl status bluetooth.service
# Показать состояние определенного юнита удаленного хоста
$ systemctl -H root@rhel7.example.com status httpd.service
кроме
status
команда,
systemctl
Также предоставлены три простых метода для проверки состояния, которые в основном предназначены для использования в условных операторах внутри скрипта.
xxxxxxxxxx
# Показать, работает ли данный юнит
$ systemctl is-active application.service
# Отображение, находится ли определенный юнит в состоянии сбоя при запуске
$ systemctl is-failed application.service
# Показать, установлен ли символ запуска для службы Unit
$ systemctl is-enabled application.service
Для пользователей наиболее часто используемыми являются следующие команды для запуска и остановки Unit (в основном service).
xxxxxxxxxx
# Немедленно запустите службу
$ sudo systemctl start apache.service
# Немедленно остановить службу
$ sudo systemctl stop apache.service
# Перезапустить службу
$ sudo systemctl restart apache.service
Убить все дочерние процессы службы.
$ sudo systemctl kill apache.service
# Перезагрузить конфигурационный файл сервиса
$ sudo systemctl reload apache.service
# Перезагрузить все измененные конфигурационные файлы
$ sudo systemctl daemon-reload
# Показать все базовые параметры данного Unit
$ systemctl show httpd.service
# Показать значение заданного свойства определенного блока
$ systemctl show -p CPUShares httpd.service
# Установить заданное свойство для определенного юнита
$ sudo systemctl set-property httpd.service CPUShares=500
Существует зависимость между юнитами: если A зависит от B, это означает, что при запуске A Systemd одновременно запустит B.
systemctl list-dependencies
Команда для вывода всех зависимостей Unit.
xxxxxxxxxx
$ systemctl list-dependencies nginx.service
В выводе команды выше некоторые зависимости являются типом Target (подробнее см. ниже) и по умолчанию не отображаются. Если нужно развернуть Target, необходимо использовать
--all
параметр.
xxxxxxxxxx
$ systemctl list-dependencies --all nginx.service
Каждый юнит имеет файл конфигурации, который сообщает Systemd, как запустить этот юнит.
Systemd по умолчанию из каталога
/etc/systemd/system/
Чтение конфигурационного файла. Однако большинство файлов в нем являются символическими ссылками, указывающими на директории.
/usr/lib/systemd/system/
Где действительно хранится конфигурационный файл?
systemctl enable
Команда используется для создания символической ссылки между двумя вышеуказанными директориями.
xxxxxxxxxx
$ sudo systemctl enable clamd@scan.service
# Эквивалентно
$ sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'
если в конфигурационном файле установлено автозапуск при загрузке,
systemctl enable
Команда эквивалентна активации автозагрузки.
соответственно,
systemctl disable
Команда используется для отмены символической связи между двумя каталогами, что эквивалентно отмене автозагрузки.
xxxxxxxxxx
$ sudo systemctl disable clamd@scan.service
Расширение конфигурационного файла - это вид данного Unit, например,
sshd.socket
Если опустить, то по умолчанию у Systemd суффикс будет
.service
так что
sshd
будет понято как
sshd.service
。
systemctl list-unit-files
Команда используется для вывода всех конфигурационных файлов.
xxxxxxxxxx
# Перечислите все конфигурационные файлы
$ systemctl list-unit-files
# Перечислить файлы конфигурации указанного типа
$ systemctl list-unit-files --type=service
Эта команда выведет список.
xxxxxxxxxx
$ systemctl list-unit-files
UNIT FILE STATE
chronyd.service enabled
clamd@.service static
clamd@scan.service disabled
Этот список показывает состояние каждого профиля, всего четыре вида.
[Install]
Часть (невозможно выполнить), может использоваться только как зависимость для других конфигурационных файлов.
Обратите внимание, что из состояния конфигурационного файла нельзя определить, запущен ли данный юнит. Это необходимо выполнить, как упоминалось ранее.
systemctl status
Команда.
xxxxxxxxxx
$ systemctl status bluetooth.service
После изменения конфигурационного файла необходимо перезагрузить конфигурацию SystemD, а затем перезапустить службу, иначе изменения не вступят в силу.
xxxxxxxxxx
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
Конфигурационный файл — это обычный текстовый файл, который можно открыть с помощью текстового редактора.
systemctl cat
Команда может просмотреть содержимое конфигурационного файла.
xxxxxxxxxx
$ systemctl cat atd.service
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target
Из вышеприведенного вывода видно, что файл конфигурации разделен на несколько блоков. Первая строка каждого блока обозначена квадратными скобками, например,
[Unit]
Обратите внимание, что имена блоков и полей в конфигурационном файле чувствительны к регистру.
Каждый блок состоит из связанных равенством пар ключ-значение.
xxxxxxxxxx
[Section]
Directive1=value
Directive2=value
. . .
[Unit]
Блок конфигурации обычно является первым блоком файла конфигурации и используется для определения метаданных юнита, а также для настройки отношений с другими юнитами. Его основные поля следующие.
Dsecription
Краткое описание
Documentation
Адрес документа
Requires
Текущий Unit зависим от других Units, и если они не запущены, текущий Unit не сможет запуститься.
Wants
Если другие Units, совместимые с текущим Unit, не работают, текущий Unit не будет завершаться с ошибкой.
BindsTo
с
Requires
Подобно этому, если указанный Unit завершится, это приведет к остановке текущего Unit.
Before
Если единица, указанная в этом поле, также должна быть запущена, то ее необходимо запустить после текущей единицы.
After
Если указанный в этом поле Unit также должен быть запущен, его необходимо запустить до текущего Unit.
Conflicts
Указанный здесь модуль не может работать одновременно с текущим модулем.
Condition...
Текущие условия, которые необходимо выполнить для запуска блока, иначе он не будет работать.
Assert...
Текущие условия, которые должен выполнять блок для успешного запуска, иначе возникнет ошибка запуска.
[Install]
Обычно это последний блок конфигурационного файла, который используется для определения того, как запускать программу и нужно ли ее запускать при загрузке системы. Его основные поля следующие.
WantedBy
Его значение — один или несколько Target, символическая ссылка будет помещена, когда текущий Unit активен (включен).
/etc/systemd/system
Под каталоги с
Target имя +
.wants
в подкаталоге, состоящем из суффиксов
RequiredBy
Его значение — один или несколько Target, при активации текущего Unit символическая ссылка будет помещена.
/etc/systemd/system
Под каталоги с
Target имя +
.required
в подкаталоге, состоящем из суффиксов
Alias
Текущий псевдоним для запуска Unit
Also
При активации (включении) текущего Unit будут одновременно активированы и другие Unit.
[Service]
Блок, используемый для конфигурации сервиса, присутствует только у юнитов типа Service. Его основные поля следующие.
Type
Определяет поведение процесса при запуске. У него есть несколько значений.
Type=simple
: Значение по умолчанию, выполнение
ExecStart
Указанная команда, запустите главный процесс.
Type=forking
Создание дочернего процесса от родительского процесса с помощью fork, после чего родительский процесс сразу же завершает свою работу.
Type=oneshot
Одноразовый процесс, Systemd будет ждать завершения текущей службы, прежде чем продолжить выполнение.
Type=dbus
Текущая служба запускается через D-Bus.
Type=notify
Текущая служба успешно запущена, будет уведомление.
Systemd
, продолжайте выполнять дальше.
Type=idle
Если другие задачи завершены, текущая служба начнет работать.
ExecStart
Команда для запуска текущей службы.
ExecStartPre
Команды, выполняемые перед запуском текущей службы.
ExecStartPost
Команды, выполняемые после запуска текущей службы.
ExecReload
Команда, выполняемая при перезапуске текущей службы.
ExecStop
Команда, выполняемая при остановке текущей службы.
ExecStopPost
Команда, выполняемая после остановки службы.
RestartSec
Интервал в секундах для автоматической перезагрузки текущей службы.
Restart
Определите, в каких случаях Systemd будет автоматически перезапускать текущую службу, возможные значения включают
always
(всегда перезагружается)
on-success
、
on-failure
、
on-abnormal
、
on-abort
、
on-watchdog
TimeoutSec
Определите количество секунд, которые Systemd должен ждать перед остановкой текущей службы.
Environment
Установить переменные окружения
Полный список полей конфигурационного файла Unit, пожалуйста, смотрите. официальная документация
При запуске компьютера требуется запустить множество юнитов. Если каждый раз при запуске нужно будет указывать, какие юниты необходимо запустить, это явно будет очень неудобно. Решение от Systemd — это таргет.
简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。
традиционный
init
В режиме запуска существует концепция RunLevel, которая по своему действию схожа с Target. Отличие заключается в том, что RunLevel являются взаимно исключающими, и не может быть запущено несколько RunLevel одновременно, тогда как несколько Target могут быть запущены одновременно.
xxxxxxxxxx
# Просмотреть все текущие цели системы
$ systemctl list-unit-files --type=target
# Просмотр всех единиц, включенных в Target
$ systemctl list-dependencies multi-user.target
# Просмотр целевого значения по умолчанию при запуске
$ systemctl get-default
# Установка целевого значения по умолчанию при запуске
$ sudo systemctl set-default multi-user.target
При переключении цели по умолчанию не закрывать процессы, запущенные предыдущей целью.
Команда # systemctl isolate изменяет это поведение,
# Закрыть все процессы в предыдущем Target, которые не принадлежат следующему Target
$ sudo systemctl isolate multi-user.target
Соответствие между Target и традиционными уровнями выполнения (RunLevel) следующее.
xxxxxxxxxx
Traditional runlevel New target name Symbolically linked to...
Runlevel 0 | runlevel0.target -> poweroff.target
Runlevel 1 | runlevel1.target -> rescue.target
Runlevel 2 | runlevel2.target -> multi-user.target
Runlevel 3 | runlevel3.target -> multi-user.target
Runlevel 4 | runlevel4.target -> multi-user.target
Runlevel 5 | runlevel5.target -> graphical.target
Runlevel 6 | runlevel6.target -> reboot.target
Это с
init
Основные различия в процессах следующие.
(1) Уровень выполнения по умолчанию
(в
/etc/inittab
Настройки файла) теперь заменены на значение по умолчанию Target, расположение -
/etc/systemd/system/default.target
обычно символическая ссылка на
graphical.target
(графический интерфейс) или
multi-user.target
(Много пользовательская командная строка).
(2) Место расположения скрипта запуска
раньше было
/etc/init.d
каталог, символические ссылки на разные каталоги уровня выполнения (например,
/etc/rc3.d
、
/etc/rc5.d
и сейчас хранится в
/lib/systemd/system
и
/etc/systemd/system
Содержание.
(3) Место расположения конфигурационного файла
раньше
init
Конфигурационный файл процесса это
/etc/inittab
Конфигурационные файлы различных сервисов хранятся в
/etc/sysconfig
Содержимое. В настоящее время конфигурационные файлы в основном хранятся в
/lib/systemd
Содержание, в
/etc/systemd
Изменения в каталоге могут перезаписать исходные настройки.
Systemd единообразно управляет журналами запуска всех юнитов. Преимущества этого заключаются в том, что можно использовать только
journalctl
Команда для просмотра всех журналов (журналов ядра и приложений). Конфигурационный файл журнала —
/etc/systemd/journald.conf
。
journalctl
Мощный и с множеством способов использования.
# Просмотреть все журналы (по умолчанию сохраняются только журналы текущего запуска)
$ sudo journalctl
# Просмотр журнала ядра (без отображения журналов приложений)
$ sudo journalctl -k
# Просмотреть журналы текущего запуска системы
$ sudo journalctl -b
$ sudo journalctl -b -0
# Просмотр журнала последнего запуска (необходимо изменить настройки)
$ sudo journalctl -b -1
# Просмотр журнала за указанное время
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"
# Показать последние 10 строк журнала в конце
$ sudo journalctl -n
# Показать заданное количество строк в конце журнала
$ sudo journalctl -n 20
# Реальное время прокрутки для отображения последних журналов
$ sudo journalctl -f
# Просмотр журналов указанной службы
$ sudo journalctl /usr/lib/systemd/systemd
# Просмотр журнала указанного процесса
$ sudo journalctl _PID=1
# Просмотр журнала скрипта по указанному пути
$ sudo journalctl /usr/bin/bash
# Просмотр журналов указанного пользователя
$ sudo journalctl _UID=33 --since today
# Просмотр журналов определенного юнита
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today
# Реальное время прокрутки последних логов определенного юнита
$ sudo journalctl -u nginx.service -f
# Объединение отображения журналов нескольких единиц
$ journalctl -u nginx.service -u php-fpm.service --since today
# Просмотр журналов указанного приоритета (и выше), всего 8 уровней
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b
# Лог по умолчанию выводится с постраничным отображением, --no-pager изменяет на обычный стандартный вывод
$ sudo journalctl --no-pager
{"以 JSON 格式(单行)输出":"Вывод в формате JSON (в одной строке)"}
$ sudo journalctl -b -u nginx.service -o json
{
"格式": "JSON",
"特点": "多行",
"优势": "可读性更好"
}
$ sudo journalctl -b -u nginx.serviceqq
-o json-pretty
# Показать дисковое пространство, занимаемое журналом
$ sudo journalctl --disk-usage
# Установить максимальный объем занимаемого лог-файла
$ sudo journalctl --vacuum-size=1G
# Укажите, как долго следует хранить файл журнала
$ sudo journalctl --vacuum-time=1years
(Конец)
Вы недавно использовали: