← Назад к вопросам

Как стартует User space в Linux?

3.0 Senior🔥 81 комментариев
#Linux и операционные системы#Qt и GUI#STL контейнеры и алгоритмы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как стартует User space в Linux

Процесс загрузки пользовательского пространства — это критический этап инициализации Linux-системы. После завершения загрузки ядра и инициализации hardware, контроль передаётся на user space.

Основные этапы

1. Инициализация ядра

Ядро Linux (kernel) загружается bootloader'ом (GRUB, LILO), выполняет свою инициализацию и затем ищет init-процесс:

# Стандартный путь для init процесса
/sbin/init         # традиционный SysVinit
/lib/systemd/systemd    # современные системы
/sbin/openrc-init  # OpenRC в Alpine

2. Запуск PID 1 (init процесс)

Ядро запускает процесс с PID=1, который становится родителем всех остальных процессов:

// Упрощённо: как ядро запускает init
int main(int argc, char *argv[]) {
    // ядро вызывает init примерно так:
    execve("/sbin/init", argv, envp);
    // никогда не вернётся, если успешно
}

3. systemd инициализация (современный стандарт)

В большинстве современных дистрибутивов используется systemd:

# systemd читает конфигурацию
/etc/systemd/system/    # кастомные юниты
/usr/lib/systemd/system/ # стандартные юниты

# Стартует default target (по умолчанию multi-user.target)
systemctl get-default
# output: graphical.target или multi-user.target

4. Загрузка сервисов

# Пример /etc/systemd/system/myservice.service
[Unit]
Description=My Custom Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/myapp
Restart=always

[Install]
WantedBy=multi-user.target

Порядок запуска определяется dependency tree:

  • After= — стартуй после указанного сервиса
  • Wants= — опциональная зависимость
  • Requires= — обязательная зависимость

5. SysVinit (старый подход)

Для справки, в старых системах использовались runlevels:

# /etc/inittab
id:3:initdefault:    # runlevel 3 (multi-user)
si::sysinit:/etc/rc.d/rc.sysinit

# Скрипты в /etc/rc.d/rc3.d/
S10network          # S = start, K = kill
S20httpd
K20httpd            # при выключении

Процесс инициализации: шаг за шагом

  1. Bootloader (GRUB) загружает ядро и initramfs
  2. Ядро выполняет инициализацию: память, прерывания, файловые системы
  3. Kernel mount root filesystem (/)
  4. Kernel запускает init с PID=1
  5. Init читает конфигурацию (systemd читает /etc/systemd/)
  6. Init запускает сервисы согласно dependencies
  7. Стартуют getty (login shells) на TTY
  8. User может залогиниться и стартовать приложения

Проверка процесса загрузки

# Посмотреть порядок загрузки systemd
systemd-analyze
systemd-analyze blame      # какие юниты дольше грузились

# Логи загрузки
journalctl -b 0            # текущая загрузка
journalctl -b -1           # предыдущая загрузка
journalctl -u httpd.service

# Процессы в момент загрузки
ps aux | head               # PID 1 должен быть init

Важные моменты

  • PID 1 не может быть killed — если init умрёт, система зависнет
  • Systemd parallelizes — запускает независимые сервисы параллельно
  • Targets grouping — несколько сервисов объединяются в target
  • Emergency mode — если критические сервисы не стартуют, система попадает в emergency shell

Отладка проблем загрузки

Если система зависает при загрузке:

# Добавь параметр в GRUB для debug
systemd.log_level=debug

# Или смотри логи в initramfs
mkinitramfs

Это фундаментальный процесс, который определяет готовность системы к работе.