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

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


Глава 6: Запуск пользовательского пространства

Пользовательское пространство запускается в следующем порядке:

  1. Процесс init.
  2. Основные службы низшего уровня, такие как udevd и syslogd.
  3. Конфигурация сети.
  4. Службы среднего и высокого уровня (cron, print и т.д.).
  5. Приглашения для входа в систему, графические интерфейсы и приложения высокого уровня, такие как веб-серверы.

6.1 Основные сведения об init

init (инициализация) - программа пользовательского пространства, расположенная в /sbin. Её основная цель - запускать и останавливать основные служебные процессы системы.

Во всех актуальных версиях основных дистрибутивов Linux стандартной реализацией init является systemd.

Альтернативные системы init

В старых системах встречаются другие реализации:

Система Описание Использование
System V init Традиционная последовательная инициализация (Sys V из Unix System V) RHEL до 7.0, Debian 8
Upstart Реализация для дистрибутивов Ubuntu Ubuntu до 15.04
runit Облегченная система инициализации Встроенные платформы и облегченные системы
Android init Собственная система инициализации Android
BSD init Версия для BSD Редко встречается в современных Linux системах

Проблемы System V init

Система инициализации System V работает как последовательная серия сценариев, где каждый сценарий запускает одну службу или настраивает отдельную часть системы. Обычно зависимости разбираются просто, и система достаточно гибка для необычных задач.

Однако существуют существенные ограничения:

Производительность:

  • Две части последовательной загрузки не могут выполняться одновременно

Управление системой:

  • Сложность поиска PID демона службы (требуется ps или механизм, специфичный для службы)
  • Полустандартная система записи PID (/var/run/myservice.pid)
  • Много стандартного шаблонного кода в сценариях

Конфигурация:

  • Мало информации о службах и конфигурации по требованию
  • Большинство служб запускается только при загрузке
  • Конфигурация устанавливается в основном при загрузке
  • Традиционный демон inetd (для сетевых служб по требованию) уже не используется

Современные системы инициализации (такие как systemd) решают эти проблемы путём изменения способа запуска служб, порядка их контроля и настройки зависимостей.

6.2 Определение системы инициализации

Определить версию инициализации можно, проверив наличие определённых файлов и каталогов:

systemd:

  • Наличие каталогов /usr/lib/systemd и /etc/systemd

Upstart:

  • Наличие каталога /etc/init с несколько файлами .conf
  • (Исключение: Debian 7 и старше используют System V init, несмотря на /etc/init)

System V init:

  • Отсутствие вышеуказанных каталогов
  • Наличие файла /etc/inittab

Информацию также можно получить из страницы руководства init(1).

6.3 systemd

systemd - современная реализация init в Linux, интегрирующая функциональность Unix-служб (cron, inetd). Вдохновлена launchd от Apple.

Основные отличия от традиционной init:

  • Расширенное управление службами
  • Отслеживание демонов после запуска
  • Группировка процессов службы
  • Ориентирована на выполнение задач и целей

Система использует юниты (units) для задач, содержит инструкции запуска и зависимости. Активирует юниты по мере готовности, не придерживаясь жесткой последовательности. Реагирует на системные события (uevents).

6.3.1 Юниты и типы юнитов

systemd управляет не только процессами/службами, но и монтированием ФС, запросами подключения сети, таймерами.

Тип юнита Описание
Service units Управление служебными демонами Unix
Target units Управление другими юнитами, группировка
Socket units Местоположение запросов входящих сетевых подключений
Mount units Контроль присоединения файловых систем

Примечание: полный список типов см. systemd(1)

6.3.2 Графики загрузки и зависимостей юнитов

При загрузке активируется целевой юнит default.target, объединяющий юниты служб и монтирования как зависимости. Зависимости образуют граф (не дерево). Юниты могут зависеть от нескольких предыдущих.

Визуализировать граф: `systemd-analyze dot` (требует фильтрации для сложных систем).

Примечание: В большинстве систем default.target → целевой юнит высокого уровня (графический интерфейс и т.д.)

6.3.3 Конфигурация systemd

Основные каталоги:

Каталог Назначение
/lib/systemd/system или /usr/lib/systemd/system Системные юниты (глобальная конфигурация)
/etc/systemd/system Локальная конфигурация

Правило: не изменяйте системные юниты (сохраняет дистрибутив), вносите изменения в /etc/systemd/system.

Проверка пути поиска:

systemctl -p UnitPath show
pkg-config systemd --variable=systemdsystemunitdir
pkg-config systemd --variable=systemdsystemconfdir

Юнит-файлы

Формат из спецификации XDG Desktop Entries (.ini подобный) с секциями в квадратных скобках и переменными.

Пример dbus-daemon.service:

[Unit]
Description=D-Bus System Message Bus
Documentation=man:dbus-daemon(1)
Requires=dbus.socket
RefuseManualStart=yes

[Service]
ExecStart=/usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
ExecReload=/usr/bin/dbus-send --print-reply --system --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig

[Unit] - описание, информация о зависимостях [Service] - подготовка, запуск, перезагрузка службы

Переменные

Синтаксис: `$ПЕРЕМЕННАЯ`

Пример (sshd.service):

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStartPre=/usr/sbin/sshd-keygen
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
  • $OPTIONS, $CRYPTO_POLICY - из EnvironmentFile
  • $MAINPID - PID отслеживаемого процесса

Спецификаторы

Синтаксис: `%спецификатор`

  • %n - имя текущего юнита
  • %H - имя хоста
  • %I, %i - имя экземпляра (для юнитов с @)

Пример: getty@.service → getty@tty1, getty@tty2 (динамическое создание).

Полный список см. systemd.unit(5)

6.3.4. Процесс работы systemd

systemctl - основная команда для управления systemd юнитами.

Основные команды

Операция Команда Описание
Список активных юнитов systemctl list-units Вывод сокращен; используйте –full для полных имен
Все юниты systemctl list-units –all Включает неактивные юниты
Статус юнита systemctl status <unit> Показывает статус, PID, cgroup, журнал
Запуск systemctl start <unit> Активация юнита
Остановка systemctl stop <unit> Деактивация юнита
Перезапуск systemctl restart <unit> Перезапуск юнита
Перезагрузка конфига systemctl reload <unit> Перезагрузка только для данного юнита
Перезагрузка всех systemctl daemon-reload Перезагрузка всех конфигураций
Текущие задания systemctl list-jobs Список активных заданий (изменений состояния)
Журнал юнита journalctl –unit=<unit> Все сообщения журнала

Пример просмотра статуса

$ systemctl status sshd.service

Вывод содержит: статус загрузки, состояние (active/inactive), основной процесс (Main PID), контрольную группу (cgroup) и сообщения журнала.

Добавление юнита

Размещайте юнит-файлы в /etc/systemd/system (не перезаписываются при обновлении дистрибутива).

# Создать файл /etc/systemd/system/test1.target
[Unit]
Description=test 1
 
# Создать файл /etc/systemd/system/test2.target с зависимостью
[Unit]
Description=test 2
Wants=test1.target
 
# Активировать
systemctl start test2.target
 
# Если есть секция [Install], включить перед активацией
systemctl enable test2.target

Удаление юнита

# 1. Деактивировать
systemctl stop <unit>
 
# 2. Отключить (если есть [Install])
systemctl disable <unit>
 
# 3. Удалить юнит-файл

Примечание: Задания (jobs) - это изменения состояния юнитов, не путать с заданиями оболочки. Требуются права суперпользователя для некоторых операций.