мета-данные страницы
  •  

Это старая версия документа!


Глава 7: Настройка системы: журналирование, системное время, пакетные задачи и пользователи

7.1 Ведение системного журнала

Системные программы записывают логи через syslogd (традиционный) или journald (современный, поставляется с systemd). Сообщение содержит: имя процесса, PID, метку времени, facility и severity.

Компонент Назначение
syslogd Традиционная служба логирования
journald Современная служба (systemd)
/var/log Директория с логами
/var/log/journal Двоичные логи journald

7.1.1 Проверка настроек журнала

Определить тип логирования в системе:

  • journald: команда `journalctl` (работает, если journald активна)
  • rsyslogd: процесс в списке или `/etc/rsyslog.conf`
  • syslog-ng: директория `/etc/syslog-ng`

Дополнительные логи: `/var/log/wtmp`, `/var/log/lastlog` (утилиты `last`, `lastlog`)

7.1.2 Поиск и мониторинг журналов

Фильтрация по времени

journalctl -S -4h              # последние 4 часа
journalctl -S 06:00:00         # с 6:00 сегодня
journalctl -S 2020-01-14       # с определённой даты
journalctl -S '2020-01-14 14:30:00'
journalctl -U <время>          # до указанного времени

Фильтрация по юнитам

journalctl -u cron.service     # логи конкретного сервиса
journalctl -F _SYSTEMD_UNIT    # все юниты в журнале

Поиск полей

journalctl -N                  # список всех полей
journalctl _PID=8792           # поиск по PID

Примечание: полный доступ требует прав суперпользователя или членства в группах `adm` или `systemd-journal`.

Фильтрация по тексту

journalctl -g 'kernel.*memory'  # поиск по regex

Часто важная информация находится рядом по времени - используйте метку времени совпадений и `journalctl -S`.

Примечание: параметр `-g` требует специальной библиотеки (есть не во всех дистрибутивах).

Фильтрация по загрузке системы

journalctl -b              # текущая загрузка
journalctl -b -1           # предыдущая загрузка
journalctl --list-boots    # список всех загрузок с ID и временем
journalctl -k              # только сообщения ядра
journalctl -r -b -1        # проверка корректного выключения

Фильтрация по важности

journalctl -p 3            # от уровня 0 (важное) до 3
journalctl -p 2..3         # уровни 2 и 3

Уровни: 0 (emergency) → 7 (debug). Фильтрация редко бывает полезной.

Простой мониторинг журнала

journalctl -f              # следить за новыми сообщениями (как tail -f)

Можно комбинировать с другими параметрами фильтрации (`-u`, `-S`, `-p` и т.д.).

7.1.3 Ротация файлов журнала

Логротация - удаление старых сообщений с помощью logrotate. Вместо удаления из файла старые логи разделяются на блоки:

  • `auth.log` (новые)
  • `auth.log.1`, `auth.log.2`, `auth.log.3` (старые)

Процесс ротации:

1. Удалить `auth.log.3`
2. `auth.log.2` → `auth.log.3`
3. `auth.log.1` → `auth.log.2`
4. `auth.log` → `auth.log.1`

Варианты в разных дистрибутивах:

  • Ubuntu: сжатие (`.gz`) при переносе с позиции 1 на 2
  • Другие: суффикс даты (`-20200529`)

Конфликты ротации: если logrotate ротирует файл, пока демон его пишет - сообщение запишется в переименованный файл благодаря тому, как Linux работает с открытыми файлами.

7.1.4 Обслуживание журналов journald

Логи в `/var/log/journal` не требуют ротации - journald самостоятельно удаляет старые сообщения.

Критерии удаления:

  • Свободное место на ФС
  • Процент от размера ФС
  • Максимальный размер журнала
  • Максимальный возраст сообщения

Настройка: страница `journald.conf(5)`.

7.1.5 Детали системного журналирования

История и архитектура

