Что такое systemd?

by moiseevrus

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

Леннарт Поттеринг и Кей Сиверс написали systemd, вдохновленные launchd и Upstart в macOS , с целью создания современной и динамичной системы. Примечательно, что systemd обеспечивает агрессивные возможности распараллеливания и логику управления службами на основе зависимостей, позволяя запускать службы параллельно и ускоряя загрузку. Эти два аспекта присутствовали в Upstart, но были улучшены systemd.

systemd — это система инициализации по умолчанию для основных дистрибутивов Linux, но она обратно совместима со сценариями инициализации SysV. SysVinit — это система инициализации, которая предшествует systemd и использует упрощенный подход к запуску службы. systemd не только управляет инициализацией системы, но также предоставляет альтернативы другим известным утилитам, таким как cron и syslog. Поскольку systemd делает несколько вещей в пользовательском пространстве Linux, многие критикуют его за нарушение философии Unix , которая подчеркивает простоту и модульность.

Это руководство представляет собой введение в systemd путем более подробного изучения модулей systemd. Раздел Mount Units проанализирует файл модуля, который по умолчанию поставляется с systemd в системе Ubuntu 18.04, а раздел Timer Units создаст пользовательский файл модуля в той же системе.

Процесс загрузки Linux и systemd

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

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

Ниже приведен упрощенный обзор всего процесса загрузки и запуска Linux:

  1. Система включается. BIOS выполняет минимальную аппаратную инициализацию и передает управление загрузчику.
  2. Загрузчик вызывает ядро.
  3. Ядро загружает начальный RAM-диск, который загружает системные диски, а затем ищет корневую файловую систему.
  4. Как только ядро ​​настроено, оно запускает систему инициализации systemd.
  5. systemd берет на себя и продолжает монтировать файловые системы хоста и запускать службы.

системные единицы

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

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

Тип устройства Расширение файла Описание
Сервисный блок .service Системный сервис.
Целевая единица .target Группа модулей systemd.
Автомонтируемая единица .automount Точка автомонтирования файловой системы.
Единица устройства .device Файл устройства, распознаваемый ядром.
Монтажный блок .mount Точка монтирования файловой системы.
Единица пути .path Файл или каталог в файловой системе.
Единица объема .scope Процесс, созданный извне.
Блок среза .slice Группа иерархически организованных единиц, управляющих системными процессами.
Единица моментального снимка .snapshot Сохраненное состояние менеджера systemd.
Блок розеток .socket Сокет межпроцессного взаимодействия.
Поменять единицу измерения .swap Устройство подкачки или файл подкачки.
Таймер .timer Системный таймер.
  • Каталог /usr/lib/systemd/user/— это место по умолчанию, куда файлы модулей устанавливаются пакетами. Файлы модулей в каталоге по умолчанию не должны изменяться.
  • Каталог /run/systemd/system/— это место выполнения для юнит-файлов.
  • В /etc/systemd/system/каталоге хранятся юнит-файлы, расширяющие службу. Этот каталог будет иметь приоритет над файлами модулей, расположенными где-либо еще в системе.

Единицы крепления

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

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

systemctl list-units --type=mount

Ваш вывод будет отображать каждую единицу монтирования, которая в данный момент активна:

UNIT                          LOAD   ACTIVE SUB     DESCRIPTION
-.mount                       loaded active mounted Root Mount
dev-hugepages.mount           loaded active mounted Huge Pages File System
dev-mqueue.mount              loaded active mounted POSIX Message Queue File System
proc-sys-fs-binfmt_misc.mount loaded active mounted Arbitrary Executable File Formats File S
run-user-1000.mount           loaded active mounted /run/user/1000
sys-fs-fuse-connections.mount loaded active mounted FUSE Control File System
sys-kernel-config.mount       loaded active mounted Kernel Configuration File System
sys-kernel-debug.mount        loaded active mounted Kernel Debug File System
var-lib-lxcfs.mount           loaded active mounted /var/lib/lxcfs

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

9 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

Чтобы просмотреть информацию о конкретном юните маунта, используйте systemctl statusкоманду с именем юнита:

systemctl status sys-fs-fuse-connections.mount

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

● sys-fs-fuse-connections.mount - FUSE Control File System
Loaded: loaded (/lib/systemd/system/sys-fs-fuse-connections.mount; static; vendor preset: enabled)
Active: active (mounted) since Wed 2018-08-29 18:34:43 UTC; 21h ago
    Where: /sys/fs/fuse/connections
    What: fusectl
    Docs: https://www.kernel.org/doc/Documentation/filesystems/fuse.txt
        https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
    Tasks: 0 (limit: 2320)
CGroup: /system.slice/sys-fs-fuse-connections.mount

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

FUSE — это структура файловой системы, которая предоставляет интерфейс для программ пользовательского пространства для экспорта виртуальной файловой системы в ядро ​​Linux. Его также можно использовать для предоставления доступа к данным со структурой каталогов файловой системы и файловыми операциями для любого объекта.

Проверьте содержимое файла конфигурации модуля монтирования файловой системы управления FUSE с помощью systemctl:

