Перейти до вмісту

Модуль 1.1: Архітектура ядра

Hands-On Lab Available
Ubuntu advanced 35 min
Launch Lab ↗

Opens in Killercoda in a new tab

Основи системи | Складність: [MEDIUM] | Час: 25–30 хв

Перед початком цього модуля:

  • Обов’язково: Базове знайомство з терміналом.
  • Бажано: Мати систему Linux для експериментів.

Що ви зможете робити після цього модуля

Розділ «Що ви зможете робити після цього модуля»

Після проходження цього модуля ви зможете:

  • Пояснити роль ядра Linux як інтерфейсу між апаратним та програмним забезпеченням
  • Відстежити процес завантаження від BIOS/UEFI через ініціалізацію ядра до systemd
  • Порівняти монолітну та мікроядерну архітектури й пояснити, чому Linux обрав монолітну
  • Використовувати інструменти для інспекції ядра (uname, /proc, dmesg) для дослідження працюючої системи

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

Кожен контейнер, який ви запускаєте, кожен под Kubernetes, який ви деплоїте, кожен сервер Linux, яким ви керуєте — усі вони залежать від однієї програми: ядра Linux (kernel).

Розуміння ядра — це не просто теорія. Це практична необхідність:

  • Безпека контейнерів базується на ізоляції, яку забезпечує ядро.
  • Налаштування продуктивності вимагає розуміння того, як ядро обробляє ресурси.
  • Усунення несправностей часто зводиться до аналізу проблем на рівні ядра.
  • Проблеми вузлів Kubernetes (node problems) — це зазвичай проблеми ядра.

Коли кажуть «контейнери використовують ядро хоста», чи розумієте ви, що це насправді означає? Після цього модуля — будете.


  • Ядро Linux має понад 30 мільйонів рядків коду, що робить його одним із найбільших проєктів із відкритим кодом у світі. Попри це, воно завантажується за секунди.

  • Лінус Торвальдс написав перше ядро у 1991 році як хобі-проєкт. Його знаменитий пост у групі новин починався так: «Я роблю (безкоштовну) операційну систему (просто хобі, вона не буде великою і професійною як gnu)».

  • Понад 95% найшвидших суперкомп’ютерів світу працюють на Linux. Усі 500 систем зі списку TOP500 використовують Linux.

  • Ядро є реентерабельним, тобто декілька процесів можуть виконувати код ядра одночасно. Це критично для багатоядерних систем.


Ядро — це серце операційної системи. Це програма, яка:

  • Спілкується напряму із залізом (hardware).
  • Керує оперативною пам’яттю.
  • Розподіляє час процесора між програмами (планувальник).
  • Забезпечує ізоляцію між програмами.
  • Обробляє операції вводу/виводу (диски, мережа).

Думайте про нього як про головного менеджера вашого комп’ютера. Кожна програма працює з дозволу ядра і під його наглядом.

┌─────────────────────────────────────────────────────────┐
│ Користувацькі програми │
│ (bash, nginx, kubectl, ваші програми) │
├─────────────────────────────────────────────────────────┤
│ Системні бібліотеки │
│ (glibc, libssl, libcurl) │
├─────────────────────────────────────────────────────────┤
│ Системні виклики │
│ (інтерфейс спілкування з ядром) │
├─────────────────────────────────────────────────────────┤
│ ЯДРО LINUX │
│ ┌──────────┬──────────┬──────────┬──────────────┐ │
│ │Плануваль-│ Менеджер │ Файлова │ Мережевий │ │
│ │ник проц. │ пам'яті │ система │ стек │ │
│ └──────────┴──────────┴──────────┴──────────────┘ │
│ ┌──────────────────────────────────────────────┐ │
│ │ Драйвери пристроїв │ │
│ └──────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────┤
│ ЗАЛІЗО │
│ (CPU, RAM, Диск, Мережа) │
└─────────────────────────────────────────────────────────┘

Kernel Space проти User Space

Розділ «Kernel Space проти User Space»

Це найважливіша концепція цього модуля.

Linux розділяє пам’ять на два окремі простори:

Kernel Space (Простір ядра)User Space (Простір користувача)
Захищена область пам’ятіЗвичайна область для програм
Повний доступ до залізаНемає прямого доступу до заліза
Працює з найвищими привілеямиПрацює з обмеженими привілеями
Тут живуть ядро та драйвериТут працюють ваші додатки
Помилка тут = падіння всієї системиПомилка тут = падіння лише програми

Захист. Якби кожна програма могла звертатися до заліза напряму, баг у Firefox міг би стерти ваш диск. Шкідлива програма могла б прочитати пам’ять будь-якого іншого процесу.

Поділ гарантує:

  • Програми не заважають одна одній.
  • Програми не можуть “покласти” систему.
  • Програми не мають доступу до ресурсів без дозволу.

Процесор контролює це

Розділ «Процесор контролює це»

Сучасні процесори мають рівні привілеїв, так звані кільця (rings):

  • Ring 0 (Ядро): Тут працює ядро. Дозволені всі інструкції.
  • Ring 3 (Користувач): Тут працюють програми. Обмежені інструкції.

Якщо програма з Ring 3 спробує виконати привілейовану команду, процесор зупинить її й викличе виняток (exception).


Системні виклики (System Calls): Міст між світами

Розділ «Системні виклики (System Calls): Міст між світами»

Якщо програми не мають доступу до заліза, як вони взагалі щось роблять?

Системні виклики (syscalls) — це відповідь. Це єдиний спосіб для програми попросити ядро виконати щось корисне (прочитати файл, надіслати дані в мережу).

Популярні системні виклики

