Ядро Linux
Ядро Linux
Ядро Linux — это центральная программа операционной системы: единственный слой, который напрямую управляет процессором, памятью, дисками и сетью, а всем остальным программам выдаёт ресурсы по запросу. Всё, что ты называешь «Linux» — Ubuntu, Android, прошивка роутера, — это ядро плюс обвязка вокруг него.
История
Осень 1991 года, Хельсинки. Линус Торвальдс, 21-летний студент университета, купил себе компьютер на процессоре Intel 386 и был недоволен учебной операционной системой Minix, которую тогда использовали на курсах. 25 августа 1991 года он написал в новостную группу comp.os.minix сообщение, ставшее легендой: «Я делаю (бесплатную) операционную систему — просто хобби, ничего большого и профессионального вроде GNU не будет». Это одно из самых знаменитых ошибочных предсказаний в истории IT.
Ключевые вехи:
- Сентябрь 1991 — версия 0.01, примерно десять тысяч строк кода. Работает только на 386, умеет очень мало.
- 1992 — Торвальдс меняет лицензию на GPLv2 (свободная лицензия, обязывающая публиковать изменения). Это решение он сам позже называл лучшим в жизни: именно GPL заставила компании возвращать доработки в общий котёл.
- Январь 1992 — публичный спор с Эндрю Таненбаумом (автором Minix), начавшийся с письма «Linux устарел». Таненбаум топил за микроядра, Торвальдс — за монолитную архитектуру. Спор вошёл в учебники, а монолитный Linux — в серверы всего мира.
- Март 1994 — версия 1.0, первая «взрослая».
- Декабрь 2003 — версия 2.6, огромный шаг по масштабируемости; эта ветка жила почти восемь лет.
- 2005 — Торвальдс за пару недель пишет Git, потому что у проекта отобрали бесплатную лицензию на прежнюю систему контроля версий BitKeeper. Так побочным продуктом ядра стал главный инструмент разработчиков планеты.
- 2011 — версия 3.0 к двадцатилетию проекта (смена нумерации, а не революция).
- Сегодня — ветка 6.x. Новая версия выходит примерно каждые 9–10 недель, в каждом цикле участвуют порядка двух тысяч разработчиков из сотен компаний (по данным Linux Foundation).
Проект никому не принадлежит как продукт: код под GPLv2, торговая марка Linux — у Торвальдса, а сам он и ключевые мейнтейнеры (например, Грег Кроа-Хартман, отвечающий за stable-ветки) работают в некоммерческом фонде Linux Foundation, основанном в 2007 году. Талисман — пингвин Tux, нарисованный Ларри Юингом в 1996 году.
Что это такое
Слово «ядро» (kernel) — это не метафора красоты, а точное описание места в архитектуре. Операционная система устроена слоями, и ядро — самый нижний программный слой, единственный, которому разрешено напрямую командовать железом.
Всё остальное — браузер, терминал, nginx, твой Python-скрипт — живёт в «пользовательском пространстве» (user space) и физически не может само записать байты на диск или отправить пакет в сеть. Вместо этого программа вежливо просит ядро через системный вызов (syscall — формализованный запрос «открой файл», «дай памяти», «отправь данные»). Ядро проверяет права, выполняет работу с железом и возвращает результат. Это разделение — фундамент стабильности и безопасности: упавший браузер не роняет систему, потому что он никогда и не трогал железо сам.
Важно развести три понятия, которые в быту сливаются в одно слово «линукс»:
- Ядро Linux — только ядро. То, что показывает команда
uname -r, например6.8.0-136-generic. - Дистрибутив (Ubuntu, Debian, Fedora, Alpine) — ядро плюс тысячи пользовательских программ, установщик, менеджер пакетов и настройки по умолчанию. Разница между дистрибутивами — почти целиком в обвязке, ядро у всех одно и то же, разве что разных версий и с разными патчами.
- ОС на базе Linux (Android, ChromeOS, прошивка твоего роутера) — ядро Linux внутри, а поверх — совсем другой пользовательский мир. Android-приложение и команда
lsна сервере в итоге разговаривают с одним и тем же ядром.
Архитектурно Linux — монолитное ядро с загружаемыми модулями: драйверы и подсистемы работают внутри одного большого ядра (это быстро), но многие куски можно подгружать и выгружать на лету как модули (это гибко). Противоположный подход — микроядро (QNX, seL4, Minix), где драйверы вынесены в отдельные процессы: надёжнее в теории, медленнее и сложнее на практике. Windows (ядро NT) и macOS (ядро XNU) — гибриды между этими крайностями.
Аналогии из жизни
Двигатель автомобиля. Ты «пользуешься машиной», но с двигателем напрямую не взаимодействуешь никогда: есть педали, руль и коробка — интерфейсы. Ядро — двигатель и трансмиссия, приложения — водитель, системные вызовы — педали. Обновить ядро без перезагрузки — как перебрать двигатель на ходу.
Где ломается: у машины один водитель, а ядро обслуживает сотни программ одновременно и постоянно делит между ними ресурсы. Ядро не «тянет» одну задачу, а жонглирует тысячами — двигатель так не умеет.
Кухня ресторана. Гости (программы) не заходят на кухню и не жарят сами — они делают заказ через официанта (системный вызов), кухня (ядро) распределяет плиты и поваров (процессор, память) и выдаёт блюда. Санитарная зона «только для персонала» — это kernel space: гостям туда нельзя, и это защищает всех.
Где ломается: в ресторане официант может отказать хаму, но кухня не рухнет, если гость всё же прорвётся. В ОС прорыв программы в kernel space — это полная компрометация: злоумышленник на кухне становится шеф-поваром. Именно поэтому уязвимости ядра — самые страшные.
Диспетчерская аэропорта. Самолёты (процессы) не решают сами, кто садится на полосу: диспетчер (планировщик ядра) выдаёт слоты, разруливает очереди и приоритеты — санитарный борт (высокоприоритетный процесс) сядет раньше чартера. Полос мало, желающих много — это и есть разделение времени процессора.
Где ломается: диспетчер только командует, а физическую работу делают пилоты. Ядро же само и «диспетчер», и «пилот»: оно не просто разрешает доступ к диску, а само двигает данные через драйвер. Аналогия занижает объём работы ядра.
Как это работает
Проще всего увидеть ядро в деле на двух сюжетах: загрузка машины и обычный системный вызов.
Сюжет 1: от кнопки питания до приглашения в терминале.
[кнопка питания]
|
BIOS/UEFI — прошивка материнской платы находит диск
|
GRUB (загрузчик) — меню в /boot: какую версию ядра грузить
|
Ядро + initramfs — ядро распаковывается в память; initramfs
| (мини-файловая система) даёт драйверы,
| чтобы смонтировать настоящий диск
|
systemd (PID 1) — первый пользовательский процесс; поднимает
| сеть, логи, nginx, базы — все сервисы
|
login / SSH — система готова
Отсюда понятны две вещи, которые постоянно всплывают в админской практике. Первая: на диске может лежать несколько ядер одновременно (в /boot), а работает одно — то, что выбрал загрузчик. Вторая: обновление ядра не действует до перезагрузки. Пакетный менеджер кладёт новое ядро рядом со старым, ставит флаг «требуется reboot», но подменить работающее ядро на лету штатно нельзя — оно держит на себе вообще всё. Поэтому «установили патч, нужен ребут» — это не лень админов, а архитектура.
Сюжет 2: программа читает файл.
- Python-скрипт вызывает
open("data.txt")— библиотечная функция превращает это в системный вызов. - Процессор переключается из пользовательского режима в режим ядра (это аппаратный механизм, не соглашение).
- Ядро проверяет права доступа: можно ли этому пользователю читать этот файл.
- Подсистема VFS (виртуальная файловая система — единый интерфейс поверх ext4, XFS, NTFS и прочих) находит нужный драйвер.
- Драйвер диска читает блоки, ядро кладёт данные в память процесса и возвращает управление.
- Скрипт продолжает работу, даже не узнав, сколько слоёв отработало под ним.
Внутри ядра за это отвечают крупные подсистемы: планировщик (кому из процессов дать процессор и на сколько миллисекунд), менеджер памяти (виртуальная память, своп, кэши), VFS, сетевой стек (TCP/IP живёт именно в ядре), подсистема безопасности (права, namespaces, SELinux/AppArmor) и драйверы. Драйверы — это, по разным оценкам, большая часть из примерно 30 миллионов строк кода ядра: поддержка тысяч моделей железа.
Почему уязвимости ядра — отдельная лига
Обычная дырявая программа отдаёт злоумышленнику свои права. Дыра в ядре отдаёт всё: ядро стоит выше любых проверок, потому что сами проверки — это оно. Типовой сценарий атаки: взломали сайт → получили слабого пользователя → через уязвимость ядра поднялись до root. Поэтому kernel-CVE патчат срочно, а хостеры рассылают тревожные письма.
Где встречается в обычной жизни
- Смартфон на Android. Внутри каждого — ядро Linux. Когда телефон «умно» ограничивает фоновые приложения ради батареи — это работают механизмы ядра (cgroups, планировщик).
- Домашний роутер. Почти любой Wi-Fi-роутер — маленький Linux: веб-морда настроек ходит к тому же ядру, что и на серверах. Обновление прошивки роутера — часто просто новое ядро с драйверами.
- Телевизор и приставка. Smart TV на Android TV или webOS — снова ядро Linux, которое декодирует видео и гоняет пульт по Bluetooth.
- Автомобиль. Мультимедийные системы многих марок работают на Linux (в отрасли есть целый проект Automotive Grade Linux). Карта, музыка, камеры парковки — поверх того же ядра.
- Банкомат и касса. Значительная часть банкоматов, платёжных терминалов и касс самообслуживания — Linux внутри. Когда экран банкомата вдруг показывает загрузочные строки — ты видишь то самое «Сюжет 1» из раздела выше.
Где встречается в IT и бизнесе
- Серверы и облака. Подавляющее большинство серверов в интернете и практически все виртуалки в облаках (AWS, Google Cloud, Yandex Cloud) — Linux. Аренда VPS — это аренда куска железа, на котором твоим приложениям прислуживает ядро Linux.
- Контейнеры. Docker и Kubernetes — это не «мини-виртуалки», а красивое использование двух механизмов ядра: namespaces (изоляция: процесс видит только свой мир) и cgroups (лимиты: не больше стольких-то CPU и памяти). Контейнеры на одной машине делят одно ядро — отсюда и скорость, и ограничения.
- Обновления безопасности. Ядро — главный объект патч-менеджмента. Нужно, когда: у тебя есть хоть один сервер. Процесс: уведомление о CVE → пакет с новым ядром → перезагрузка в согласованное окно → проверка
uname -r. - Суперкомпьютеры и ML. Все 500 машин мирового рейтинга Top500 работают на Linux (стопроцентно — с ноября 2017 года). Обучение нейросетей на GPU-кластерах — это тоже драйверы и планировщик Linux.
- Встраиваемые системы. Умные камеры, платёжные киоски, промышленные контроллеры: нужно, когда железо слабое, а функциональность — взрослая.
Номер версии ядра не гарантирует наличие патча
Дистрибутивы бэкпортируют (переносят в свои старые версии) фиксы безопасности, не меняя основную цифру: ядро 6.8.0-136 в Ubuntu может содержать заплатки из гораздо более новых ядер, а может ещё не содержать самую свежую. Проверять надо не «какая у меня версия», а бюллетени безопасности дистрибутива (у Ubuntu — USN, Ubuntu Security Notices) и статус конкретного CVE в трекере.
Кто пользуется
- Google — Android (порядка трёх миллиардов активных устройств — крупнейшее развёртывание ядра в мире), ChromeOS, вся серверная инфраструктура поиска и YouTube.
- Облачные гиганты — Amazon, Microsoft (да, значительная доля виртуалок в Azure — Linux), Google Cloud. Сами гипервизоры и хост-машины — тоже в основном Linux/KVM.
- Meta, Netflix, X и почти любой крупный веб — серверные парки на Linux; Netflix, впрочем, часть отдачи видео исторически гонял через FreeBSD — редкое исключение, подтверждающее правило.
- Суперкомпьютеры — 500 из 500 в Top500.
- Биржи и банки — низколатентный трейдинг живёт на тюнингованном Linux (специальные настройки планировщика и сети).
- SpaceX — по публичным интервью инженеров, полётное ПО Falcon и Dragon работает на Linux.
Ядро при этом разрабатывают не энтузиасты по вечерам: основные контрибьюторы последних лет — инженеры Intel, Google, Red Hat, AMD, Meta, Oracle, Huawei и других компаний, которым нужна поддержка их железа и их нагрузок.
Альтернативы и конкуренты
- Windows (ядро NT).
Плюсы: экосистема корпоративного и десктопного софта, Active Directory, привычность для бизнеса.
Минусы: закрытый код, лицензии стоят денег, в серверном вебе и облаках — меньшинство. - macOS (ядро XNU/Darwin).
Плюсы: вылизанная интеграция с железом Apple, Unix-совместимость для разработчиков.
Минусы: только на технике Apple, для серверов практически не используется. - FreeBSD и семейство BSD.
Плюсы: цельная система «ядро+обвязка» из одних рук, лицензия BSD (можно брать в закрытые продукты — так родились PlayStation OS и частично macOS), отличный сетевой стек.
Минусы: меньше драйверов, меньше сообщество, меньше готовых решений. - RTOS и микроядра (QNX, FreeRTOS, Zephyr, seL4).
Плюсы: гарантированное время реакции (жёсткий реалтайм), крошечные требования к памяти, формальная верификация у seL4.
Минусы: это не универсальные ОС — ни контейнеров, ни привычного софта; каждая под свою нишу.
Отдельной строкой — Fuchsia от Google с микроядром Zircon: многолетний эксперимент по замене Linux в устройствах Google, пока живёт в умных дисплеях Nest, о захвате мира речи не идёт.
Когда НЕ стоит использовать
- Микроконтроллеры с килобайтами памяти. Ядру Linux нужны мегабайты ОЗУ и «взрослый» процессор. Датчик температуры на ESP32 или Arduino — это FreeRTOS/Zephyr или вообще прошивка без ОС, потому что Linux туда физически не влезает.
- Жёсткий реалтайм с ценой ошибки в жизнях. Тормозная система, кардиостимулятор, авионика — там нужны гарантии реакции за микросекунды и сертификация; берут QNX, VxWorks, seL4. У Linux есть реалтайм-режим PREEMPT_RT (его доводили в основную ветку много лет), но для сертифицируемых систем безопасности он обычно не аргумент.
- Когда весь твой софт живёт в мире Windows. Если бизнес-процессы завязаны на 1С в связке с Windows-серверами, AD и специфический отраслевой софт без Linux-версий — тащить Linux ради идеологии не стоит: платить будешь интеграцией и кадрами.
Связанные понятия
- Системный вызов (syscall) — формальный запрос программы к ядру: «открой», «прочитай», «создай процесс».
- Драйвер — код внутри ядра, переводящий общие команды («запиши блок») на язык конкретной железки.
- Дистрибутив — ядро + пакетный менеджер + пользовательские программы = готовая к установке система.
- LTS (Long Term Support) — версии ядра/дистрибутива с многолетней поддержкой патчами; выбор для серверов.
- CVE — всемирный реестр уязвимостей с номерами вида CVE-2026-XXXXX; язык, на котором говорят о дырах, в том числе в ядре.
- cgroups и namespaces — механизмы ядра для лимитов и изоляции; фундамент Docker и Kubernetes.
- Livepatch — технология накатки некоторых патчей безопасности на работающее ядро без перезагрузки (kpatch у Red Hat, Canonical Livepatch у Ubuntu); закрывает не всё, но откладывает ребут.
Литература и источники
- Linus Torvalds, David Diamond — «Just for Fun» (2001, есть русское издание «Ради удовольствия») — автобиография Торвальдса, история рождения ядра из первых рук.
- Robert Love — «Linux Kernel Development» (3-е издание, 2010, en; выходил русский перевод «Разработка ядра Linux») — классическое введение в устройство ядра для разработчиков.
- Официальная документация ядра — https://docs.kernel.org
- Сайт проекта и исходники — https://www.kernel.org
- Wikipedia: статья «Ядро Linux» (ru) / «Linux kernel» (en) — хороша именно историческая часть с датами и версиями.
- LWN.net — главное издание о разработке ядра; искать «LWN kernel index». Ежегодные отчёты Linux Foundation о контрибьюторах — искать «Linux Kernel Development Report».
Где встретилось у меня
Вчера хостер прислал тревожное письмо о критических уязвимостях ядра Linux с громкими именами — пришлось сначала проверять, не фишинг ли это (CVE оказались настоящими, письмо легитимным), а затем готовить VPS к перезагрузке: чистить забитый диск, убеждаться, что патченное ядро установлено и загрузчик его подхватит, ребутать и проверять, что все сервисы поднялись уже на новом ядре. Один день — и практически весь жизненный цикл ядра на сервере: уязвимость, патч, ребут, верификация.
Краткое резюме
- Ядро — единственный слой ОС с прямым доступом к железу; все программы просят у него ресурсы через системные вызовы. «Linux» в Ubuntu, Android и роутере — одно и то же ядро.
- Началось в 1991 году как «хобби» студента Линуса Торвальдса; сегодня это ~30 млн строк кода, релиз каждые 9–10 недель и тысячи корпоративных разработчиков под крылом Linux Foundation.
- Обновление ядра требует перезагрузки: новое ядро кладётся рядом со старым и активируется только при загрузке. Флаг «reboot required» — это про него.
- Уязвимости ядра — самые опасные: дыра в ядре отдаёт атакующему всю машину, поэтому kernel-CVE патчат в приоритете.
- Номер версии не говорит о защищённости: дистрибутивы бэкпортируют фиксы. Проверяй бюллетени безопасности своего дистрибутива, а не цифры в
uname -r. - Контейнеры (Docker/Kubernetes) — это возможности ядра (namespaces + cgroups), а не отдельная магия; все контейнеры машины делят одно ядро.