# Linux

## Що це таке

Linux — це вільне ядро операційної системи з родини Unix: програма, яка
запускається першою, керує обладнанням, розподіляє процесорний час і пам'ять між
усіма іншими програмами та вирішує, кому можна торкатися якого файлу й якого
мережевого порту. У повсякденній мові цим словом називають і всю операційну
систему, зібрану довкола ядра, а дехто пише GNU/Linux, щоб віддати належне
інструментам GNU, які зазвичай ідуть разом із ним.

Почав його Лінус Торвальдс 1991 року як клон Unix, написаний з нуля, і відтоді
ядро розвиває вільна мережа розробників, що співпрацюють через інтернет. Воно
орієнтується на стандарти POSIX і Single UNIX Specification, тож програми з
інших Unix-подібних систем зазвичай збираються під нього з невеликими змінами.
Починалося ядро на 32-бітному процесорі Intel 386, а нині працює на довгому
переліку 32- і 64-бітних архітектур. Код поширюється за ліцензією GPL, лише
версії 2, з окремим застереженням: програми, які просто звертаються до ядра
через системні виклики, під її дію не підпадають. Саме тому пропрієтарне
програмне забезпечення працює на Linux без ліцензійних питань.

Саме ядро — ще не система, у яку можна увійти. Робочій системі потрібні також
бібліотека C, оболонка, система ініціалізації, менеджер пакетів і тисячі
програм, а проєкти, що збирають усе це в щось придатне до встановлення,
називаються дистрибутивами. Debian, Ubuntu, Red Hat Enterprise Linux та його
перезбірки, SUSE, Fedora й Alpine — це дистрибутиви. Кожен постачає власну
збірку ядра, власні налаштування за замовчуванням і власну обіцянку, як довго
виправлятиме вразливості.

З чим порівнюють Linux, залежить від завдання. На серверах — з Windows Server і
з родиною BSD, тобто FreeBSD та OpenBSD, які розробляють як єдину цілісну
систему, а не складають із частин. На ноутбуках — з Windows і macOS.

## Чому це важливо

Для компанії, що запускає програми на власних серверах чи в хмарі, операційну
систему здебільшого обрано ще до того, як хтось поставить запитання. Вебсервери,
бази даних, рушії контейнерів та інструменти моніторингу створюють насамперед
для Linux і найретельніше тестують саме там. Тож рішення, яке лишається, вужче:
який саме Linux і коли Windows Server усе-таки виправданий.

Вибір між Linux і Windows Server визначає програмне забезпечення, а не сама
система. Бізнес, побудований на Active Directory, IIS чи старіших застосунках
.NET, має вагомі причини лишатися на Windows. Майже все інше в сучасному
вебстеку, від PostgreSQL і Nginx до Kubernetes, розраховане на Linux, і навіть
Microsoft SQL Server має версію для Linux.

З вартістю все просто. Ядро та спільнотні дистрибутиви на кшталт Debian і Ubuntu
безкоштовні незалежно від кількості машин, і під час аудиту не доводиться
рахувати ліцензії; Windows Server продається за комерційною ліцензією. У випадку
Linux гроші йдуть на людей і, за бажання, на підписку на підтримку від
постачальника, як-от Canonical, Red Hat чи SUSE.

Контейнери прив'язують цей вибір ще міцніше. Образ контейнера — це
користувацький простір Linux, запакований у файл, а запустити його означає
запустити звичайні процеси на ядрі Linux. Тому на Mac чи ноутбуці з Windows
інструменти для контейнерів спершу піднімають невелику віртуальну машину з
Linux, а власний інструмент Apple, `container`, запускає кожен контейнер в
окремій легкій віртуальній машині. Хто обирає контейнери, той обирає Linux, хоч
би що стояло на ноутбуках розробників.

Насправді два сервери з Linux різняться дистрибутивом і тим, як довго його
підтримують. Проєкт ядра випускає нову основну (mainline) версію кожні
дев'ять–десять тижнів і роками підтримує кілька довгострокових (longterm) гілок:
6.12, наприклад, за планом отримуватиме виправлення до грудня 2028 року.
Дистрибутиви надбудовують над цим власну підтримку, і ядро дистрибутива
підтримує сам дистрибутив, а не розробники ядра. Обирайте дистрибутив за строком
підтримки й за тим, що команда вже вміє.

Одне правило проєкту ядра робить оновлення менш ризикованими, ніж можна подумати
з такого темпу: зміна, яка ламає програму, що раніше працювала, вважається
регресією, а регресії виправляють, часто просто відкочуючи зміну. Завдяки цьому
давно зібрані програми й далі працюють на нових ядрах.

Зворотний бік цієї свободи в тому, що фраза «у нас Linux» мало що пояснює. Два
дистрибутиви можуть мати різні менеджери пакетів, інструменти брандмауера,
способи налаштування мережі й ритм випусків, і команді, яка знає один,
доведеться частково переучуватися на інший.

## Як це виглядає на практиці