Розділ «Популярні системні виклики»
КатегоріяВикликиПризначення
Процесиfork, exec, exitСтворення та керування процесами
Файлиopen, read, write, closeРобота з файлами
Мережаsocket, bind, connectРобота з мережею
Пам’ятьmmap, brkВиділення пам’яті

Як працює системний виклик

Розділ «Як працює системний виклик»
User Space (Користувач) Kernel Space (Ядро)
│ │
│ 1. Програма викликає read() │
│ ─────────────────────────────► │
│ │
│ 2. Бібліотека готує виклик │
│ (кладе аргументи в регістри) │
│ │
│ 3. Інструкція SYSCALL │
│ ══════════════════════════════► │ ← Перемикання режиму!
│ │
│ 4. Ядро перевіряє права
│ 5. Ядро читає дані з диска
│ 6. Ядро копіює дані в пам'ять програми
│ │
│ ◄══════════════════════════════ │ ← Повернення режиму
│ 7. Програма отримує результат │
│ │

Модулі ядра (Kernel Modules)

Розділ «Модулі ядра (Kernel Modules)»

Ядро Linux є модульним. Не всі функції “зашиті” в нього наглухо — багато чого завантажується за потреби.

  • Гнучкість: Завантажуйте тільки те, що потрібно.
  • Економія пам’яті: Не тримайте драйвери для пристроїв, яких у вас немає.
  • Hot-plugging: Драйвер завантажується сам, коли ви підключаєте пристрій.

Керування модулями

Розділ «Керування модулями»
Terminal window
# Список завантажених модулів
lsmod
# Інфо про конкретний модуль
modinfo overlay
# Завантажити модуль
sudo modprobe br_netfilter
# Видалити модуль
sudo modprobe -r br_netfilter

Для Kubernetes критично важливі модулі: overlay (для шарів образів) та br_netfilter (для мережевих політик).


Ядро та Контейнери

Розділ «Ядро та Контейнери»

Ось найважливіший висновок: контейнери ділять ядро хоста.

┌─────────────────────────────────────────────────────────────┐
│ ХОСТ-СИСТЕМА │
├─────────────────────────────────────────────────────────────┤
│ Контейнер А Контейнер Б Контейнер В │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ Додаток │ │ Додаток │ │ Додаток │ │
│ │ (Alpine) │ │ (Ubuntu) │ │ (RHEL) │ │
│ └───────────┘ └───────────┘ └───────────┘ │
├─────────────────────────────────────────────────────────────┤
│ СПІЛЬНЕ ЯДРО ХОСТА │
│ (напр. Linux 5.15) │
├─────────────────────────────────────────────────────────────┤
│ ЗАЛІЗО │
└─────────────────────────────────────────────────────────────┘

Кожен контейнер має свою файлову систему і бібліотеки, але всі вони використовують одне й те саме ядро.

Що це означає на практиці?

Розділ «Що це означає на практиці?»
  1. Швидкість: Немає витрат на запуск окремого ядра (як у віртуальних машинах).
  2. Безпека: Якщо в ядрі є дірка — вона однаково небезпечна для ВСІХ контейнерів на цій машині.
  3. Сумісність: Програма в контейнері має бути сумісною з ядром хоста.

Перевірка (Спробуйте самі!)

Розділ «Перевірка (Спробуйте самі!)»
Terminal window
# На вашій машині
uname -r
# Всередині контейнера Alpine
docker run --rm alpine uname -r
# Результат буде ОДНАКОВИМ!

Образ контейнера (Alpine, Ubuntu) — це лише набір інструментів та бібліотек користувацького простору (user space). Ядро завжди береться від хост-машини.


  1. Що таке системний виклик (syscall)?

    Відповідь Це спеціальний механізм, за допомогою якого програма з простору користувача просить ядро виконати привілейовану дію (наприклад, відкрити файл або створити мережеве з'єднання).
  2. Чим простір ядра (kernel space) відрізняється від простору користувача (user space)?

    Відповідь Простір ядра має необмежений доступ до заліза і пам'яті, там працює саме ядро. Простір користувача — це обмежена область, де працюють звичайні програми. Це розділення захищає систему від помилок у програмах та шкідливого коду.
  3. Чи мають контейнери власне ядро?

    Відповідь Ні. На відміну від віртуальних машин, контейнери ділять ядро хост-системи. Це робить їх легкими та швидкими, але означає, що вразливість у ядрі впливає на всі контейнери на хості.
  4. Навіщо потрібні модулі ядра?

    Відповідь Модулі дозволяють розширювати функціонал ядра (наприклад, додавати драйвери або підтримку нових протоколів) без перезавантаження системи та без необхідності тримати всі можливі функції в пам'яті постійно.

Завдання: Дослідити межу між ядром та користувачем.

  1. Перевірте версію вашого ядра:
    Terminal window
    uname -r
  2. Подивіться список завантажених модулів:
    Terminal window
    lsmod | head -n 10
  3. Прослідкуйте, які системні виклики робить проста команда ls:
    Terminal window
    strace -c ls /tmp
    (Ви побачите таблицю з назвами викликів, таких як openat, mmap, read).

Критерії успіху: Ви вмієте визначати версію ядра та розумієте, які системні виклики використовують ваші програми.


  • Ядро — головний менеджер системи.
  • Розділення просторів (Kernel vs User) — основа безпеки Linux.
  • Системні виклики — міст між вашою програмою та залізом.
  • Контейнери ділять ядро хоста — це ключ до їхньої ефективності.

Далі: Модуль 1.2: Процеси та systemd — дізнайтеся, як ядро керує життям програм і як працює менеджер сервісів.