systemctl cat sys-fs-fuse-connections.mount

Вы увидите аналогичный вывод:

[Unit]
Description=FUSE Control File System
Documentation=https://www.kernel.org/doc/Documentation/filesystems/fuse.txt
Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
DefaultDependencies=no
ConditionPathExists=/sys/fs/fuse/connections
ConditionCapability=CAP_SYS_ADMIN
ConditionVirtualization=!private-users
After=systemd-modules-load.service
Before=sysinit.target

[Mount]
What=fusectl
Where=/sys/fs/fuse/connections
Type=fusectl

Все файлы юнитов должны содержать [Unit]раздел, в котором описаны общие параметры, зависимости и условия для юнита. Пример файла модуля монтирования содержит некоторые из следующих параметров:

  • Для этого модуля монтирования, обозначенного DefaultDependencies=no. Однако ConditionPathExistsозначает, что каталог /sys/fs/fuse/connectionsдолжен существовать до запуска модуля монтирования. Это условие необходимо, так как в файловой системе управления FUSE каждое соединение будет иметь свой собственный каталог в этом месте.
  • Имя файла модуля монтирования должно соответствовать каталогам точек монтирования, которыми он управляет, поэтому этот конкретный файл конфигурации модуля монтирования называется sys-fs-fuse-connections.mount.

Файл модуля монтирования должен содержать [Mount]раздел. Пример файла модуля монтирования имеет следующие параметры:

  • Параметр What, который может быть именем раздела, путем или UUID для монтирования.
  • Опция Whereобъявляет абсолютный путь к точке монтирования. Если точка монтирования не существует, она будет создана.
  • Параметр Typeобозначает тип файловой системы.

Примечание

В официальном руководстве systemd отмечается, что /etc/fstabрекомендуемым подходом является настройка точек монтирования. В systemd есть функция, system-fstab-generatorкоторая переводит информацию из файла fstab в единицы монтирования и подкачки systemd во время выполнения.

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

Таймеры

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

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

Вам понадобятся три отдельных файла:

  • Сценарий, который выполнит и создаст резервную копию базы данных MySQL, расположенной в /usr/local/bin/каталоге.
  • Файл сервисного модуля, который будет обрабатывать запуск скрипта.
  • Файл модуля таймера, который определяет, когда и как часто будет инициализироваться служба.

Примечание

Ваш сценарий, файл модуля обслуживания и файл модуля таймера должны иметь 644права на чтение и запись.

Ниже приведен сценарий, который создает файл резервной копии с .sqlименем для базы данных с именем testdb. Скрипт добавит дату и временную метку к имени файла:

Файл: /usr/local/bin/my-db-backup.sh
1
2
3
4
#!/bin/sh

stamp=$(date "+%y-%m-%d-%H-%M")
/usr/bin/mysqldump testdb > ~/backups/my-db-backup-${stamp}.sql

Чтобы не запрашивать имя пользователя и пароль MySQL, создайте .my.cnfфайл в своем домашнем каталоге с вашими учетными данными MySQL.

Файл: ~/.my.cnf
1
2
3
[mysqldump]
user=mysqluser
password=mypassword

Файл сервисного модуля находится в /etc/systemd/system/каталоге и содержит следующую информацию:

Файл: /etc/systemd/system/my-db-backup.service
1
2
3
4
5
6
[Unit]
Description=A script to backup mysql database named testdb

[Service]
# The location of the mysql backup script
ExecStart=/usr/local/bin/my-db-backup.sh

Файл модуля таймера находится в том же каталоге, что и файл модуля службы с тем же именем, но с .timerрасширением. Файл модуля содержит следующие параметры:

Файл: /etc/systemd/system/my-db-backup.timer
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[Unit]
Description=Runs my-db-backup.sh every hour

[Timer]
# Amount of time to wait after booting before the service runs for the first time
OnBootSec=10min
# The time between running each consecutive timer
OnUnitActiveSec=1h
# Name of the service file that will be called
Unit=my-db-backup.service

[Install]
# Defines which service triggers the custom service on boot
WantedBy=multi-user.target

При создании юнит-файлов вы можете проверить правильность файла с помощью следующей команды systemd:

systemd-analyze verify /etc/systemd/system/my-db-backup.timer

Команда systemd system-analyzeпредоставляет несколько других полезных параметров анализа и отладки. Просмотрите официальную документацию для получения дополнительных опций.

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

systemctl enable my-db-backup.timer

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

systemctl start my-db-backup.timer

системные инструменты

systemd упрощает управление общими задачами системного администрирования с помощью команд systemctlи . может использоваться для сбора подробной информации об общем состоянии вашего сервера и любого отдельного типа устройства. Он может останавливать и запускать сервер и изменять состояние системы. В разделе Timer Unit Files используется для включения и запуска отдельного таймера. systemd можно использовать аналогичным образом для любого юнита.journalctlsystemctlsystemctl

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

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

Чтобы узнать о некоторых часто используемых journalctlкомандах, см. наше руководство Использование journalctl для просмотра журналов вашей системы .

Дополнительная информация

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

You may also like

Leave a Comment