Your AI powered learning assistant

ВСЕ ЧТО НУЖНО ЗНАТЬ ПРО LINUX

Linux - это ядро, а не операционная система Linux — это всего лишь ядро (уровень кода, который управляет аппаратным обеспечением), в то время как все, что вы видите и используете, — это программное обеспечение, работающее над ним. Отношение к Ubuntu, CentOS или Debian как к “Linux” стирает эту важную границу. Понимание системы означает отслеживание того, как стек поднимается от холодного кремния к программам в пользовательском пространстве.

От включения питания до загрузки загрузчика Нажатие кнопки power приводит в действие ничего не понимающий процессор, который получает свою первую команду по фиксированному адресу. Прошивка (BIOS/UEFI) запускает POST, инициализирует процессор, память и устройства и выполняет поиск загрузочного устройства. Поскольку прошивка не может считывать файловые системы, она загружает загрузочную запись MBR или EFI, передавая управление загрузчику (обычно GRUB2), который может считывать файловые системы и искать в /boot критически важные полезные данные.

Initramfs Решает проблему загрузки драйвера GRUB загружает два основных файла: сжатый образ ядра (vmlinuz) и initramfs. Ядро берет управление на себя, но не может смонтировать реальный root-сервер без драйверов, которые находятся на этом самом диске, поэтому оно монтирует initramfs как временный root-сервер, загружает необходимые драйверы (RAID, NVMe, LVM), находит реальный root-сервер и выполняет pivot_root. Зависание загрузки с ошибками здесь обычно означает, что initramfs отсутствует или на диске отсутствует нужный драйвер.

Монолитное ядро Ring‑0: скорость с риском После запуска в ring 0 монолитное ядро объединяет драйверы, TCP/IP и файловые системы в одном адресном пространстве, что обеспечивает минимальную нагрузку и максимальную пропускную способность. Компромиссом является хрупкость: неисправный драйвер может привести к сбою всей системы. Его основные обязанности включают управление памятью, распределение процессорного времени и аппаратную абстракцию.

Виртуальная память, обмен данными и убийца OOM Ядро “обманывает” процессы, предоставляя каждому из них чистое непрерывное виртуальное адресное пространство, в то же время отображая страницы во фрагментированную физическую оперативную память с помощью таблиц страниц. Это обеспечивает изоляцию между процессами и позволяет заменять части памяти на диск при нехватке оперативной памяти. Если и оперативная память, и подкачка исчерпаны, OOM‑убийца выбирает крупные жертвы с низким приоритетом и завершает их работу — то, что вы часто увидите в Kubernetes, когда ограничения неправильно настроены.

Опережающее планирование и ловушка средней нагрузки При гораздо большем количестве выполняемых процессов, чем ядер, параллелизм - это иллюзия, созданная за счет преимущественной многозадачности. Каждому процессу отводится небольшой промежуток времени, затем ядро выполняет переключение контекста, сохраняя и восстанавливая состояние процессора тысячи раз в секунду. Высокая средняя нагрузка при умеренной загрузке процессора часто свидетельствует о потере времени на переключение контекста, а не о реальной работе.

Системные вызовы: Единственная дверь в стене Пользовательский код не может касаться аппаратного обеспечения; центральный процессор устанавливает барьер, который могут преодолевать только системные вызовы. Функция print в Python передается через glibc в системный вызов write, помещая аргументы в регистры и запуская ловушку для вызова 0, где ядро проверяет разрешения и выполняет ввод-вывод перед возвратом. Основные системные вызовы — fork, exec, open, close, read, write, socket, connect — лежат в основе всего, и strace предоставляет их, чтобы показать, что процесс пытается выполнить, получает или зависает.

PID 1 и systemd: Параллельный запуск на основе зависимостей Чтобы оживить пользовательское пространство, ядро запускает /sbin/init как PID 1; если он отключается, ядро паникует. Современные системы используют systemd, который строит график зависимостей для параллельного запуска служб, максимально увеличивая загрузку процессора во время загрузки. Он монтирует файловые системы, выбирает цель, затем запускает такие модули, как sshd или демон Docker; systemctl общается с ним через сокет, а systemd запускает службы через fork, за которым следует exec, делая их своими дочерними.

Одно унифицированное дерево: VFS и монтируемые файлы Linux представляет собой единое дерево каталогов с корнем в /, независимо от того, сколько у вас устройств. Уровень VFS абстрагирует хранилище, позволяя подключать SSD в /boot, общий сетевой ресурс в другом месте или оперативную память в качестве файловой системы, и все это отображается как обычные пути. Программы просто читают и записывают файлы; VFS прозрачно направляет байты на контроллер диска или по сети.

Индексные коды, имена и ‘Все, что есть в файле’ Для ядра файл - это индексный индекс: номер, содержащий владельца, разрешения, временные метки и указатели на блоки данных; имена хранятся в каталогах, которые сопоставляют имена с номерами индексных индексов. Когда вы открываете путь, ядро обходит записи каталога, чтобы найти индексный индекс, проверяет биты доступа и затем считывает блоки, на которые даны ссылки. Расширяя абстракцию, /proc и /sys предоставляют данные ядра в виде псевдофайлов с нулевым байтом, которые материализуются при чтении и могут быть записаны для изменения переменных ядра, например, для включения переадресации пакетов.

StdIO, перенаправление и каналы: создание небольших инструментов Каждый процесс начинается с трех открытых файловых дескрипторов: stdin (0), stdout (1) и stderr (2), обычно привязанных к клавиатуре и экрану. Разделение stdout и stderr позволяет перенаправлять полезные выходные данные, отбрасывая ошибки в /dev/null. Конвейер заменяет стандартный вывод одного процесса буфером ядра, который передает стандартный ввод другому процессу, сохраняя их в неведении друг о друге и обеспечивая длинные, мощные конвейеры с текстовым управлением ‑ суть философии Unix.

Разрешения, Root-права, пакеты и объектив инженера Имена пользователей и группы сопоставляются с числовыми идентификаторами UID и GID из /etc/passwd и /etc/group, и каждый индекс содержит биты владельца, группы и другие биты — чтение (4), запись (2), выполнение (1) — при этом выполнение в каталогах означает “может входить”. Root (UID 0) обходит проверки, в то время как sudo использует SUID для предоставления временного, проверенного прав доступа. Программное обеспечение поступает из централизованных хранилищ; менеджеры пакетов, такие как apt, yum или pacman, устанавливают его в стандартные хранилища (FHS) и разрешают динамические библиотечные зависимости, чтобы двоичные файлы могли совместно использовать одну копию в памяти. Большинство программ Linux динамически подключаются, что экономит оперативную память, но требует совместимых версий библиотек. С помощью этой мысленной модели “отказано в разрешении”, подозрительные средние значения загрузки и даже Docker преобразуются в четкие результаты проверок разрешений, очередей планировщика и примитивов ядра, таких как пространства имен и cgroups.