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

«Как стартует User space в Linux?» — вопрос из категории Linux и ОС, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Запуск пользовательского пространства (user space) — это заключительный этап загрузки ядра Linux. Процесс выглядит так:

  1. Инициализация ядра: Ядро монтирует корневую файловую систему (rootfs), инициализирует устройства и подсистемы.
  2. Запуск init-процесса (PID 1): Ядро выполняет системный вызов execve() для запуска программы, указанной в параметре ядра init=. По умолчанию это /sbin/init, который сегодня обычно является симлинком на systemd.
  3. Инициализация системы systemd:
    • Монтирует файловые системы из /etc/fstab.
    • Запускает системные сервисы (демоны), описанные в юнитах (.service, .socket и т.д.).
    • Активирует sysinit.target и basic.target.
  4. Запуск входа в систему: Systemd запускает getty@.service для виртуальных консолей (tty1-tty6) или display-manager.service для графического входа.
  5. Аутентификация: Getty или дисплей-менеджер запускают login или графический экран входа для аутентификации пользователя.
  6. Пользовательская сессия: После успешного входа запускается оболочка пользователя (например, bash) или сессия рабочего стола.

Минимальный пример на C: Можно написать примитивный init, который просто запускает оболочку (это демонстрирует принцип, но не используется в реальных системах).

#include <unistd.h>

int main() {
    // exec заменит текущий процесс (PID 1) на /bin/sh
    execl("/bin/sh", "sh", NULL);
    // Если execl вернёт управление, значит произошла ошибка
    return 1;
}