Кастомизация запуска системы [202.1]

Рейтинг: 70.1% · 9 голосов
Курс LPIC-2 (201-450 и 202-450): емкостное планирование, ядро, хранилище и RAID/LVM, продвинутая сеть, DNS/BIND, Apache/Nginx, Samba/NFS, DHCP/LDAP, почта, безопасность и VPN.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Кастомизация запуска системы [202.1]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-2 и уровень инженера
  2. Измерение и устранение проблем с ресурсами [200.1]
  3. Прогнозирование потребности в ресурсах
  4. Компоненты ядра Linux [201.1]
  5. Сборка ядра из исходников [201.2]
  6. Управление модулями ядра в рантайме [201.3]
  7. Кастомизация запуска системы [202.1] (вы здесь)
  8. Восстановление системы [202.2]
  9. Альтернативные загрузчики [202.3]
  10. Работа с файловой системой Linux [203.1]
  11. Обслуживание файловых систем [203.2]
  12. Создание и настройка опций ФС [203.3]
  13. Программный RAID [204.1]
  14. Тюнинг доступа к устройствам хранения [204.2]
  15. Менеджер логических томов LVM [204.3]
  16. Базовая конфигурация сети [205.1]
  17. Продвинутая конфигурация сети [205.2]
  18. Диагностика сетевых проблем [205.3]
  19. Сборка и установка программ из исходников [206.1]
  20. Резервное копирование [206.2]
  21. Оповещение пользователей о событиях
  22. DNS-сервер BIND: базовая настройка [207.1]
  23. Зоны DNS: создание и сопровождение [207.2]
  24. Безопасность DNS-сервера [207.3]
  25. Веб-сервер Apache: базовая настройка [208.1]
  26. Apache и HTTPS [208.2]
  27. Кэширующий прокси Squid [208.3]
  28. Веб-сервер и обратный прокси Nginx [208.4]
  29. Файловый сервер Samba [209.1]
  30. Файловый сервер NFS [209.2]
  31. DHCP-сервер [210.1]
  32. Аутентификация PAM и SSSD [210.2]
  33. Использование LDAP-клиента
  34. Сервер OpenLDAP [210.4]
  35. Почтовый сервер Postfix [211.1]
  36. Управление доставкой почты и Sieve [211.2]
  37. Доступ к почтовым ящикам: Dovecot [211.3]
  38. Linux как маршрутизатор и фильтр [212.1]
  39. FTP-серверы [212.2]
  40. SSH углублённо [212.3]
  41. Безопасность, IDS и VPN [212.4 + 212.5]
Урок 6. Кастомизация запуска системы [202.1]

Задача администратора в этом уроке - перестать воспринимать systemd как черный ящик, который сам как-то поднимает систему, и научиться им управлять. Вы должны уметь читать юниты, понимать почему сервис стартует именно в этот момент, добавлять и убирать зависимости, переопределять чужие настройки не ломая пакет, и быстро находить кто тормозит загрузку. Разберем типы юнитов, модель зависимостей, параллелизм, инструменты systemctl и systemd-analyze, а также drop-in переопределения. В конце коротко глянем на SysVinit и initramfs - на экзамене они есть, но в 2026 это уже наследие.

Изображение

Как это работает

systemd - это PID 1, первый процесс после ядра, и одновременно менеджер сервисов. Его базовая единица - юнит. Юнит описывает один управляемый объект, а суффикс в имени задает тип: .service (демон или одноразовая задача), .target (группа-точка синхронизации, аналог уровней запуска), .mount (точка монтирования), .socket (сокет для активации по запросу), .timer (запуск по расписанию вместо cron), а еще .device, .path, .swap, .slice. Файлы юнитов лежат в трех местах с разным приоритетом: /usr/lib/systemd/system - от пакетов, /etc/systemd/system - правки администратора (главнее), /run/systemd/system - временные, генерируемые в рантайме.

Ключевая идея systemd - зависимости, а не жесткий линейный порядок. Есть две оси, и их постоянно путают. Первая ось - требование (нужен ли мне другой юнит вообще): Wants - желательно, но если тот не поднимется, я все равно запущусь; Requires - жестко, если зависимость упала, меня тоже остановят; Requisite - зависимость должна быть уже активна, иначе сразу провал без попытки запуска; BindsTo - еще строже, я умираю вместе с ней. Вторая ось - порядок (кто раньше во времени): After и Before. Это разные вещи. After=foo.service не означает, что foo вообще будет запущен - оно лишь говорит, что ЕСЛИ оба в плане, мой старт ждет завершения старта foo. Чтобы и затребовать, и упорядочить, нужны обе директивы: Wants и After.

Параллелизм отсюда и берется. systemd строит граф зависимостей и запускает все, что не связано отношениями порядка, одновременно. Поэтому загрузка быстрая - не ждем по цепочке, как в SysVinit. Точки синхронизации - это targets. Например multi-user.target говорит готова многопользовательская система без графики, graphical.target добавляет дисплей-менеджер. Цель загрузки по умолчанию задается симлинком default.target.

Сокет-активация и таймеры - современная замена легаси. Вместо постоянно висящего демона .socket-юнит держит порт открытым и поднимает сервис при первом подключении (так systemd вытеснил inetd/xinetd). Таймеры с OnCalendar заменяют cron и дают логи в journald, зависимости и точный контроль. Это и есть актуальный 2026-подход.

Команды и примеры

Базовое управление одинаково в Debian 13/Ubuntu 24.04 и RHEL 10/Fedora 41+ - systemd везде один:

Код: Выделить всё

systemctl status nginx.service       # состояние, последние строки лога
systemctl start|stop|restart nginx   # запуск/останов/перезапуск
systemctl reload nginx               # перечитать конфиг без рестарта
systemctl enable --now nginx         # автозапуск + сразу включить
systemctl disable nginx              # убрать из автозапуска
systemctl mask nginx                 # запретить запуск намертво (симлинк в /dev/null)
systemctl list-units --type=service  # что сейчас активно
systemctl list-unit-files            # все юниты и их состояние enable/disable
systemctl daemon-reload              # перечитать изменения в файлах юнитов
Цель загрузки и зависимости:

Код: Выделить всё

systemctl get-default                 # текущая цель по умолчанию
systemctl set-default multi-user.target
systemctl isolate multi-user.target   # переключиться сейчас (как смена runlevel)
systemctl list-dependencies graphical.target
Анализ скорости загрузки. systemd-analyze - главный инструмент диагностики:

Код: Выделить всё

systemd-analyze                       # суммарно: kernel + initrd + userspace
systemd-analyze blame                 # сервисы по времени старта, медленные сверху
systemd-analyze critical-chain        # КРИТИЧЕСКАЯ цепочка: что реально держит загрузку
systemd-analyze critical-chain nginx.service
Важно: blame показывает абсолютную длительность каждого юнита, но долгий юнит мог стартовать параллельно и ни на что не влиять. critical-chain показывает именно последовательную цепочку - чинить надо ее.

Drop-in переопределения - правильный способ менять чужой юнит. НЕ редактируйте файл в /usr/lib - его перезатрет обновление пакета. Вместо этого:

Код: Выделить всё

systemctl edit nginx.service
Откроется пустой редактор, и systemd создаст /etc/systemd/system/nginx.service.d/override.conf. Туда пишем только то, что меняем:

Код: Выделить всё

[Service]
# обнулить старое значение, иначе оно сложится со старым
ExecStart=
ExecStart=/usr/sbin/nginx -c /etc/nginx/custom.conf
LimitNOFILE=65536
Команда systemctl edit --full откроет копию всего файла для полной замены. Проверить результат:

Код: Выделить всё

systemctl cat nginx.service           # итоговый юнит со всеми drop-in
systemctl show nginx.service -p ExecStart -p LimitNOFILE
Минимальный свой таймер вместо cron (создаем backup.service и backup.timer в /etc/systemd/system):

Код: Выделить всё

