Этот проект реализует загружаемый модуль ядра Linux, который функционирует как Device Mapper таргет. Модуль создает виртуальное блочное устройство поверх существующего нижележащего устройства и перехватывает все операции ввода-вывода (чтение и запись) к этому виртуальному устройству.
Основная функциональность модуля:
- Перенаправление I/O запросов на нижележащее устройство.
- Сбор статистики по выполненным операциям (количество запросов и суммарный размер данных).
- Предоставление агрегированной статистики через интерфейс
sysfs.
Проект разработан в рамках тестового задания.
dmp.c: Исходный код модуля ядра на языке C.Makefile: Файл для сборки модуля ядра.README.md: Этот файл с пользовательским руководством.
Для сборки, установки и тестирования модуля на системе Ubuntu необходимы следующие компоненты:
- Установленный компилятор GCC и стандартные утилиты сборки (
build-essential). - Заголовочные файлы ядра, соответствующие текущей версии установленного ядра (
linux-headers-$(uname -r)). - Утилиты Device Mapper (
lvm2, включающийdmsetup). - Git для работы с репозиторием.
Эти компоненты можно установить с помощью команды:
sudo apt update
sudo apt install build-essential linux-headers-$(uname -r) lvm2 git-
Клонируйте репозиторий или скачайте исходные файлы.
-
Перейдите в каталог с исходными файлами в терминале.
-
Выполните команду
make:make
Это соберет модуль ядра
dmp.ko. В процессе сборки может быть выведено много информации, но в конце убедитесь, что нет сообщений об ошибках.
После успешной сборки модуль готов к загрузке в ядро.
Важно: Для выполнения этих команд требуются права суперпользователя (sudo).
-
Убедитесь, что вы находитесь в каталоге с файлом
dmp.ko. -
Загрузите модуль:
sudo insmod dmp.ko
-
Проверьте, что модуль успешно загружен:
lsmod | grep dmpЕсли модуль загружен, вы увидите строку с именем
dmpв выводе. -
Проверьте лог ядра (
dmesg), чтобы увидеть сообщения об инициализации модуля:dmesg | tailИщите сообщения, начинающиеся с
dm-dmp:.
Тестирование выполняется с использованием утилиты dmsetup для создания device mapper устройств и dd для выполнения операций ввода-вывода, как описано в задании.
- Создайте тестовое нижележащее блочное устройство (
zero1): Мы используем стандартный таргетzeroдля создания простого виртуального устройства размером 1MB (2048 секторов по 512 байт).sudo dmsetup create zero1 --table "0 2048 zero" - Устройство
zero1должно успешно создаться: Проверьте его наличие в/dev/mapper/:ls -l /dev/mapper/zero1
- Создайте наше proxy устройство (
dmp1) поверхzero1: Используйте наш таргетdmp. Размер и смещение должны соответствовать нижележащему устройству.Здесь:sudo dmsetup create dmp1 --table "0 2048 dmp /dev/mapper/zero1 0"0 2048- сегмент с начального сектора 0 и размером 2048 секторов;dmp- имя нашего таргета;/dev/mapper/zero1- нижележащее устройство;0- смещение на нижележащем устройстве. - Устройство
dmp1должно успешно создаться: Проверьте его наличие в/dev/mapper/:ls -l /dev/mapper/dmp1
- Проверьте sysfs интерфейс статистики:
Каталог статистики должен появиться в
/sys/module/dmp/stat/.Прочитайте содержимое файла статистики. Изначально статистика должна быть нулевой.ls -l /sys/module/dmp/stat/volumes
Ожидаемый вывод (с нулевыми значениями):cat /sys/module/dmp/stat/volumes
read: reqs: 0 avg size: 0 write: reqs: 0 avg size: 0 total: reqs: 0 avg size: 0 - Выполните операции на запись и чтение на
dmp1: Используйтеddдля генерации I/O запросов. Эти операции будут проходить через наш модульdmp.Во время выполнения# Запись: 10 запросов по 4KB sudo dd if=/dev/zero of=/dev/mapper/dmp1 bs=4k count=10 status=progress conv=fsync # Чтение: 5 запросов по 8KB sudo dd if=/dev/mapper/dmp1 of=/dev/null bs=8k count=5 status=progress
ddвы можете наблюдать соответствующие сообщения в логе ядра (dmesg). - Проверьте обновленную статистику:
Снова прочитайте sysfs файл
/sys/module/dmp/stat/volumes:Статистика должна отражать выполненные операцииcat /sys/module/dmp/stat/volumes
dd. Например:(Значения "avg size" могут немного отличаться в зависимости от точности вычислений и особенностей I/O в вашей системе).read: reqs: 5 avg size: 8192 write: reqs: 10 avg size: 4096 total: reqs: 15 avg size: 5461
После завершения тестирования необходимо удалить созданные device mapper устройства и выгрузить модуль.
- Удалите устройство
dmp1:sudo dmsetup remove dmp1
- Удалите устройство
zero1:Важно: Всегда удаляйте устройства, зависящие от других (например,sudo dmsetup remove zero1
dmp1), до удаления нижележащих устройств (zero1). - Выгрузите модуль ядра:
Проверьте, что модуль выгружен:
sudo rmmod dmp
lsmod | grep dmp. - Проверьте, что sysfs записи модуля удалены:
Должна быть ошибка "No such file or directory", так как каталог модуля удаляется при выгрузке.
ls -l /sys/module/dmp
Данный проект распространяется под лицензией MIT.
Козырев Михаил