Skip to content

Mkz-Prog/dmp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Device Mapper Proxy Target (dmp)

Описание

Этот проект реализует загружаемый модуль ядра Linux, который функционирует как Device Mapper таргет. Модуль создает виртуальное блочное устройство поверх существующего нижележащего устройства и перехватывает все операции ввода-вывода (чтение и запись) к этому виртуальному устройству.

Основная функциональность модуля:

  1. Перенаправление I/O запросов на нижележащее устройство.
  2. Сбор статистики по выполненным операциям (количество запросов и суммарный размер данных).
  3. Предоставление агрегированной статистики через интерфейс 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

Сборка модуля

  1. Клонируйте репозиторий или скачайте исходные файлы.

  2. Перейдите в каталог с исходными файлами в терминале.

  3. Выполните команду make:

    make

    Это соберет модуль ядра dmp.ko. В процессе сборки может быть выведено много информации, но в конце убедитесь, что нет сообщений об ошибках.

Установка модуля

После успешной сборки модуль готов к загрузке в ядро. Важно: Для выполнения этих команд требуются права суперпользователя (sudo).

  1. Убедитесь, что вы находитесь в каталоге с файлом dmp.ko.

  2. Загрузите модуль:

    sudo insmod dmp.ko
  3. Проверьте, что модуль успешно загружен:

    lsmod | grep dmp

    Если модуль загружен, вы увидите строку с именем dmp в выводе.

  4. Проверьте лог ядра (dmesg), чтобы увидеть сообщения об инициализации модуля:

    dmesg | tail

    Ищите сообщения, начинающиеся с dm-dmp:.

Тестирование модуля

Тестирование выполняется с использованием утилиты dmsetup для создания device mapper устройств и dd для выполнения операций ввода-вывода, как описано в задании.

  1. Создайте тестовое нижележащее блочное устройство (zero1): Мы используем стандартный таргет zero для создания простого виртуального устройства размером 1MB (2048 секторов по 512 байт).
    sudo dmsetup create zero1 --table "0 2048 zero"
  2. Устройство zero1 должно успешно создаться: Проверьте его наличие в /dev/mapper/:
    ls -l /dev/mapper/zero1
  3. Создайте наше 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 - смещение на нижележащем устройстве.
  4. Устройство dmp1 должно успешно создаться: Проверьте его наличие в /dev/mapper/:
    ls -l /dev/mapper/dmp1
  5. Проверьте 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
    
  6. Выполните операции на запись и чтение на 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).
  7. Проверьте обновленную статистику: Снова прочитайте sysfs файл /sys/module/dmp/stat/volumes:
    cat /sys/module/dmp/stat/volumes
    Статистика должна отражать выполненные операции dd. Например:
    read:
      reqs: 5
      avg size: 8192
    write:
      reqs: 10
      avg size: 4096
    total:
      reqs: 15
      avg size: 5461
    
    (Значения "avg size" могут немного отличаться в зависимости от точности вычислений и особенностей I/O в вашей системе).

Очистка

После завершения тестирования необходимо удалить созданные device mapper устройства и выгрузить модуль.

  1. Удалите устройство dmp1:
    sudo dmsetup remove dmp1
  2. Удалите устройство zero1:
    sudo dmsetup remove zero1
    Важно: Всегда удаляйте устройства, зависящие от других (например, dmp1), до удаления нижележащих устройств (zero1).
  3. Выгрузите модуль ядра:
    sudo rmmod dmp
    Проверьте, что модуль выгружен: lsmod | grep dmp.
  4. Проверьте, что sysfs записи модуля удалены:
    ls -l /sys/module/dmp
    Должна быть ошибка "No such file or directory", так как каталог модуля удаляется при выгрузке.

Лицензия

Данный проект распространяется под лицензией MIT.

Автор

Козырев Михаил

About

No description, website, or topics provided.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors