Модуль 1.1: Архітектура ядра
Основи системи | Складність:
[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.
-
Ядро є реентерабельним, тобто декілька процесів можуть виконувати код ядра одночасно. Це критично для багатоядерних систем.
Що таке ядро (Kernel)?
Розділ «Що таке ядро (Kernel)?»Ядро — це серце операційної системи. Це програма, яка:
- Спілкується напряму із залізом (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: Драйвер завантажується сам, коли ви підключаєте пристрій.
Керування модулями
Розділ «Керування модулями»# Список завантажених модулівlsmod
# Інфо про конкретний модульmodinfo overlay
# Завантажити модульsudo modprobe br_netfilter
# Видалити модульsudo modprobe -r br_netfilterДля Kubernetes критично важливі модулі: overlay (для шарів образів) та br_netfilter (для мережевих політик).
Ядро та Контейнери
Розділ «Ядро та Контейнери»Ось найважливіший висновок: контейнери ділять ядро хоста.
┌─────────────────────────────────────────────────────────────┐│ ХОСТ-СИСТЕМА │├─────────────────────────────────────────────────────────────┤│ Контейнер А Контейнер Б Контейнер В ││ ┌───────────┐ ┌───────────┐ ┌───────────┐ ││ │ Додаток │ │ Додаток │ │ Додаток │ ││ │ (Alpine) │ │ (Ubuntu) │ │ (RHEL) │ ││ └───────────┘ └───────────┘ └───────────┘ │├─────────────────────────────────────────────────────────────┤│ СПІЛЬНЕ ЯДРО ХОСТА ││ (напр. Linux 5.15) │├─────────────────────────────────────────────────────────────┤│ ЗАЛІЗО │└─────────────────────────────────────────────────────────────┘Кожен контейнер має свою файлову систему і бібліотеки, але всі вони використовують одне й те саме ядро.
Що це означає на практиці?
Розділ «Що це означає на практиці?»- Швидкість: Немає витрат на запуск окремого ядра (як у віртуальних машинах).
- Безпека: Якщо в ядрі є дірка — вона однаково небезпечна для ВСІХ контейнерів на цій машині.
- Сумісність: Програма в контейнері має бути сумісною з ядром хоста.
Перевірка (Спробуйте самі!)
Розділ «Перевірка (Спробуйте самі!)»# На вашій машиніuname -r
# Всередині контейнера Alpinedocker run --rm alpine uname -r
# Результат буде ОДНАКОВИМ!Образ контейнера (Alpine, Ubuntu) — це лише набір інструментів та бібліотек користувацького простору (user space). Ядро завжди береться від хост-машини.
Тест
Розділ «Тест»-
Що таке системний виклик (syscall)?
Відповідь
Це спеціальний механізм, за допомогою якого програма з простору користувача просить ядро виконати привілейовану дію (наприклад, відкрити файл або створити мережеве з'єднання). -
Чим простір ядра (kernel space) відрізняється від простору користувача (user space)?
Відповідь
Простір ядра має необмежений доступ до заліза і пам'яті, там працює саме ядро. Простір користувача — це обмежена область, де працюють звичайні програми. Це розділення захищає систему від помилок у програмах та шкідливого коду. -
Чи мають контейнери власне ядро?
Відповідь
Ні. На відміну від віртуальних машин, контейнери ділять ядро хост-системи. Це робить їх легкими та швидкими, але означає, що вразливість у ядрі впливає на всі контейнери на хості. -
Навіщо потрібні модулі ядра?
Відповідь
Модулі дозволяють розширювати функціонал ядра (наприклад, додавати драйвери або підтримку нових протоколів) без перезавантаження системи та без необхідності тримати всі можливі функції в пам'яті постійно.
Практична вправа
Розділ «Практична вправа»Завдання: Дослідити межу між ядром та користувачем.
- Перевірте версію вашого ядра:
Terminal window uname -r - Подивіться список завантажених модулів:
Terminal window lsmod | head -n 10 - Прослідкуйте, які системні виклики робить проста команда
ls:(Ви побачите таблицю з назвами викликів, таких якTerminal window strace -c ls /tmpopenat,mmap,read).
Критерії успіху: Ви вмієте визначати версію ядра та розумієте, які системні виклики використовують ваші програми.
Підсумок
Розділ «Підсумок»- Ядро — головний менеджер системи.
- Розділення просторів (Kernel vs User) — основа безпеки Linux.
- Системні виклики — міст між вашою програмою та залізом.
- Контейнери ділять ядро хоста — це ключ до їхньої ефективності.
Далі: Модуль 1.2: Процеси та systemd — дізнайтеся, як ядро керує життям програм і як працює менеджер сервісів.