syslog развился в 1980-х годах с sendmail (RFC 3164, затем RFC 5424). Классическая архитектура «клиент - сервер».

Механизм: syslogd слушает Unix-сокет `/dev/log` и сетевые сокеты. Позволяет централизовать логи всей сети на одном сервере.

Объекты и важность

Параметр Назначение
Facility (объект) Категория службы (ядро, почта, принтер)
Severity (важность) Уровни 0–7 (emerg до debug)
Priority (приоритет) Комбинация facility + severity

Уровни: 0 (emerg) / 1 (alert) / 2 (crit) / 3 (err) / 4 (warning) / 5 (notice) / 6 (info) / 7 (debug)

Ограничения: объекты жёстко определены (нет новых), но есть слоты `local0–local7` для пользовательских служб.

RFC 5424 поддерживает структурированные данные - пары ключ-значение для произвольных полей.

syslog vs journald

syslog остаётся нужен:

  • Чёткое объединение логов на нескольких машинах
  • rsyslogd модульна, может писать в разные форматы и БД

journald:

  • Фокус на логирование одной машины в едином формате
  • Может передавать логи в другие регистраторы
  • systemd собирает выход серверов → journald

Тренды журналирования

Журналирование эволюционирует:

  • Централизованное хранение → интернет-сервисы и БД
  • Назначение: не только для чтения админом, но и для поиска, анализа, интеграции с приложениями
  • Безопасность: добавлена шифрование, аутентификация (RFC 5424), но остаются проблемы с доверием и проверкой подлинности источников

7.2 Структура каталога /etc

Большинство конфигов системы находятся в /etc. Исторически каждая программа имела свой файл конфигурации, что привело к скученности каталога и сложностям в поддержке.

Решение: размещение файлов конфигурации в подкаталогах (/etc/systemd, /etc/grub.d и т.д.).

Правило: в /etc входят машинозависимые конфигурации (/etc/passwd, /etc/network), но не глобальные значения приложений и системные конфиги по умолчанию (хранятся в /usr/lib/systemd и др.).

7.3 Файлы управления пользователями

В Unix пользователи - это числа (UID) в ядре, но на уровне ОС используются имена (usernames). Любая программа должна переводить имя в UID для работы с ядром.

7.3.1 Файл /etc/passwd

Текстовый файл сопоставляет имена пользователей с UID. Формат: 7 полей, разделённых двоеточиями.

Поле Описание
Имя пользователя Логин (root, daemon и т.д.)
Пароль x - в shadow-файле; * - вход запрещен; пусто - нет пароля (опасно!)
UID Идентификатор пользователя в ядре; должен быть уникальным
GID Идентификатор основной группы (из /etc/group)
GECOS Полное имя пользователя (может содержать телефоны, комнаты)
Домашний каталог Каталог пользователя
Оболочка Программа при входе в сеанс (обычно /bin/bash или /bin/sh)

Пример:

root:x:0:0:Superuser:/root:/bin/sh
juser:x:3119:1000:J. Random User:/home/juser:/bin/bash
nobody:*:65534:65534:nobody:/home:/bin/false

Важно:

  1. Синтаксис строг, комментарии и пустые строки не допускаются
  2. Пароли не хранятся в passwd, а хранятся в shadow-файле (доступен только root)
  3. Запись в passwd + домашний каталог = учётная запись (account)

7.3.2 Особые пользователи

Суперпользователь (root): UID 0, GID 0 - единственный UID, имеющий значение для ядра.

Псевдопользователи: не могут войти в систему (оболочка /bin/false или /nologin), но системе разрешено запускать процессы от их имени. Примеры:

  • nobody - непривилегированный, обычно не может ничего записывать (безопасность)
  • daemon и др. - для системных сервисов

Это соглашения пользовательского пространства; ядро различает только UID 0.

7.3.3 Файл /etc/shadow

Теневой файл пароля содержит данные аутентификации: зашифрованные пароли и информацию об истечении срока. Введён для более гибкого и безопасного хранения паролей вместо /etc/passwd. Обычные пользователи не имеют прав на чтение.

