add new
parent
fdaec73179
commit
4e4117b121
|
|
@ -261,3 +261,252 @@ Systemd приносит концепцию юнитов systemd. Юниты —
|
|||
* `/etc/systemd/system/` — юниты, созданные и управляемые системным администратором. Этот каталог приоритетнее каталога юнитов, созданных в рантайме.
|
||||
|
||||
Конфигурационные файлы похожи на ini-файлы:
|
||||
```
|
||||
[Unit]
|
||||
Description=Refresh existing PGP keys of archlinux-keyring regularly
|
||||
|
||||
[Timer]
|
||||
OnCalendar=weekly
|
||||
Persistent=true
|
||||
RandomizedDelaySec=1week
|
||||
```
|
||||
|
||||
То есть имеются заголовки и параметры. Этот формат очень легкий, понятный.
|
||||
|
||||
### Юниты делятся на 13 типов, вкратце:
|
||||
|
||||
* service. Основной файл, содержит набор команд и настроек. Системный сервис.
|
||||
* target. Аналог runlevel в sysvinit. Некая точка в жизненном цикле системы, к которой могут «цепляться» другие юниты. Группа юнитов systemd.
|
||||
* timer. С некоторым интервалом запускает связанный с ним юнит. Аналог задач в cron, однако с поддержкой гораздо более богатого синтаксиса правил дат, который можно посмотреть в man systemd.time.
|
||||
* mount. Аналог записи в /etc/fstab, даже более того — systemd самостоятельно парсит fstab и динамически создаёт на его основе юнит-файлы. Так, например, через systemctl cat — -.mount можно увидеть, какой юнит-файл создаётся для корневого раздела.
|
||||
* automount. То же самое, что и mount, только монтируется «лениво», при первом доступе.
|
||||
* socket. Позволяет запустить связанный с ним сервис отложено: systemd при запуске сети начинает слушать сокет, а при первом пакете или подключении запускает сервис, передавая ему объект сокета. Требует дополнительной доработки в сервисе (интеграции с libsystemd или с systemd-socket-proxyd).
|
||||
* path. Запускает связанный с ним юнит при доступе или изменения пути, будь то файл или каталог.
|
||||
* swap. Особый вариант mount, содержит информацию о файле или разделе, выделенный под swap.
|
||||
* slice. Концепция подсистемы управления ресурсами systemd. Подробнее можно почитать в посте Red Hat.
|
||||
* scope. Внутренняя часть systemd. Этот юнит создаётся при запуске сервиса и используется для объединения процессов в группы и управления ресурсами сервиса. Процесс, созданный извне.
|
||||
* snapshot. У этого юнита, как и у scope, нет конфигурационного файла, он создаётся динамически при выполнении команды systemctl snapshot. Созданный «снимок» будет содержать статус всех юнитов на данный момент, впоследствии на него можно «откатиться» командой systemctl isolate после запуска/остановки сервисов и других юнитов.
|
||||
* device. Юнит устройства, такого, как блочное или сетевого устройство. Тесно связан с sysfs/systemd-udevd.
|
||||
* nspawn. Юнит systemd-контейнера, о которых чуть позже.
|
||||
|
||||
Каждый юнит имеет зависимости, то есть таймер от таргета или наоборот.
|
||||
|
||||
Во время загрузки systemd прослушивает сокеты для всех системных сервисов, поддерживает этот тип активации и передает сокеты этим сервисам сразу после старта сервисов. Это позволяет нашей системе инициализации не только запускать сервисы параллельно, но также дает возможность перезапускать сервисы без потери любых отправленных им сообщений, пока сервисы были недоступны. Соответствующий сокет остается доступным и все сообщения выстраиваются в очередь.
|
||||
|
||||
Системные сервисы, использующие D–Bus для межпроцессного взаимодействия, могут быть запущены по требованию, когда клиентское приложение пытается связаться с ними.
|
||||
|
||||
Системные сервисы, поддерживающие активацию, основанную на устройствах, могут быть запущены, когда определенный тип оборудования подключается или становится доступным.
|
||||
|
||||
Системные сервисы могут поддерживать этот вид активации, если изменяется состояние папки или директории.
|
||||
|
||||
Система может сохранять состояние всех юнитов и восстанавливать предыдущее состояние системы.
|
||||
|
||||
Systemd отслеживает и управляет точками монтирования и автомонтирования.
|
||||
|
||||
Агрессивная параллелизация Systemd запускает системные сервисы параллельно из-за использования активации, основанной на сокетах. В комбинации с сервисами, поддерживающими активацию по требованию, параллельная активация значительно уменьшает время загрузки системы.
|
||||
|
||||
До активации и деактивации юнитов systemd вычисляет их зависимости, создает временную транзакцию и проверяет целостность этой транзакции. Если транзакция не целостная, systemd автоматически пытается исправить ее и удалить не требующиеся задания из нее до формирования сообщения об ошибке.
|
||||
|
||||
SystemD полностью поддерживает скрипты инициализации SysV, как описано в спецификации Linux Standard Base (LSB), что упрощает переход на systemd.
|
||||
|
||||
По способу использования сервисные юниты .service напоминают скрипты инициализации. Для просмотра, старта, остановки, перезагрузки, включения или выключения системных сервисов используется команда systemctl. Команды service и chkconfig по-прежнему включены в систему, но только по соображениям совместимости. Пожалуй, одна из самых популярных частей systemd. В journalctl можно посмотреть всё, что произошло с системой: логи sshd, логи ядра и его драйверов, сообщения о крахах, и многое другое.
|
||||
|
||||
## Журналирование и логирование
|
||||
|
||||
Одна из самых важных частей любого администрирования сервера — это просмотр логов. И специально для этого существует демон `journald` и утилита `journalctl`. В журнал system собираются все системные сообщения — от ядра, служб, демонов, приложений. Логирование от systemd может использоваться вместе с syslog, либо использоваться вместо него.
|
||||
|
||||
Как я уже сказал, для просмотра логов есть утилита `journalctl`.
|
||||
|
||||
# syslog
|
||||
|
||||
Итак, перед началом надо напомнить, что такое syslog. Долгое время важным компонентом любого дистрибутива Linux был демон syslog. На протяжении истории было сделано множество реализаций интерфейса syslog, но в целом они были реализованы схожим образом и использовали почти один формат данных на файловой системе.
|
||||
|
||||
Целью демона syslog является, как понятно из названия, логирование процессов системы. Демон получает от приложений и сервисов сообщения в относительно свободной форме и сохраняет их на диске. Как правило, единственные метаданные сообщения — это facility (примеры: ядро, почта, сеть, и т.д.) и приоритет, а также timestamp, тег процесса и его PID. Большинство этих полей опционально, и точный синтаксис варьируется от реализации к реализации.
|
||||
|
||||
Все файлы журналов, можно отнести к одной из следующих категорий:
|
||||
|
||||
* приложения;
|
||||
* события;
|
||||
* службы;
|
||||
* системный.
|
||||
|
||||
Большинство же лог файлов содержится в директории `/var/log`.
|
||||
|
||||
* /var/log/syslog или /var/log/messages содержит глобальный системный журнал, в котором пишутся сообщения с момента запуска системы, от ядра Linux, различных служб, обнаруженных устройствах, сетевых интерфейсов и много другого.
|
||||
* /var/log/auth.log или /var/log/secure — информация об авторизации пользователей, включая удачные и неудачные попытки входа в систему, а также задействованные механизмы аутентификации.
|
||||
* /var/log/dmesg — драйвера устройств. Одноименной командой можно просмотреть вывод содержимого файла. Размер журнала ограничен, когда файл достигнет своего предела, старые сообщения будут перезаписаны более новыми. Задав ключ --level= можно отфильтровать вывод по критерию значимости.
|
||||
|
||||
Поддерживаемые уровни журналирования (приоритеты) в syslog:
|
||||
|
||||
* emerg — система неиспользуемая
|
||||
* alert — действие должно быть произведено немедленно
|
||||
* crit — условия критичности
|
||||
* err — условия ошибок
|
||||
* warn — условия предупреждений
|
||||
* notice — обычные, но значимые условия
|
||||
* info — информационный
|
||||
* debug — отладочные сообщения
|
||||
|
||||
```bash
|
||||
$ sudo dmesg -l warn
|
||||
[ 0.460817] mtrr: your CPUs had inconsistent variable MTRR settings
|
||||
[ 1.666251] amd_pstate: the _CPC object is not present in SBIOS or ACPI disabled
|
||||
[ 3.087444] i8042: PNP: PS/2 appears to have AUX port disabled, if this is incorrect please boot with i8042.nopnp
|
||||
```
|
||||
Также одной из проблем syslog является то, что любой процесс может выдать себя за другой, и syslog не будет ничего проверять. Вторая проблема — нет единого формата записи данных. Анализаторам логов очень тяжело парсить данные логов. Третья проблема — сетевой протокол syslog слишком простой и ограниченный. Четвертая — контроля доступа нет, то есть либо полный доступ, либо полный запрет на чтение логов пользователем. Ну и множество других проблем, которые заставили syslog отойти на второй план.
|
||||
|
||||
Сейчас практически на всех серверах используют именно journald из systemd. Сообщения проходят аутентификацию, сетевой протокол сделан качественно. То есть сама цель journald — объеденить все технологии журналирования, чтобы не было разрозненных данных.
|
||||
|
||||
# Использование journalctl
|
||||
|
||||
Journalctl — это утилита из состава systemd, отвечающая за работу с журналами и демоном journald.
|
||||
```bash
|
||||
journalctl [OPTIONS...] [MATCHES...]
|
||||
|
||||
Query the journal.
|
||||
|
||||
Source Options:
|
||||
--system Show the system journal
|
||||
--user Show the user journal for the current user
|
||||
-M --machine=CONTAINER Operate on local container
|
||||
-m --merge Show entries from all available journals
|
||||
-D --directory=PATH Show journal files from directory
|
||||
--file=PATH Show journal file
|
||||
--root=PATH Operate on an alternate filesystem root
|
||||
--image=PATH Operate on disk image as filesystem root
|
||||
--image-policy=POLICY Specify disk image dissection policy
|
||||
--namespace=NAMESPACE Show journal data from specified journal namespace
|
||||
|
||||
Filtering Options:
|
||||
-S --since=DATE Show entries not older than the specified date
|
||||
-U --until=DATE Show entries not newer than the specified date
|
||||
-c --cursor=CURSOR Show entries starting at the specified cursor
|
||||
--after-cursor=CURSOR Show entries after the specified cursor
|
||||
--cursor-file=FILE Show entries after cursor in FILE and update FILE
|
||||
-b --boot[=ID] Show current boot or the specified boot
|
||||
-u --unit=UNIT Show logs from the specified unit
|
||||
--user-unit=UNIT Show logs from the specified user unit
|
||||
-t --identifier=STRING Show entries with the specified syslog identifier
|
||||
-p --priority=RANGE Show entries within the specified priority range
|
||||
--facility=FACILITY... Show entries with the specified facilities
|
||||
-g --grep=PATTERN Show entries with MESSAGE matching PATTERN
|
||||
--case-sensitive[=BOOL] Force case sensitive or insensitive matching
|
||||
-k --dmesg Show kernel message log from the current boot
|
||||
|
||||
Output Control Options:
|
||||
-o --output=STRING Change journal output mode (short, short-precise,
|
||||
short-iso, short-iso-precise, short-full,
|
||||
short-monotonic, short-unix, verbose, export,
|
||||
json, json-pretty, json-sse, json-seq, cat,
|
||||
with-unit)
|
||||
--output-fields=LIST Select fields to print in verbose/export/json modes
|
||||
-n --lines[=[+]INTEGER] Number of journal entries to show
|
||||
-r --reverse Show the newest entries first
|
||||
--show-cursor Print the cursor after all the entries
|
||||
--utc Express time in Coordinated Universal Time (UTC)
|
||||
-x --catalog Add message explanations where available
|
||||
--no-hostname Suppress output of hostname field
|
||||
--no-full Ellipsize fields
|
||||
-a --all Show all fields, including long and unprintable
|
||||
-f --follow Follow the journal
|
||||
--no-tail Show all lines, even in follow mode
|
||||
--truncate-newline Truncate entries by first newline character
|
||||
-q --quiet Do not show info messages and privilege warning
|
||||
|
||||
Pager Control Options:
|
||||
--no-pager Do not pipe output into a pager
|
||||
-e --pager-end Immediately jump to the end in the pager
|
||||
|
||||
Forward Secure Sealing (FSS) Options:
|
||||
--interval=TIME Time interval for changing the FSS sealing key
|
||||
--verify-key=KEY Specify FSS verification key
|
||||
--force Override of the FSS key pair with --setup-keys
|
||||
|
||||
Commands:
|
||||
-h --help Show this help text
|
||||
--version Show package version
|
||||
-N --fields List all field names currently used
|
||||
-F --field=FIELD List all values that a specified field takes
|
||||
--list-boots Show terse information about recorded boots
|
||||
--disk-usage Show total disk usage of all journal files
|
||||
--vacuum-size=BYTES Reduce disk usage below specified size
|
||||
--vacuum-files=INT Leave only the specified number of journal files
|
||||
--vacuum-time=TIME Remove journal files older than specified time
|
||||
--verify Verify journal file consistency
|
||||
--sync Synchronize unwritten journal messages to disk
|
||||
--relinquish-var Stop logging to disk, log to temporary file system
|
||||
--smart-relinquish-var Similar, but NOP if log directory is on root mount
|
||||
--flush Flush all journal data from /run into /var
|
||||
--rotate Request immediate rotation of the journal files
|
||||
--header Show journal header information
|
||||
--list-catalog Show all message IDs in the catalog
|
||||
--dump-catalog Show entries in the message catalog
|
||||
--update-catalog Update the message catalog database
|
||||
--setup-keys Generate a new FSS key pair
|
||||
|
||||
See the journalctl(1) man page for details
|
||||
```
|
||||
|
||||
Journalctl — отличный инструмент для анализа логов, обычно один из первых с которым знакомятся начинающие администраторы linux систем. Встроенные возможности ротации, богатые возможности фильтрации и возможность просматривать логи всех systemd unit-сервисов одним инструментом очень удобны и заметно облегчают работу системным администраторам.
|
||||
|
||||
Итак, чтобы просто просмотреть логи, можно просто ввести команду `journalctl`:
|
||||

