Пара 2: Загрузка ОС: firmware, ядро, драйверы и Live-среды

90 минут · 3 курс, ML.

Содержание и результат

Связать команды терминала с устройством ОС и найти файлы учебного проекта.

План занятия

0–8: история «включили ноутбук». 8–26: загрузка Ubuntu и поиск стадии отказа. 26–40: граница ядра и POSIX. 40–50: различия Windows, WSL2 и macOS. 50–65: дерево файлов и наблюдения в терминале. 65–80: практика с путями и сбор паспорта загрузки. 80–90: ответы по схемам. Подробности Secure Boot и ранних служб оставьте в конспекте для самостоятельного чтения.

Практика выполняется в своей учебной папке и на localhost. Подготовка окружения описана в lab/README.md.

Ядро и пользовательские программы

Shell передаёт задачи программам; ядро управляет ресурсами.

Операционная система — диспетчер CPU, памяти, устройств и процессов. Shell читает команду, разбирает аргументы и запускает программу. ls — отдельная программа, cd обычно встроен в shell, потому что меняет его текущую папку. Ядро предоставляет системные вызовы, через которые программа читает файл или создаёт процесс. Не нужно запоминать внутренние функции ядра: важно перестать считать терминал самой ОС. Один shell может запустить много процессов.

Аналогия: окно заказа, диспетчер и работники склада выполняют разные роли.

Единое дерево каталогов

Путь / начинается от корня Linux, а ~ — от дома пользователя.

В Linux файлы доступны через единое дерево. /home содержит домашние каталоги, /etc — настройки системы, /var — изменяемые данные и журналы, /tmp — временные файлы, /usr — многие программы и библиотеки. Эти роли помогают искать, но не гарантируют расположение любого приложения. Абсолютный путь начинается с /; относительный вычисляется от текущей папки. Точка означает текущий каталог, две точки — родительский. Регистр значим: Model.csv и model.csv могут быть разными файлами. Папка — тоже объект с владельцем и правами. Не меняем системные каталоги ради учебного эксперимента.

Аналогия: полный адрес здания и указание «через соседнюю дверь» — абсолютный и относительный путь.

Файл, ссылка и устройство

Имя файла не равно его содержимому.

Владелец проекта часто путает удаление имени, перемещение файла и уничтожение всех копий. Символическая ссылка хранит путь к другому объекту и может стать «битой». Расширение файла — соглашение, а не гарантия формата. Команда file смотрит признаки содержимого, stat показывает метаданные. /dev содержит интерфейсы устройств, /proc — представление данных о работающем ядре и процессах; это не обычные архивы на диске. Сейчас достаточно понимать роль, без чтения всей /proc.

Аналогия: ссылка — записка с адресом; переезд адресата может сделать её бесполезной.

Windows, Linux и macOS: три разных ядра

Похожие команды не означают одинаковое устройство ОС.

Windows строится на NT, Ubuntu использует Linux, macOS — Darwin с XNU. Во всех есть процессы, память, файловая система и сеть, но системные API, драйверы и службы отличаются. Shell — пользовательская программа: PowerShell, Bash и zsh не являются ядрами. macOS сочетает Mach и BSD-компоненты, поэтому привычные Unix-команды похожи на Linux, но GNU/BSD-флаги и системные механизмы различаются. WSL2 запускает Linux-ядро в управляемой виртуальной среде Windows. Docker Desktop на Mac тоже использует Linux-VM: Linux-контейнер не работает непосредственно на XNU. Эти различия объясняют, почему Git и Python часто переносимы, а systemd и apt — нет.

Аналогия: три здания имеют комнаты и двери, но инженерные коммуникации и ключи разные.

Подробный разбор: От кнопки питания до программы: загрузка, ядро и POSIX; Firmware, драйверы и ремонтная Live-среда

BIOS и UEFI начинают загрузку по-разному

Legacy BIOS читает bootstrap-код, UEFI запускает EFI-программу.

BIOS и UEFI начинают загрузку по-разному

В legacy BIOS после начальной аппаратной подготовки выбирается загрузочное устройство и исполняется начальный загрузочный код, обычно связанный с MBR. Крошечный первый этап не содержит полноценную ОС и передаёт управление следующим этапам загрузчика. UEFI имеет иной интерфейс: записи загрузки ведут к EFI-программам на ESP. GPT часто сочетается с UEFI, но таблица разделов и firmware — разные понятия. GRUB может работать в разных вариантах; расположение и цепочка его файлов зависят от установки. После выбора записи он загружает ядро и initramfs, передаёт command line, например сведения о root. Secure Boot добавляет проверку доверия; shim помогает встроить доверенные компоненты в выбранную цепочку. В WSL2 эту физическую цепочку проходит Windows-хост, а не каждый запуск Ubuntu.

Практическое следствие: Наличие UEFI не означает обязательный GRUB. Внешний USB тоже может содержать EFI-загрузчик и полноценную Live-среду.

Драйверы связывают ядро с устройствами

Драйвер, модуль ядра и firmware устройства — связанные, но разные вещи.

Драйверы связывают ядро с устройствами

Ядро распознаёт устройства через соответствующие шины и подсистемы. Драйвер знает, как работать с конкретным контроллером или классом устройств; более высокий слой предоставляет приложению общий интерфейс. Драйвер может быть встроен в ядро или находиться в загружаемом модуле .ko. Modprobe учитывает зависимости модулей; lsmod показывает загруженные модули, но отсутствие строки не доказывает отсутствие встроенного драйвера. Некоторым устройствам нужна отдельная firmware, загружаемая драйвером: это не тот же код, что UEFI компьютера. /sys представляет объекты ядра и их связи, /dev — интерфейсы устройств; udev участвует в обработке событий и именовании пользовательской среды. Если драйвер хранения нужен для root и не встроен, он должен быть доступен достаточно рано, обычно в initramfs. Для наблюдения читаем lspci -k, lsmod и журнал, не выгружаем модуль диска на работающей системе.

Практическое следствие: Ubuntu: lspci -k, lsmod, modinfo имя_модуля, journalctl -k -b. В VM и WSL состав устройств отличается от физического PC.

Как Ubuntu доходит до PID 1

Каждый этап передаёт управление следующему; терминал появляется в конце.

Как Ubuntu доходит до PID 1

Рассматриваем типичную Ubuntu на компьютере с UEFI, а не учебную WSL2. Сразу после включения выполняется firmware: это код, который ещё не является Linux. UEFI выбирает загрузочную запись и запускает EFI-программу с EFI System Partition. В Ubuntu с Secure Boot часто участвует shim, затем GRUB. Загрузчик выбирает ядро, передаёт ему параметры и initramfs. Ядро начинает управлять процессором, памятью и устройствами. Ранняя пользовательская среда получает доступ к настоящему корневому разделу, после чего управление переходит init установленной системы. В нашей Ubuntu это systemd с PID 1. Менеджер запускает нужные службы; позже появляется сеанс пользователя, а в нём терминал и shell. Secure Boot проверяет доверие к исполняемым компонентам, но не заменяет проверку исправности сервиса. Возможны другие загрузчики, EFI stub и единый образ UKI: схема показывает роли, а не единственный обязательный набор файлов.

Аналогия: сначала открыть здание и включить коммуникации, затем организовать работу отделов. Linux не ждёт входа человека, чтобы запустить серверные службы.

Практическое следствие: Нет. Bash — программа пользовательской среды, запускаемая после ранних этапов загрузки.

Зачем нужен initramfs

Чтобы открыть настоящий корень, иногда сначала нужна маленькая среда в памяти.

Зачем нужен initramfs

Представьте зашифрованный диск: чтобы открыть его, нужны драйверы, утилита и ключ; но утилиты установленной ОС лежат на этом же диске. Initramfs разрывает этот круг. Это ранняя файловая система, содержимое которой загружено в память: в ней есть необходимый init, модули и инструменты. Она помогает найти устройство, собрать нужные слои хранения, при необходимости получить ключ и смонтировать будущий корень. Затем выполняется переход к настоящему root и запуск его init. Это не второй Linux и не аналог swap. Уже работает то же ядро. На некоторых системах ранний init тоже является systemd; упрощённая схема не обещает, что systemd всегда впервые появляется только после switch root. Не предлагайте группе менять загрузочные разделы: задача — понять причину сообщений, а не сломать учебный ноутбук.

Аналогия: аварийный набор с ключом позволяет открыть склад, где лежат основные инструменты. RAM не является постоянным архивом.

Практическое следствие: В ранней среде и цепочке доступа к root; пользовательский Bash ещё не нужен.

Отказы на разных стадиях загрузки

Последний успешный этап сужает круг причин.

Отказы на разных стадиях загрузки

Дайте четыре коротких сообщения: no boot device, не найден UUID корня, failed unit и HTTP 500. Попросите поставить каждое на схему. Если firmware не находит загрузочную программу, смотреть журнал Python бессмысленно. Если initramfs не открыл root, systemctl из обычного сеанса ещё недоступен. Если система дошла до входа и одна служба failed, ядро и основной root уже работают: смотрим unit и журнал. Если API отвечает HTTP 500, сетевой путь как минимум дошёл до приложения; это не свидетельство сломанного GRUB. Идти по слоям не означает строго проверять всё с нуля: используем факты, уже содержащиеся в симптоме. На занятии не воспроизводим реальные повреждения bootloader: работаем с вымышленными карточками симптомов и объясняем, какой факт исключает гипотезу.

Аналогия: если касса печатает чек с ошибочной суммой, сначала проверяем расчёт, а не отсутствие электричества.

Практическое следствие: Нет. Ответ приложения доказывает прохождение многих нижних слоёв; начинаем с запроса и логов сервиса.

WSL2: путь запуска другой

Windows уже работает, когда вы открываете Ubuntu.

WSL2: путь запуска другой

Команда wsl.exe просит инфраструктуру WSL запустить Linux-среду. WSL2 использует настоящее Linux-ядро в управляемой виртуальной машине, а Ubuntu добавляет rootfs, пакеты и пользовательские программы. При таком запуске студент не выбирает GRUB Ubuntu на физическом компьютере и не меняет EFI System Partition. Если для дистрибутива включён systemd, он занимает PID 1 внутри этой среды; связанные с WSL init-процессы выполняют интеграционные задачи. Проверяем факт командой ps -p 1 -o pid,comm,args, а не по названию окна. Наличие systemd не означает, что среда переживёт выключение Windows или wsl --shutdown. Microsoft отдельно отмечает: systemd-службы сами по себе не удерживают WSL instance живым. Для занятий этого достаточно, для постоянного сервера требуется другое решение.

Аналогия: отдельный офис внутри уже работающего бизнес-центра. Это настоящая среда, но её питание и время жизни зависят от хоста.

Практическое следствие: Нет. Ядро запущено инфраструктурой WSL2, а не обычной цепочкой загрузки отдельной Ubuntu на PC.

Три ОС: одинаковые роли, разные механизмы

Сравниваем firmware, ядро и службы; не называем macOS Linux.

Три ОС: одинаковые роли, разные механизмы

У Windows в типичной UEFI-загрузке firmware запускает Windows Boot Manager; winload.efi загружает NT-ядро и ранние драйверы. Затем появляются системные процессы и инфраструктура служб, в том числе Service Control Manager, и пользовательский вход. Эта строка не рисует весь граф Windows: SMSS, wininit и logon имеют свои роли и зависимости. Для Mac с Apple silicon аппаратная цепочка начинается с Boot ROM, затем участвуют LLB и iBoot с проверками доверия и политики загрузки; стартует XNU. Launchd управляет пользовательской системой служб и является PID 1. Intel Mac имеет другую firmware-цепочку, поэтому нельзя показывать Apple silicon как универсальную загрузку любого Mac. Linux, NT и XNU реализуют похожие задачи управления ресурсами, но используют разные API, драйверы и форматы приложений.

Аналогия: у зданий есть вход, электросистема и диспетчер, но схемы подключения и регламенты различаются.

Практическое следствие: Нет. Нужна конфигурация соответствующего менеджера и проверка конкретного приложения.

Что происходит при чтении файла

Приложение обращается к ядру; shell не читает диск за каждую программу.

Что происходит при чтении файла

Python open — высокоуровневая операция. Runtime и библиотечные функции в нужный момент делают системный вызов: например, openat или read. Выполнение переходит через контролируемую границу из пользовательского режима в режим ядра. Ядро разрешает путь, проверяет доступ, использует файловую систему и при необходимости драйвер; результат или код ошибки возвращается приложению. Не путайте режим CPU с sudo: привилегированный пользовательский процесс тоже не получает право произвольно выполнять код ядра. Далеко не каждый вызов Python приводит к I/O: данные могут быть в буфере или кэше. Терминал лишь показывает интерфейс ввода/вывода; shell разбирает команду и запускает программу, которая затем самостоятельно запрашивает ресурсы. Для наблюдения используем узкий strace на собственном коротком процессе, не трассируем чужие приложения.

Аналогия: даже директор заказывает выдачу через складскую систему. Аналогия не описывает переключение режима процессора.

Практическое следствие: Права пользователя и режим CPU — разные вещи. Доступ к ресурсам идёт через интерфейсы ядра.

POSIX: общий договор о поведении

Стандарт описывает интерфейсы, а не устройство конкретного ядра.

POSIX: общий договор о поведении

POSIX — семейство требований к интерфейсам ОС: процессам, файловым операциям, shell и утилитам. Благодаря общим соглашениям многие программы и скрипты проще переносить между Unix-подобными системами. Это не пакет, который устанавливают вместо Linux, и не описание внутреннего планировщика. Linux с библиотеками предоставляет многие POSIX-интерфейсы; macOS имеет Unix-происхождение и собственные реализации. Обычный Windows PowerShell не превращается в POSIX shell; Linux в WSL2 предоставляет отдельное совместимое окружение. Различайте поддержку интерфейса и формальную сертификацию конкретной версии ОС: надпись Linux сама по себе не является сертификатом. POSIX не требует systemd, apt, /proc или всех GNU-флагов. На слайде намеренно нет обещания полного равенства реализаций.

Аналогия: договор о форме розетки помогает подключать приборы, но не делает электростанции одинаковыми.

Практическое следствие: Первый использует широко доступный стандартный интерфейс; systemctl обращается к конкретному менеджеру systemd.

Переносимый исходник ≠ переносимый бинарник

API, команды, ABI и архитектуру процессора проверяем отдельно.

Переносимый исходник ≠ переносимый бинарник

Даже когда исходник использует общие интерфейсы, готовый файл программы зависит от ABI, формата исполняемого файла, библиотек и архитектуры CPU. Linux ELF-файл нельзя просто считать приложением macOS Mach-O или Windows PE. POSIX облегчает перенос исходного кода, но не обещает единый бинарник. Скрипт зависит от доступного interpreter и поведения утилит: GNU и BSD версии stat и sed имеют разные флаги, locale меняет обработку текста, пути и регистр зависят от файловой системы. Практическая привычка: сначала определить слой несовместимости, затем выбрать правильный runtime или сборку. Для переносимого shell-опыта используем простые sh, printf и wc; GNU-расширения подписываем как Ubuntu. Контейнер Linux на Mac использует Linux-VM, а не магически делает XNU Linux-ядром.

Аналогия: рецепт можно приготовить на другой кухне, но детали одной плиты не обязаны подходить другой.

Практическое следствие: Нет. Интерфейс исходника и бинарный ABI — разные уровни совместимости.

Почему /proc и /mnt/c выглядят как папки

Единое дерево имён соединяет разные файловые системы.

Почему /proc и /mnt/c выглядят как папки

Корень / — начало дерева путей. Mount присоединяет другую файловую систему в выбранной точке этого дерева: поэтому часть /home может жить на отдельном устройстве, а /proc показывать динамические сведения ядра. /proc/PID не является папкой с резервной копией памяти на диске; объекты там формирует ядро. В WSL путь /mnt/c даёт доступ к файловой системе Windows с особенностями интеграции и метаданных. Одинаковый вид в ls не доказывает одинаковые права, производительность и правила имени. Для проекта выбираем ~/devops-course в Linux rootfs. Команда findmnt показывает структуру mount; она Linux-специфична. В macOS для просмотра монтирований используют mount и df, а /proc по умолчанию нет. Не даём задания перемонтировать системные файловые системы.

Аналогия: карта с адресами может вести и в склад, и в справочную службу. Единый адресный формат не означает одинаковый источник данных.

Практическое следствие: Их представление формируется ядром; это виртуальная файловая система.

LiveUSB: корень системы можно собрать без установки

Read-only образ и слой изменений дают обычное дерево файлов.

LiveUSB: корень системы можно собрать без установки

Носитель содержит загрузочные компоненты, ядро, раннюю среду и образ пользовательской системы. В распространённом Live Linux базовая система находится в сжатом SquashFS; OverlayFS объединяет её с writable-слоем. Изменение файла попадает в верхний слой, а исходный образ остаётся неизменным. Если верхний слой находится в RAM, изменения исчезнут после выключения; persistence хранит их на специально настроенном постоянном носителе. Режим copy-to-RAM может заранее скопировать образ, но он не обязателен: часто нужные блоки читаются с USB по мере использования и кэшируются. Поэтому фраза «всё целиком вгружается в оперативку» слишком груба. Kali Live использует общую Linux-механику, а не особое хакерское ядро. Live-среда удобна для восстановления файлов, проверки железа и работы с установленной системой, которая сейчас не загружена. Сам запуск Live не запрещает запись на внутренний диск: действия пользователя всё ещё могут его изменить.

Практическое следствие: Live — способ загрузки. Установка на диск, запуск VM, Live и WSL — разные способы предоставить среду.

Windows тоже запускает ремонтную ОС с носителя