Найближче до заліза — один хост із 464 МБ пам'яті, на якому працюють платформа
для коду (forge), база даних і вебсервер. Сигнал про нестачу пам'яті чи місця на
диску тут дає
[перевірка за принципом dead man's switch на таймері](/uk/portfolio/built-dead-mans-switch-monitoring-115/):
кожні п'ятнадцять хвилин, із випадковим зсувом, невеликий скрипт вимірює
доступну пам'ять і вільне місце на диску й пінгує зовнішній сервіс лише тоді,
коли обидва показники вище порогів. Тиша і є тривогою. Скрипт від початку читав
правильне число, доступну пам'ять, а шість імен змінних навколо нього казали
«free». Оскільки ядро віддає незайняту пам'ять під кеш, вільна пам'ять на
здоровій машині з Linux тримається біля нуля: з порогом у десять відсотків читач
побачив би дванадцять мегабайтів вільними на машині з 464 МБ, а «виправлення» в
один символ перетворило б робочу тривогу на таку, що спрацьовує постійно. Імена
виправили, а сторінка прямо називає межу: перевірка доводить, що машина здорова,
але не те, що сайт відповідає на запити.

Далі від заліза —
[перша панель спостережуваності](/uk/portfolio/developed-and-launched-the-company-s-first-observability-9/)
компанії, яка збирала по SSH дані про CPU, RAM, HDD, температуру та інші метрики
з віддалених серверів на Linux і так само стежила за контейнерами Docker. Друга
версія перейшла на Grafana і Prometheus. Панель висіла на великому телевізорі в
офісі зі сповіщеннями про перевищення порогів, і команди почали виявляти й
усувати інциденти на 40% швидше.

А в масштабі цілої інфраструктури доступ став тим, що записано, а не тим, що
хтось пам'ятає.
[Понад 1 000 правил RBAC](/uk/portfolio/enhanced-data-security-by-implementing-1-000-rbac-14/)
охопили середовища розробників, екземпляри застосунків, PostgreSQL, MS SQL і
сервери на Linux, і їх розгортали через Ansible, щоб усі середовища виходили
однаковими. Розробники мали доступ лише до призначених їм серверів. Ризик
несанкціонованого доступу знизився на 85%, а автоматизація скоротила час
налаштування на 60% порівняно з ручною роботою.

## Де виникають проблеми

**Моніторинг показує майже заповнену пам'ять на цілком здоровому сервері.**
Linux вважає незайняту пам'ять змарнованою і заповнює її кешем файлів, який
віддає, щойно програма попросить місця. Показник «free» враховує лише пам'ять,
що взагалі нічим не зайнята, тож на будь-якій навантаженій машині він сповзає до
нуля. На запитання «чи витримає сервер більше роботи?» відповідає MemAvailable —
власна оцінка ядра, скільки пам'яті можуть отримати нові програми без свопу.
Ставте тривогу саме на нього:

```sh
grep -E '^(MemFree|MemAvailable):' /proc/meminfo
```

**Сервіс зникає, і пояснення доводиться шукати в журналі ядра, а не в журналі
самого сервісу.** За замовчуванням Linux дозволяє програмам резервувати більше
пам'яті, ніж є на машині, з розрахунком, що значної її частини так ніхто й не
торкнеться. Коли розрахунок не справджується і пам'ять справді закінчується, OOM
killer обирає процес, зазвичай великий, і завершує його. Застосунок не встигає
нічого записати; слід лишається в журналі ядра, який показує `journalctl -k`.
Задайте кожному сервісу власну межу пам'яті через `MemoryMax=` у systemd або
ліміт контейнера, щоб програму, яка вийшла з-під контролю, зупинили раніше, ніж
ядру доведеться обирати, і стежте за доступною пам'яттю а не чекайте на
примусове завершення.

**Звіт про помилку, надісланий розробникам ядра, лишається без відповіді.** На
машині працює ядро дистрибутива з його власними патчами, а розробники ядра
підтримують лише власні випуски. `uname -r` показує версію, і все після дефіса,
як у `6.8.0-45-generic`, означає збірку дистрибутива. Спершу повідомте про
проблему дистрибутиву або відтворіть її на актуальному ядрі з kernel.org, і лише
тоді несіть її розробникам ядра.

**Оновлення безпеки перестають надходити, а сервер працює далі як завжди.**
Кожен випуск дистрибутива й кожне довгострокове ядро мають дату завершення
підтримки, і сама машина про неї не попереджає. Довгострокові гілки 5.10 і 5.15,
наприклад, за планом дійдуть до неї в грудні 2026 року. Тримайте дату завершення
підтримки в тому самому переліку, що й назву сервера, і плануйте оновлення на
один випуск наперед, а не в останній момент.

## Що почитати далі

- [About Linux Kernel](https://www.kernel.org/linux.html)
  — коротке пояснення від самого проєкту ядра: що таке Linux і чому новачкові
  потрібен дистрибутив.
- [Releases](https://www.kernel.org/category/releases.html)
  — основні, стабільні й довгострокові ядра та запланована дата завершення
  кожної довгострокової гілки.
- [The /proc Filesystem](https://docs.kernel.org/filesystems/proc.html)
  — де визначено MemFree, MemAvailable та інші лічильники пам'яті.
- [Overcommit Accounting](https://docs.kernel.org/mm/overcommit-accounting.html)
  — три режими overcommit і що кожен із них обіцяє програмі.
- [Reporting regressions](https://docs.kernel.org/admin-guide/reporting-regressions.html)
  — правило «жодних регресій» і як повідомити про поломку, щоб її врахували.
- [Linux kernel licensing rules](https://docs.kernel.org/process/license-rules.html)
  — лише GPL-2.0 і застереження про системні виклики, яке звільняє програми над
  ядром від ліцензії.

<https://engineer.company/uk/glossary/linux/>