Работает вместе с PAM (Pluggable Authentication Modules) и конфигом /etc/login.defs.

7.3.4. Управление пользователями и паролями

Команды для обычных пользователей:

  • passwd - изменить свой пароль
  • chfn - изменить полное имя (GECOS)
  • chsh - изменить оболочку (должна быть в /etc/shells)

Все эти команды - suid-root утилиты (потому что только root может изменить /etc/passwd).

Управление от суперпользователя:

Операция Команда
Установить пароль passwd <user>
Добавить пользователя adduser
Удалить пользователя userdel
Редактировать passwd безопасно vipw
Редактировать shadow безопасно vipw -s

Избегайте прямого редактирования passwd текстовым редактором (ошибки синтаксиса, конфликты при параллельных изменениях).

vipw - создаёт резервные копии и блокирует файл во время редактирования для безопасности.

7.3.5 Работа с группами пользователей

Группы - способ организации совместного доступа к файлам между пользователями через биты разрешений. Менее актуальна в современных системах (общие рабочие станции стали редкостью).

Файл /etc/group определяет GID, соответствующие записям /etc/passwd.

Поле Описание
Название группы Отображается в ls -l
Пароль группы Почти никогда не используется; * или x (в /etc/gshadow)
GID Идентификатор группы (должен быть уникальным)
Список пользователей Необязателен; пользователи также в группе, если имеют соответствующий GID в passwd

Примечание: дистрибутивы часто создают для каждого пользователя личную группу с его именем.

Просмотр групп пользователя:

groups

7.4 Команды getty и login

getty - подключается к терминалам и отображает приглашение входа. В Linux используется в основном на виртуальных терминалах (Ctrl+Alt+F1). Часто в виде agetty:

/sbin/agetty -o -p -- \u --noclear tty1 linux

Процесс входа:

1. getty заменяется программой **login**
2. login запрашивает пароль
3. При верном пароле login заменяется (exec) оболочкой пользователя
4. При ошибке: "Login incorrect"

Аутентификация выполняется через PAM (Pluggable Authentication Modules).

Примечание: устаревшие параметры вроде скорости бодов (38400) игнорируются виртуальными терминалами.

В современных системах getty и login редко используются: большинство входят через графический интерфейс (всякие DM) или SSH.

7.5 Установка времени

Системные часы ядра должны быть максимально точными. Ядро опирается на аппаратные часы RTC (Real-Time Clock) при загрузке, но часы ядра дрейфуют со временем.

Основной принцип: используйте UTC для системных часов, чтобы избежать проблем с часовыми поясами и летним временем.

Время ядра - это секунды с 1970-01-01 00:00 UTC

RTC - Аппаратные часы с питанием от батареи; менее точны

Time drift - это сдвиг между временем ядра и истинным; исправляется демоном NTP, не hwclock1)

Установка RTC на UTC:

hwclock --systohc --utc

7.5.1 Представление времени ядра и часовые пояса

Системные часы = секунды с 1970-01-01 00:00 UTC. Пользовательские программы преобразуют в локальное время.

Управление часовыми поясами:

  • /etc/localtime - текущий часовой пояс (двоичный файл)
  • /usr/share/zoneinfo - база часовых поясов

Установка часового пояса:

# Копирование или симлинк
ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
 
# Или интерактивная утилита
tzselect

Использование альтернативного пояса: (через переменные окружения)

# На сеанс
export TZ=US/Central
date
 
# На одну команду
TZ=US/Central date

7.5.2 Сетевое время

При постоянном интернете используйте демон NTP для синхронизации времени с удалённым сервером.

Демон Описание Применение
timesyncd Встроен в systemd; по умолчанию включен Системы с интернетом (рекомендуется)
ntpd Старый демон; нужно отключить timesyncd Если требуется расширенный контроль
chronyd Поддерживает время при периодическом интернете Мобильные системы, ноутбуки

Конфигурация timesyncd: /etc/systemd/timesyncd.conf (изменение серверов времени).

Информация о серверах: www.ntppool.org

Синхронизация RTC с сетевым временем:

# После синхронизации с NTP
hwclock --systohc --utc

Многие дистрибутивы это делают автоматически.

7.6 Планирование повторяющихся задач с помощью команды cron и юнитов таймера

Два способа запуска повторяющихся задач: cron и таймеры systemd. Используется для автоматизации (например, ротация логов).

Формат crontab:

Строка: минута час день_месяца месяц день_недели команда

Поле Диапазон Пример
минута 0-59 15
час 0-23 09
день месяца 1-31 *
месяц 1-12 *
день недели 0-7 (0,7=воскресенье) *

Символ * = все значения

# Ежедневно в 9:15
15 09 * * * /home/juser/bin/spmake
 
# Только 14-го числа в 9:15
15 09 14 * * /home/juser/bin/spmake
 
# 5-го и 14-го числа в 9:15
15 09 5,14 * * /home/juser/bin/spmake

7.6.1 Установка файлов Crontab

Каждый пользователь имеет свой crontab в /var/spool/cron/crontabs/

Команды:

crontab file Установить файл как текущий crontab
crontab -l Список заданий
crontab -e Редактировать текущий crontab
crontab -r Удалить crontab

7.6.2 Системные файлы Crontab

/etc/crontab - системный файл (редактировать напрямую, не через crontab)

Отличие: дополнительное поле пользователя перед командой

# Формат: минута час день месяц день_недели пользователь команда
42 6 * * * root /usr/local/bin/cleansystem > /dev/null 2>&1

Дополнительные файлы в /etc/cron.d/ (любое имя, формат как /etc/crontab)

7.6.3 Юниты таймера

Альтернатива cron - таймер systemd. Требует два юнита: таймер (активация) + служебный юнит (задача).

Файлы в /etc/systemd/system/

Юнит таймера (loggertest.timer)

[Unit]
Description=Example timer unit
 
[Timer]
OnCalendar=*-*-* *:00,20,40
Unit=loggertest.service
 
[Install]
WantedBy=timers.target

OnCalendar - время в формате год-месяц-день час:минута:секунда

Запускается каждые 20 минут. Синтаксис:

  • * = все значения
  • , = несколько значений (пример: 00,20,40)
  • */N = каждые N единиц (пример: *:00/20 = каждые 20 минут)

Полный синтаксис: страница systemd.time(7)

Связанный служебный юнит (loggertest.service)

[Unit]
Description=Example Test Service
 
[Service]
Type=oneshot
ExecStart=/usr/bin/logger -p local3.debug I\'m a logger

Type=oneshot - служба запускается, выполняет команду и завершается

Преимущества oneshot:

  • Несколько ExecStart в одном файле
  • Строгий порядок зависимостей (Wants, Before)
  • Точные записи о времени в журнале

Быстрые задачи могут завершиться до записи в журнал (эффект гонок)

7.6.4. Утилита cron против юнитов таймера

Критерий cron Таймеры systemd
Сложность Простая Сложнее
Совместимость Высокая (множество служб) Зависит от системы
Пользовательские задачи Легко Требует юнит-файлов
Отслеживание процессов (cgroups) Слабо Эффективно
Логирование Базовое Детальное (journal)
Параметры времени Ограничены Расширенные
Зависимости systemd Нет Да

cron вряд ли исчезнет благодаря простоте. Таймеры - будущее системных задач.

Команда systemd-run создаёт таймеры без юнит-файлов, но многие предпочитают cron

1)
Не пытайтесь исправить сдвиг во времени с помощью команды hwclock, потому что системные события, основанные на времени, могут быть потеряны или искажены. Вы можете запустить утилиту, например adjtimex, чтобы плавно обновлять часы на основе RTC, но лучше корректировать системное время с помощью демона сетевого времени