# backup.timer
[Unit]
Description=Ночной бэкап

[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true

[Install]
WantedBy=timers.target
Включаем именно .timer: systemctl enable --now backup.timer, смотрим расписание через systemctl list-timers.

Разница по семействам в основном не в systemd, а в пакетах и фаерволе вокруг: Debian/Ubuntu - apt install, RHEL/Fedora - dnf install (dnf5 в Fedora). Сетевые сервисы и фаервол сегодня тоже под systemd и nftables (iptables - легаси-обертка).

Частые грабли
  • Перепутать оси: написали Requires без After и удивляетесь гонке. Requires тянет запуск, но НЕ упорядочивает - нужен еще After.
  • After= без Wants/Requires не запускает зависимость. Многие думают, что After сам поднимет сервис - нет, он только про порядок.
  • Забыли systemctl daemon-reload после правки .service-файла - systemd работает по старой версии в памяти.
  • Редактировали юнит в /usr/lib/systemd/system - обновление пакета затерло правки. Используйте drop-in.
  • В drop-in задали ExecStart, не обнулив старый. Для списочных директив надо сначала ExecStart= (пустой), потом новое значение.
  • enable у таймера повесили на .service вместо .timer - расписание не работает.
  • Доверяете blame вместо critical-chain - чините юнит, который и так шел параллельно.
  • mask путают с disable: mask делает запуск физически невозможным, даже по зависимости, что иногда ломает соседние сервисы.
Мини-лаба
  • Выполните systemd-analyze blame и systemd-analyze critical-chain, сравните: найдите юнит из blame, которого нет в критической цепочке, и объясните почему.
  • Создайте простой юнит /etc/systemd/system/hello.service с Type=oneshot и ExecStart=/usr/bin/echo привет, сделайте daemon-reload и запустите его, проверьте journalctl -u hello.
  • Через systemctl edit hello.service добавьте drop-in с RemainAfterExit=true, посмотрите итог через systemctl cat.
  • Сделайте hello.timer с OnCalendar=*:0/5 (каждые 5 минут), включите его и убедитесь через systemctl list-timers.
  • Переключите систему в multi-user.target через isolate, затем верните default-цель обратно.
  • Замаскируйте ненужный сервис, проверьте, что start выдает ошибку, затем размаскируйте.
Контрольные вопросы
  • В чем разница между Wants и Requires и как каждый из них ведет себя при падении зависимости?
  • Почему директива After не гарантирует, что указанный юнит вообще будет запущен?
  • Чем вывод systemd-analyze blame принципиально отличается от critical-chain и какой из них использовать для оптимизации загрузки?
  • Где правильно разместить переопределение чужого юнита и почему нельзя править файл в /usr/lib/systemd/system?
  • Зачем при изменении ExecStart в drop-in сначала писать ExecStart= с пустым значением?
  • Чем .socket-активация и .timer-юниты заменяют легаси xinetd и cron, и какие преимущества дают?
👍3 ❤️2 🔥1 😄 🤔1
Аватара пользователя
Mattg36
Сообщения: 1
Зарегистрирован: 13 май 2026, 05:10

Re: Кастомизация запуска системы [202.1]

Сообщение Mattg36 »

Долго не мог понять разницу After и Requires, пока не словил гонку: поставил Requires=postgresql, а мой сервис все равно стартовал раньше базы. Добавил After=postgresql.service и заработало.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
RaspberryGeek
Сообщения: 1
Зарегистрирован: 13 май 2026, 15:35

Re: Кастомизация запуска системы [202.1]

Сообщение RaspberryGeek »

Подскажите, а после systemctl edit обязательно делать daemon-reload? Вроде сам пишет, что override создал, но show старое значение показывает.
👍2 ❤️ 🔥 😄 🤔1
Ответить
← Предыдущая глава
Управление модулями ядра в рантайме [201.3]
Следующая глава →
Восстановление системы [202.2]

Все главы курса «LPIC-2: инженер Linux (201 + 202)»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-2: инженер Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость