Как устроен Linux: ядро, дистрибутив, загрузка и основные понятия
Автор: Казачкин Даниил Михайлович · Обновлено
Linux управляет процессами, памятью, устройствами и доступом к данным. В разговоре этим словом часто называют всю систему: ядро вместе с библиотеками, оболочкой, службами,…
Linux управляет процессами, памятью, устройствами и доступом к данным. В строгом смысле Linux — ядро. В разговоре этим словом часто называют всю систему: ядро вместе с библиотеками, оболочкой, службами, пакетами и, возможно, графическим рабочим столом. Разделение помогает правильно искать причину ошибки: неработающая команда, приложение и неисправное ядро требуют разных проверок.
Ядро, дистрибутив и пользовательские программы
Ubuntu — дистрибутив: согласованный набор компонентов, репозитории, установщик и правила обновления. Debian, Fedora, Astra Linux и ALT решают сходную задачу, но версии пакетов, политика безопасности и инструменты настройки различаются. Команды Bash обычно переносимы между ними; инструкция для пакетного менеджера — уже не обязательно.
Ядро работает с повышенными привилегиями в kernel space. Приложения выполняются в user space и обращаются к ядру через системные вызовы: открыть файл, выделить память, создать процесс, передать сетевые данные. Ошибка приложения не даёт ему права непосредственно перезаписать память другого процесса. Системные вызовы проверяют права и параметры; режим root не устраняет эту архитектурную границу.
Программа — исполняемый файл, процесс — конкретный запуск с PID, памятью и открытыми файлами. У процесса могут быть несколько потоков исполнения. Планировщик выбирает готовые задачи для CPU; детали потоков и приоритетов разобраны в [уроке о scheduler](/lessons/without-university/linux-developer-foundations/linux-developer-26).
Терминал, shell и выполнение команды
Терминал обеспечивает ввод и отображение. Shell, например Bash, читает командную строку, раскрывает переменные и шаблоны, организует перенаправления и запускает программы. TTY — интерфейс терминального устройства; псевдотерминал используется в окне терминала и SSH-сеансе. Графическое окно можно заменить другим, сохранив ту же оболочку.
type -a printf
printf '%s\n' 'hello linux'
printf 'shell PID=%s\n' "$$"
ps -p "$$" -o pid,ppid,commПервая команда обычно находит встроенный printf Bash, а иногда также внешний исполняемый файл. printf — имя команды, '%s\n' — формат, 'hello linux' — один аргумент благодаря кавычкам. Результат — одна строка hello linux. При поиске внешней команды shell использует PATH. После выполнения остаются stdout, stderr и код завершения: ноль означает успех по контракту программы. Shell хранит последний статус в $?.
Как загружается система
Типичный путь начинается с UEFI или старого BIOS. Прошивка выбирает загрузочную запись; загрузчик, например GRUB, загружает ядро и начальную среду initramfs. Ядро и initramfs находят корневую файловую систему. Затем запускается PID 1, часто systemd, который поднимает службы и сеансы. Возможны варианты, включая прямую загрузку ядра через UEFI: GRUB присутствует не во всех установках.
uname -r
ps -p 1 -o comm=
findmnt -n -o SOURCE,FSTYPE,TARGET /
lsblk -o NAME,TYPE,FSTYPE,MOUNTPOINTSИмена устройств будут вашими. findmnt / показывает источник текущего корня, а lsblk помогает сопоставить разделы, /boot и EFI System Partition. В системе с UEFI bootctl status или efibootmgr -v, если доступны и разрешены, показывают дополнительные сведения о загрузке. Корневой том и устройство, с которого прошивка прочитала загрузчик, могут различаться. В контейнере PID 1 и корневой mount описывают контейнерное окружение, а не полный путь запуска хоста.
Чтобы запустить Live Linux с флешки, используют меню загрузки прошивки и выбирают USB с подготовленным образом нужной архитектуры. Такой запуск сам по себе не восстанавливает установленную систему. Сначала определяют её разделы; операции восстановления относятся к отдельному уроку.
Дерево файлов и короткий словарь
Все доступные файлы образуют дерево от /. Точка монтирования подключает другую файловую систему к этому дереву. Inode хранит метаданные объекта в пределах файловой системы, а имя в каталоге ссылается на объект. Тип объекта — обычный файл, каталог, ссылка, устройство, FIFO или сокет — отличается от формата содержимого вроде PNG или JSON. Практика ссылок находится в [уроке о файлах](/lessons/without-university/linux-developer-foundations/linux-developer-31), карта каталогов — в [уроке о навигации](/lessons/without-university/linux-developer-foundations/linux-developer-30).
| Термин | Что обозначает |
|---|---|
| daemon, служба | Программа, обслуживающая запросы или фоновые обязанности; часто управляется менеджером служб |
| PID и PPID | Идентификаторы процесса и его родителя в наблюдаемом пространстве процессов |
| exit code | Числовой результат завершения команды; смысл ненулевых значений зависит от программы |
| swap | Место для вытесненных страниц памяти; оно не равнозначно быстрой RAM |
| namespace и cgroup | Ограничение видимости объектов и групповой учёт/контроль ресурсов соответственно |
| LVM и RAID | Управление логическими томами и объединение дисков; оба механизма не заменяют backup |
| MAC | Дополнительная политика доступа, например SELinux или AppArmor, поверх обычных файловых прав |
| PSI и eBPF | Показатели ожидания ресурсов и механизм выполнения проверяемых программ в ядре |
| chroot | Изменение видимого корня путей процесса; само по себе не полноценная изоляция контейнера |
Практика и проверка понимания
Запишите три факта о своей учебной системе: версия ядра, команда PID 1 и тип корневой файловой системы. Для каждого укажите команду-источник. Затем объясните путь printf 'hello\n': кто разбирает кавычки, куда уходят байты и когда появляется статус. Правильный ответ разделяет shell, процесс и ядро и не объявляет версию ядра названием дистрибутива.
Если uname показывает одно, а приветствие Ubuntu другое, противоречия нет: это разные компоненты. Если в минимальном образе отсутствует systemctl, сначала проверьте PID 1. Установка утилиты не превращает контейнер в систему, загруженную systemd.