WinPE и исторический BartPE решали задачу работы вне установленной Windows.

Windows тоже запускает ремонтную ОС с носителя

Windows PE — небольшая Windows-среда для установки, развёртывания и восстановления. Современная цепочка может загрузить boot.wim в RAM-disk, после чего работают драйверы, shell и ремонтные инструменты. Здесь сходство с Live Linux состоит в запуске самостоятельной среды с внешнего источника; детали образов и writable-слоя другие. В эпоху XP администраторы использовали сторонний PE Builder/BartPE и плагины для сборки загрузочной среды из файлов Windows XP или Server 2003. Это не доказательство, что обычная установленная XP автоматически полностью переносилась на любой CD. Историческую практику показываем как объяснение идеи, а не рекомендуем старую неподдерживаемую XP для работы. Ремонт установленной системы требует её корректного монтирования и понимания шифрования. Для практического показа достаточно ISO в отдельной VM: физическую флешку и основной диск студентов не перезаписываем.

Практическое следствие: Формат Windows WIM и Linux SquashFS/Overlay различается; обе среды могут работать независимо от основной установленной ОС.

Опыт: связать рисунок с наблюдением

ps -p 1 -o pid,comm,args
uname -srm
cat /etc/os-release
findmnt -T /proc
findmnt -T "$HOME"
# Optional Ubuntu trace of a new process
strace -e trace=openat,read,write /usr/bin/printf "hello\n"

lsblk -f
findmnt
cat /proc/cmdline
lsmod | head
# Read-only device inspection when pciutils is installed
lspci -k

Разложите карточки «нет boot device», «не найден root», «failed unit», «HTTP 500» по стадиям. Объясните, почему WSL2 не проходит через GRUB студента. Сравните uname и PID 1, не меняя загрузку. Ubuntu: для необязательного strace понадобится sudo apt install strace. Mac: uname -srm; ps -p 1 -o pid,comm,args; mount; df -h. Windows PowerShell: Get-CimInstance Win32_OperatingSystem | Select-Object Caption,Version; Get-Process -Id $PID. Запуск Windows-команд выполняется отдельно от Ubuntu.

Рассмотрите Live-образ в отдельной VM. Найдите mount корня и writable-слой, создайте временный файл, после перезагрузки проверьте сохранение. Persistence — отдельная демонстрация; не используйте dd с диском ноутбука.

Источники подробного разбора

Команды и наблюдения

Окружение: Ubuntu / Bash.

cd ~/devops-course
mkdir -p data results
printf "score
0.8
" > data/report.csv
ln -s data/report.csv latest.csv
pwd
ls -lah
file data/report.csv
stat data/report.csv
readlink latest.csv

printf создаёт небольшой текстовый файл. ln -s создаёт ссылку, а не копирует данные; повторно создавать существующее имя не нужно.

Ожидаемый результат: latest.csv указывает на data/report.csv; file сообщает текст; stat показывает владельца, размер и права.

Вариант для macOS

Основные пути и ссылки похожи; домашняя папка обычно /Users/имя. stat в macOS — BSD-вариант, поэтому используем -x вместо Linux-флагов. /proc по умолчанию отсутствует. APFS часто настроен без различения регистра, но это зависит от тома: не полагайтесь на такое поведение.

pwd
ls -lah
file data/report.csv
stat -x data/report.csv
readlink latest.csv

Практика: Найти потерянный отчёт

  1. Создайте дерево raw, processed, reports в учебной папке.
  2. Поместите небольшой текст в raw/input.txt, скопируйте его в processed.
  3. Сделайте ссылку reports/current.txt на ../processed/input.txt.
  4. Переименуйте processed/input.txt и объясните, почему ссылка перестала открываться; восстановите цель или ссылку.

Результат: Дерево папок и короткое объяснение абсолютного/относительного пути.

Проверка: cat reports/current.txt читает ожидаемый текст; студент показывает pwd перед действиями.

Неисправность для разбора: Ссылка указывает относительно неверной папки.

Решение и диагностика

Ссылка разрешается относительно папки, где лежит сама ссылка: из reports цель ../processed/input.txt верна. После mv processed/input.txt processed/renamed.txt создайте новую ссылку ln -sfn ../processed/renamed.txt reports/current.txt. Для сравнения копии используйте cmp raw/input.txt processed/renamed.txt; код возврата 0 означает одинаковые байты.

Основные выводы

Самостоятельная работа

Нарисовать дерево учебного проекта и подписать роли /home, /etc, /var, /tmp.

Источники