← Назад к вопросам
Как стартует 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 # при выключении
Процесс инициализации: шаг за шагом
- Bootloader (GRUB) загружает ядро и initramfs
- Ядро выполняет инициализацию: память, прерывания, файловые системы
- Kernel mount root filesystem (/)
- Kernel запускает init с PID=1
- Init читает конфигурацию (systemd читает /etc/systemd/)
- Init запускает сервисы согласно dependencies
- Стартуют getty (login shells) на TTY
- 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
Это фундаментальный процесс, который определяет готовность системы к работе.