Практическая работа №1
Тема: Ядерные и внеядерные компоненты Linux
Цель работы: Научиться различать ядерные и внеядерные компоненты операционной системы Linux, изучить их взаимодействие через практические примеры.
Инструкция по выполнению работы
Преподаватель демонстрирует каждый шаг, студенты повторяют команды в терминале и фиксируют результаты.
Пояснение
Архитектура Linux построена на принципе разделения пространства ядра (kernel space) и пользовательского пространства (user space). Ядро — это центральный компонент, который напрямую взаимодействует с аппаратным обеспечением. Все остальное — приложения, оболочки, сервисы — работают во внеядерном (пользовательском) пространстве и обращаются к ядру через системные вызовы (system calls). Это разделение обеспечивает стабильность, безопасность и модульность системы.
Шаг 1. Изучение информации о ядре Linux
Цель: Убедиться, что вы работаете с ядром Linux, и изучить его параметры.
- Проверьте версию ядра:
uname -aПример вывода:Linux altlinux 6.12.42-6.12-alt1 #1 SMP PREEMPT_DYNAMIC Tue Aug 26 13:33:43 UTC 2025 x86_64 GNU/Linux
Пояснение
Версия ядра следует схеме семантического версионирования: MAJOR.MINOR.PATCH. Например, 5.15.0 означает:
- 5 — основная версия (мажорная),
- 15 — второстепенная (минорная), часто добавляет новые функции,
- 0 — патч (исправления ошибок).
- Посмотрите детали ядра через файловую систему
/proc:
cat /proc/versionВывод: Тот же, что и в uname -a, но в «сыром» виде.
Linux version 6.12.42-6.12-alt1 (builder@localhost.localdomain) (gcc-13 (GCC) 13.2.1 20240128 (ALT Sisyphus 13.2.1-alt3), GNU ld (GNU Binutils) 2.41.0.20230826) #1 SMP PREEMPT_DYNAMIC Tue Aug 26 13:33:43 UTC 2025
Подробное пояснение вывода
1. Linux version 6.12.42-6.12-alt1
- Это основная информация о версии ядра Linux.
6.12.42— версия ядра Linux:6— мажорная (основная) версия.12— минорная (второстепенная) версия.42— патч-уровень (ревизия, накопленные исправления).
-6.12-alt1— суффикс, указывающий на специфику сборки:- Это пакет ядра, собранный для дистрибутива ALT Linux.
alt1— номер релиза пакета в репозитории ALT Linux.
2. (builder@localhost.localdomain)
- Указывает на пользователя и хост, с которого была произведена сборка ядра.
builder— имя пользователя (обычно это автоматизированный аккаунт сборки).localhost.localdomain— имя машины, где происходила компиляция (стандартное имя для сборочных систем).- Это не обязательно реальное имя хоста, часто используется по умолчанию в автоматизированных средах.
3. (gcc-13 (GCC) 13.2.1 20240128 (ALT Sisyphus 13.2.1-alt3)
- Информация о компиляторе, использованном для сборки ядра.
gcc-13— версия GCC (GNU Compiler Collection), использованная для компиляции.13.2.1— конкретная версия GCC.20240128— дата сборки этого конкретного бинарника GCC.ALT Sisyphus 13.2.1-alt3— указывает, что это версия GCC, пакованная для дистрибутива ALT Linux, ветка Sisyphus (основной репозиторий пакетов).
4. GNU ld (GNU Binutils) 2.41.0.20230826
- Указывает на компоновщик (linker), использованный при сборке ядра.
GNU ld— это стандартный компоновщик из пакета GNU Binutils.2.41.0.20230826— версия Binutils (дата указывает на момент сборки).- Компоновщик отвечает за объединение объектных файлов в единый образ ядра.
5. #1 SMP PREEMPT_DYNAMIC
- Это тег сборки ядра, содержит важные флаги конфигурации:
#1— номер сборки (в данном случае первая сборка с такими параметрами).SMP— Symmetric Multi-Processing:- Ядро поддерживает многопроцессорные (или многоядерные) системы.
- Может использовать несколько CPU/ядер одновременно.
PREEMPT_DYNAMIC— режим вытесняющего планирования:- Ядро поддерживает динамическое вытеснение (preemption).
- Это компромисс между производительностью и латентностью: можно включать/выключать вытеснение в зависимости от нагрузки.
- Более гибкий, чем
PREEMPT_NONE, но не такой агрессивный, какPREEMPT_FULL.
6. Tue Aug 26 13:33:43 UTC 2025
- Дата и время сборки ядра.
- Указывается в формате: день недели, месяц, число, время, часовой пояс, год.
- Здесь: вторник, 26 августа 2025 года, 13:33:43 по UTC.
Пояснение
Файловая система /proc — это интерфейс ядра для пользовательского пространства. Она не хранит данные на диске, а генерируется ядром «на лету». Например, /proc/cpuinfo показывает информацию о процессоре, /proc/meminfo — о памяти. Это пример того, как ядро предоставляет свои данные через файловый интерфейс, что упрощает взаимодействие с пользовательскими программами.
Шаг 2. Анализ загруженных модулей ядра
Цель: Увидеть, какие модули ядра активны в системе.
- Список загруженных модулей:
lsmodПример вывода:
Module Size Used by
snd_hda_codec_generic 81920 1
...Пояснение:
- Модули ядра (например,
snd_hda_codec_genericдля звука) — это ядерные компоненты, расширяющие функционал ядра без перезагрузки.
Пояснение
Модули ядра — это динамически загружаемые компоненты, которые позволяют ядру оставаться компактным. Вместо того чтобы включать поддержку всех возможных устройств «навсегда», ядро загружает модули по мере необходимости (например, при подключении USB-устройства). Это называется динамической загрузкой модулей. Модули имеют расширение .ko (kernel object) и находятся в /lib/modules/$(uname -r)/.
- Поиск конкретного модуля (например, связанного с сетью):
lsmod | grep netПояснение
Сетевые модули (например, af_packet, nf_conntrack) отвечают за обработку сетевых пакетов, работу с интерфейсами, NAT и т.д. Их наличие в lsmod означает, что соответствующие функции активны в ядре. Это показывает, как ядро масштабируется под задачи системы, загружая только нужные компоненты.
Шаг 3. Исследование процессов ядра
Цель: Найти процессы, непосредственно связанные с ядром.
- Просмотр всех процессов:
ps -efОбратите внимание на процессы вида [kthreadd], [kworker/*]:
- Это потоки ядра (kernel threads), управляющие задачами в фоне (например, обработка прерываний).
- Ядерный компонент: Такие процессы не имеют PID в пользовательском пространстве и создаются самим ядром.
Пояснение
kthreadd — это родитель всех потоков ядра. Он запускается при загрузке и порождает другие ядерные потоки, такие как:
- kworker/* — выполняют отложенные задачи (work queues),
- migration/* — переносят процессы между CPU-ядрами,
- ksoftirqd/* — обрабатывают программные прерывания.
Эти потоки не являются обычными процессами — они работают исключительно в пространстве ядра и не могут быть завершены пользователем.
- Фильтрация процессов ядра:
ps -ef | grep "\[.*\]"Вывод: Список процессов в квадратных скобках — это внутренние задачи ядра.
Пояснение
Квадратные скобки [...] в выводе ps — это визуальный индикатор того, что процесс является внутренним потоком ядра. Система не создаёт для них реальных исполняемых файлов — они существуют только в памяти. Это отличает их от пользовательских процессов, которые всегда связаны с исполняемым файлом (например, /usr/bin/firefox).
Шаг 4. Изучение внеядерных компонентов
Цель: Определить компоненты, работающие в пользовательском пространстве.
- Просмотр установленных пакетов (пакетный менеджер):
dpkg -l | head -n 10 # Для Ubuntu/Debian
# Или
rpm -qa | head -n 10 # Для CentOS/RHEL/ALTПояснение:
- Пакеты (например,
bash,nginx,firefox) — это внеядерные компоненты. - Они работают в пользовательском пространстве и взаимодействуют с ядром через системные вызовы.
Пояснение
Пакетный менеджер (например, dpkg, rpm, apt, yum) — это инфраструктура управления внеядерными компонентами. Он отслеживает, какие программы установлены, их зависимости и версии. Эти компоненты не являются частью ядра, но критически важны для функциональности системы. Например, bash — это просто программа, как и любой другой бинарник, но она предоставляет интерфейс для взаимодействия с ОС.
- Просмотр активных сервисов (демонов):
systemctl list-units --type=service --state=runningПример вывода:
UNIT LOAD ACTIVE SUB DESCRIPTION
ssh.service loaded active running OpenBSD Secure Shell server
...Пояснение:
- Сервисы (демоны) — внеядерные компоненты, управляющие фоновыми задачами (например, веб-сервер, SSH).
Пояснение
Демоны — это внеядерные процессы, которые запускаются при загрузке или по требованию. Они работают в фоне и предоставляют сетевые или системные услуги. Например, sshd слушает порт 22 и обрабатывает входящие SSH-подключения. Он взаимодействует с ядром через системные вызовы (например, socket(), bind(), accept()), чтобы работать с сетью.
- Проверка оболочки (shell):
echo $SHELLВывод: /bin/bash — путь к оболочке, которая является внеядерным компонентом.
Пояснение
Оболочка (shell) — это пользовательская программа, которая интерпретирует команды. Она не является частью ядра, хотя и кажется «фундаментальной». Например, bash можно удалить и заменить на zsh или fish — система продолжит работать. Shell использует системные вызовы (fork, exec, read, write) для выполнения команд и взаимодействия с ядром.
Шаг 5. Сравнение ядерных и внеядерных компонентов
Цель: Систематизировать полученные данные.
Заполните таблицу в тетради:
Компонент Пример Принадлежность Как проверить? Ядерный Модуль snd_hda_codecЯдро lsmodВнеядерный Сервис ssh.serviceПользовательское пространство systemctlЯдерный Процесс [kworker/0:1]Ядро ps -efВнеядерный Оболочка bashПользовательское пространство echo $SHELLВывод:
- Ядро — «мозг» системы, отвечающий за управление ресурсами.
- Внеядерные компоненты (пакеты, сервисы, оболочки) предоставляют пользователю функционал, но зависят от ядра.
Пояснение
Важно понимать, что разделение на ядро и пользовательское пространство — это не просто классификация, а архитектурный принцип безопасности и стабильности. Если программа в пользовательском пространстве «падает», это не приводит к краху всей системы. Но если падает ядро — система зависает (BSOD в Windows, kernel panic в Linux). Поэтому критически важные функции (управление памятью, планирование процессов) остаются в ядре, а всё остальное — «снаружи».
Шаг 6. Изучение вывода htop
- Установите новый пакет (например,
htop):
apt-get install htop- Запустите его и сравните процессы, отображаемые в
htopиps -ef. - Объясните, к какой категории (ядерные/внеядерные) относится
htop.
Пояснение
Установка htop — хороший пример того, как внеядерный компонент может отображать информацию о ядре. htop читает данные из /proc и /sys — виртуальных файловых систем, предоставляемых ядром. Он не «видит» ядро напрямую, а интерпретирует его данные, как и любой другой пользовательский процесс. Это иллюстрирует, как пользовательское пространство «наблюдает» за ядром через стандартизированные интерфейсы.
Шпаргалка по htop
1. Запуск htop
Просто введите в терминале:
htopДля просмотра всех процессов (включая чужие) может потребоваться
sudo:
sudo htop2. Интерфейс htop
После запуска вы увидите:
Верхняя часть (панель ресурсов):
- CPU: использование каждого ядра (в процентах и графически).
- Mem: использование оперативной памяти.
- Swp: использование swap-раздела.
Цвета:
- Синий — низкоприоритетные задачи (nice)
- Зелёный — пользовательские процессы
- Красный — системные процессы
- Жёлтый — время ожидания ввода/вывода (iowait)
Средняя часть (список процессов):
Колонки по умолчанию:
- PID — идентификатор процесса
- USER — владелец процесса
- PRI — приоритет
- NI — nice-значение (приоритет планировщика)
- VIRT — виртуальная память
- RES — физическая память (резидентная)
- SHR — разделяемая память
- S — состояние (R=работает, S=спит, Z=зомби, D=ожидание I/O)
- CPU% — загрузка CPU
- MEM% — использование памяти
- TIME+ — общее время работы процесса
- Command — команда/имя процесса
3. Управление с помощью клавиатуры
| Клавиша | Действие |
|---|---|
| ↑ / ↓, Page Up / Page Down | Прокрутка списка процессов |
| F1 | Помощь (Help) — подробная справка по всем клавишам |
| F2 | Настройки (Setup) — настройка отображения |
| F3 | Поиск процесса по имени |
| F4 | Фильтр — показывать только процессы, содержащие введённую строку |
| F5 | Режим дерева — отображение процессов в виде дерева (с учётом родительских процессов) |
| F6 | Сортировка — выбрать колонку для сортировки (например, по CPU%, MEM%, PID и т.д.) |
| F7 | Уменьшить приоритет (Nice --) |
| F8 | Увеличить приоритет (Nice ++) |
| F9 | Отправить сигнал процессу (например, SIGKILL для завершения) |
| F10 | Выход из htop |
| Space | Пометить/снять пометку с процесса (для массовых действий) |
| u | Показать только процессы определённого пользователя |
| k | Показать/скрыть названия сигналов (в режиме отправки сигнала) |
| H | Включить/выключить отображение потоков (threads) |
| U | Снять пометки со всех процессов |
| l | Показать открытые файлы процесса (через lsof) |
| i | Показать/скрыть задержку ввода-вывода (iowait) на графике CPU |
4. Полезные настройки (F2 — Setup)
Вкладки:
- [Display options] — отображение:
Hide kernel threads— скрыть системные потоки (начинающиеся сkthreadd,kworker)Hide userland process threads— не показывать потоки пользовательских процессовShow custom thread names— показывать имена потоковHighlight changes— подсвечивать изменения при обновлении
- [Colors] — выбрать цветовую схему (напр., black on white, blue, green и т.п.)
- [Fields] — выбрать, какие колонки отображать в списке процессов
5. Поиск и фильтрация
- F3 → введите имя процесса (например,
firefox) — htop найдёт и подсветит. - F4 → введите строку — останутся только процессы, содержащие её в команде.
- Чтобы сбросить фильтр — нажмите F4, затем Backspace и Enter.
6. Управление процессами
Завершение процесса:
- Выделите нужный процесс стрелками.
- Нажмите F9.
- Выберите сигнал:
SIGTERM(15) — вежливое завершение (рекомендуется).SIGKILL(9) — принудительное уничтожение (если процесс не отвечает).
- Нажмите Enter.
Можно пометить несколько процессов через Пробел, затем применить сигнал ко всем.
7. Сортировка
- Нажмите F6.
- Выберите колонку для сортировки:
CPU%— по загрузке процессораMEM%— по использованию памятиTIME+— по времени работыPID— по номеру процесса
- Сортировка обновляется в реальном времени.
8. Режим дерева (F5)
- Включает древовидное отображение: дочерние процессы показываются под родительскими.
- Удобно для анализа, какие процессы порождены другими (например, скрипты, сервисы, оболочки).
9. Полезные советы
- Запускайте
htopсsudo, чтобы видеть все процессы. - Используйте
htop --no-color— если терминал некорректно отображает цвета. - Можно запустить
htopи оставить его работать в фоне, например, вtmuxилиscreen. - Чтобы быстро найти "тяжёлые" процессы — сортируйте по
CPU%илиMEM%.
10. Примеры использования
Показать только процессы пользователя alex:
htop -u alexОтсортировать по памяти при запуске:
(в htop нажмите F6 → MEM%)
Запустить в режиме дерева:
htop -tСовет: Нажмите F1, чтобы всегда иметь под рукой полную справку!
Контрольные вопросы
- Какая команда покажет версию ядра Linux?
- Почему процессы в квадратных скобках (например,
[kthreadd]) считаются ядерными? - Приведите 3 примера внеядерных компонентов и объясните их назначение.
- Как проверить, какие модули ядра используются для работы Wi-Fi?
Требования к отчету
- Скриншоты выполнения ключевых команд.
- Заполненная таблица из Шага 5.
- Ответы на контрольные вопросы.
Пояснение
При оформлении отчета обратите внимание: скриншоты должны отражать не только результат, но и контекст. Например, если вы показываете lsmod, полезно добавить пояснение: «Этот модуль отвечает за X и был загружен автоматически при обнаружении устройства Y». Это покажет понимание, а не просто копирование вывода.
Примечание: Эта работа закрепляет теорию архитектуры ОС, показывая разделение на ядро (монолитное ядро Linux) и пользовательское пространство (POSIX-совместимые утилиты, демоны).
Выводы
Linux использует монолитное ядро, но с поддержкой модулей — это компромисс между производительностью (все в одном адресном пространстве) и гибкостью (возможность загружать компоненты динамически). В отличие от микроядер (например, в системах на базе Mach), где многие компоненты работают во внеядерном пространстве, Linux держит большую часть драйверов и подсистем внутри ядра, что даёт высокую производительность, но требует большей осторожности при разработке.
