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 создаст пользовательский файл модуля в той же системе.
Contents
Процесс загрузки Linux и systemd
Чтобы лучше понять, что подразумевается под системой инициализации, в этом разделе представлен общий обзор процесса загрузки Linux.
Linux требует системы инициализации во время процесса загрузки и запуска. В конце процесса загрузки ядро Linux загружает systemd и передает ему управление, после чего начинается процесс запуска. На этом этапе ядро инициализирует первый процесс пользовательского пространства , процесс инициализации systemd с идентификатором процесса 1, а затем переходит в режим ожидания, пока не будет вызван снова. systemd подготавливает пространство пользователя и переводит хост Linux в рабочее состояние, запуская все остальные процессы в системе.
Ниже приведен упрощенный обзор всего процесса загрузки и запуска Linux:
- Система включается. BIOS выполняет минимальную аппаратную инициализацию и передает управление загрузчику.
- Загрузчик вызывает ядро.
- Ядро загружает начальный RAM-диск, который загружает системные диски, а затем ищет корневую файловую систему.
- Как только ядро настроено, оно запускает систему инициализации systemd.
- 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 можно использовать аналогичным образом для любого юнита.journalctl
systemctl
systemctl
Прочитайте наше руководство « Введение в systemctl» , чтобы глубже погрузиться в этот инструмент systemd.
Инструмент systemd
journalctl
предоставляет централизованный инструмент ведения журнала процессов и системы. Эта команда позволяет запрашивать журнал systemd, который создает и поддерживает индексированные журналы на основе информации регистрации, собранной из разных областей системы; такие области, как стандартный вывод и стандартные ошибки сервисных единиц, сообщения журнала через системный журнал и сообщения журнала ядра. Таким образом, системные администраторы могут использовать единый инструмент для мониторинга и отладки сервера.Чтобы узнать о некоторых часто используемых
journalctl
командах, см. наше руководство Использование journalctl для просмотра журналов вашей системы .Дополнительная информация
Вы можете обратиться к следующим ресурсам для получения дополнительной информации по этой теме. Хотя они предоставляются в надежде на то, что они будут полезны, обратите внимание, что мы не можем ручаться за точность или своевременность материалов, размещенных на внешних серверах.