мета-данные страницы
Это старая версия документа!
Глава 6: Запуск пользовательского пространства
Пользовательское пространство запускается в следующем порядке:
- Процесс init.
- Основные службы низшего уровня, такие как udevd и syslogd.
- Конфигурация сети.
- Службы среднего и высокого уровня (cron, print и т.д.).
- Приглашения для входа в систему, графические интерфейсы и приложения высокого уровня, такие как веб-серверы.
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) - это изменения состояния юнитов, не путать с заданиями оболочки. Требуются права суперпользователя для некоторых операций.