|
||||
|
||||
Для вывода логов используется небольшая утилита less (помогает не выводить сразу все, а самому скроллить текст в терминале). Данная команда выводит все записи из всех журналов, начиная с момента загрузки системы. Время указано по локальному времени в системе, для того чтобы вывести время в формате UTC, надо использовать флаг --utc:
|
||||
|
||||

|
||||
|
||||
Итак, но допустим, мы не хотим читать абсолютно все логи, и нам нужны только ошибки.
|
||||
|
||||
Для уровней важности, приняты следующие обозначения:
|
||||
|
||||
* 0: emergency (неработоспособность системы)
|
||||
* 1: alerts (предупреждения, требующие немедленного вмешательства)
|
||||
* 2: critical (критическое состояние)
|
||||
* 3: errors (ошибки)
|
||||
* 4: warning (предупреждения)
|
||||
* 5: notice (уведомления)
|
||||
* 6: info (информационные сообщения)
|
||||
* 7: debug (отладочные сообщения)
|
||||
|
||||
Для того, чтобы указать код важности, требуется флаг -p. Когда мы, например, будем использовать journalctl -p 3, то в журнале будут сообщения с 0, 1, 2 и 3 уровнем (то есть включая предыдущие).
|
||||
|
||||

|
||||
|
||||
Ниже я представил некоторые базовые флаги для просмотра информации о службах и журналах:
|
||||
|
||||
* `journalctl -n 100` — показывает первые 100 записей в журнале (вместо 100 можно использовать любое другое число)
|
||||
* `journalctl _SYSTEMD_UNIT=earlyoom.service` — просмотр записей, связанных с юнитом earlyoom.service
|
||||
* `journalctl _COMM=sshd` — показывает все записи, связанные с процессом sshd
|
||||
* `journalctl _PID=1000` — показывает все записи, связанные с PID 1000
|
||||
* `journalctl _UID=1000` — показывает все записи, связанные с UID 1000
|
||||
* `journalctl _GID=1000` — показывает все записи, связанные с GID 1000
|
||||
* `journalctl _HOSTNAME=linux` — показывает все записи, связанные с хостом linux
|
||||
* `journalctl --since 2024-01-01` — показывает все записи, начиная с указанной даты
|
||||
* `journalctl --until 2024-01-01` — показывает все записи, заканчивая указанной датой
|
||||
* `journalctl --since -1h` — показывает все записи за последний час
|
||||
* `journalctl --since -1days` — показывает все записи за последние сутки
|
||||
* `journalctl --vacuum-size=10M` — удаляет записи, пока журнал не станет весом 10МБ.
|
||||
* `journalctl --vacuum-time=1week` — удаляет записи старше 1 недели.
|
||||
* `journalctl --output=short` — показывает записи в компактном виде
|
||||
* `journalctl --output=verbose` — показывает записи в расширенном виде
|
||||
* `journalctl --output=json` — показывает записи в json-формате
|
||||
* `journalctl --verify` — проверяет целостность журнала
|
||||
* `journalctl -xeu "service"` — отображает записи в формате JSON (-x) и единого события (-e) по указанной службе (-u).
|
||||
* `journalctl -feu "service"` — отображает записи в режиме реального времени (-f) и единого события (-e) по указанной службе (-u).
|
||||
* `journalctl --list-boots` — отображеает журналы, которые были созданы при загрузке системы
|
||||
* `journalctl -b 0 `— просмотреть журнал с текущего старта системы
|
||||
* `journalctl -b -1` — просмотреть журнал с предыдущего старта системы
|
||||
* `journalctl -k `— просмотр сообщений ядра
|
||||
|
||||
## Создание сервисов
|
||||
|
||||
Большинство сервисов хранятся в /etc/systemd/system.
|
||||
```bash
|
||||
cd /etc/systemd/system
|
||||
```
|
||||
Для примера, давайте создадим службу, которая будет запускать наш скрипт /usr/bin/habr:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
echo Hello, Habr!
|
||||
```
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 107 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 107 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 115 KiB |
Loading…
Reference in New Issue