мета-данные страницы
Это старая версия документа!
Глава 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
Важно:
- Синтаксис строг, комментарии и пустые строки не допускаются
- Пароли не хранятся в passwd, а хранятся в shadow-файле (доступен только root)
- Запись в 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

