Этот текст открывает рубрику «Linux под капотом». Моя цель простая. Показать, что происходит в Linux на самом деле и почему оно устроено именно так. Если ты админишь серверы, ковыряешь Docker или просто хочешь понимать систему глубже, это будет полезно.
Про Linux часто рассказывают как сказку: «один студент написал ОС, и она захватила мир». Сказка удобная, но в ней теряется самое полезное для практики: почему система устроена именно так, где у неё швы и какие решения тянутся с начала 90-х до сегодняшних контейнеров и продакшн-VPS.
Ещё одна путаница: Linux в бытовом смысле называют операционкой. Технически Linux это ядро. Вокруг него пользовательские утилиты, библиотеки, компиляторы, init-система, менеджер пакетов, графика и так далее. Если это держать в голове, многие странные баги становятся логичными: ломается не Linux вообще, а конкретная связка ядро плюс userland плюс init плюс настройки.
И третья причина знать историю: по ней видно, что Linux взлетел не потому, что был идеальным, а потому что оказался вовремя. Дешёвое PC-железо, уже готовые инструменты GNU, сеть людей через FTP и Usenet и правильная для роста лицензия.
Контекст и зачем это знать
История Linux полезна не ради ностальгии. Она объясняет, почему у системы такой скелет: почему ядро отдельно, почему вокруг него сборки-дистрибутивы, почему контейнеры это не мини-виртуалки, а другой класс изоляции.
Когда ты понимаешь, где заканчивается ядро и начинается пользовательское пространство, становится проще отлаживать проблемы: зависания на загрузке, сетевые чудеса, странности с правами, лимитами и процессами.
А ещё история отличный фильтр от мифов. Linux не внезапно победил, его собрали из кусочков, которые уже существовали: идеи Unix, инструменты GNU, учебный MINIX и ядро, которое стало совместимым с экосистемой свободного софта.
Как это устроено
До Linux был Unix-мир: идеи многозадачности, всё файл, права доступа, процессы и сигналы. К началу 80-х Unix был в университетах и индустрии, но свободным его не назовёшь: лицензирование и исходники были отдельной болью.
В 1983 Ричард Столлман объявляет проект GNU: цель собрать свободную Unix-подобную систему. Компилятор, утилиты, библиотеки, всё, что нужно для нормальной жизни.
Параллельно в учебном мире появляется MINIX: небольшой Unix-клон для изучения устройства ОС. MINIX вышел в 1987 и стал популярным в университетских курсах.
Линус Торвальдс в 1991 ковыряет MINIX и пишет в comp.os.minix про свои эксперименты: делает бесплатное ядро для 386/486, просит фидбек и честно говорит, что это пока хобби. Важно: он позиционировал проект как ядро, а не как готовую систему.
17 сентября 1991 Linux 0.01 выкладывают на FTP-сервер nic.funet.fi (CSC/FUNET). Это не релиз для пользователей: там были в основном исходники и очень ранняя сборка.
5 октября 1991 появляется публичное объявление про Linux 0.02. Это момент, когда проект начинает обсуждаться шире и к нему подключается больше людей.
Самое недооценённое событие ранней истории лицензия. Изначально условия распространения были неудачными для роста, а затем Linux быстро переехал на GPL-совместимую модель. Это сделало возможными дистрибутивы, поставки, сопровождение и нормальную экосистему вокруг ядра.
GPLv2 опубликована в июне 1991. То есть юридический инструмент роста уже существовал, и Linux довольно быстро на него лег. Плюс у GNU уже были GCC, shell, coreutils и куча базовых программ, фактически готовый userland. Linux-ядро, став GPL-совместимым, стыкуется с этим набором, и из ядра студента получается база для системы, которую можно собирать, распространять и развивать.
Как посмотреть это на живой системе
Задача: увидеть границу «ядро vs окружение» и понять, где искать правду, когда что-то ломается. Ниже пять быстрых проверок. Каждая занимает секунды, но вместе они дают нормальную картину.
Версия ядра и архитектура. Это первое, с чего стоит начинать, когда проблема похожа на ядро.
uname -a
Чем ядро собрано и кем подписано. Здесь видно строку сборки и компилятор, а иногда и подсказки про окружение сборки.
cat /proc/version
Ранние сообщения ядра. Часто именно тут всплывают драйверы, параметры загрузки, диски, сетевые карты и первые ошибки.
dmesg | head
Какая userland-сборка. Это уже не ядро, а дистрибутив и его окружение. Полезно, когда сломалось после обновления, но неясно чего именно.
cat /etc/os-release
Кто у тебя PID 1, то есть какая init-система реально стартует систему. От этого зависит половина поведения сервиса и логов.
ps -p 1 -o comm=
Полезный щёлк по практике: зайди в контейнер и посмотри версию ядра. В контейнере она будет такой же, как на хосте. Это нормально. Контейнер изолирует процессы и окружение, но ядро делит с хостом.
uname -r
Если хочется убедиться на пальцах, сравни вывод этой команды внутри контейнера и на хосте. Он совпадёт. И это как раз то, почему контейнеры живут быстро и легко, но не заменяют виртуализацию.
Типовые проблемы и симптомы
После обновления Linux всё сломалось. Часто обновилось не ядро, а userland или init. Если версия ядра прежняя, а релиз дистрибутива изменился, ищи в пакетах, сервисах и конфигах.
В контейнере же своя ОС. Симптом попытки чинить iptables или nftables, модули ядра или cgroups внутри контейнера. Ключевые вещи решаются на хосте или через настройки runtime, потому что ядро общее.
Легенды про лицензии мешают инженерии. Когда модель стала совместимой с GPL-экосистемой, вокруг ядра стало возможно строить дистрибутивы и сопровождение без постоянного юридического дребезга. Это не романтика, это инфраструктура роста.
Мини-лабораторка
Цель: потрогать Linux 0.01 и увидеть, почему это было ядро для 386, а не универсальная ОС.
Скачай архив Linux 0.01 с kernel.org и проверь, что файл приехал без сюрпризов.
wget https://www.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz ls -lh linux-0.01.tar.gz
Распакуй архив в текущую папку.
tar -xzf linux-0.01.tar.gz ls -la
Пробеги глазами по структуре проекта. Это быстрый способ понять, что перед тобой очень раннее ядро, без всего на свете.
find linux -maxdepth 2 -type d | head -n 50
Найди в Makefile следы ориентации на i386. Это прямой маркер эпохи 386/486.
grep -nE "386|i386" linux/Makefile
Оцени масштаб исходников. Это не научный показатель, но хорошо передаёт ощущение размера проекта.
find linux -type f \( -name "*.c" -o -name "*.h" \) | wc -l
Сравни с текущей системой. Просто чтобы почувствовать разницу сложности мира и того, сколько всего сообщает современное ядро на старте.
uname -r dmesg | head -n 60
Источники и куда копать дальше
Linus Torvalds: архив постов comp.os.minix (LINUX’s History)
kernel.org: Release Notes Linux 0.12 (про условия распространения)
linux.com: публикация объявления про Linux 0.02 (исторический репост)
Что попробовать руками
Если времени мало, вот короткий набор проверок, который почти всегда даёт быструю диагностику: какая система, какое ядро, кто PID 1, что ядро сказало на старте, и есть ли проблемы в логах текущей загрузки.
Проверь базовую информацию о системе и ядре.
cat /etc/os-release uname -a
Убедись, какая init-система у тебя реально работает.
ps -p 1 -o comm= systemctl --version
Посмотри, что ядро сообщило на старте, и есть ли там явные ошибки.
dmesg | head -n 120 dmesg -T | egrep -i "error|fail|warn" | head -n 80
Проверь предупреждения и ошибки в логах текущей загрузки.
journalctl -b -p warning..alert --no-pager | head -n 120