Skip to content

Device-mapper и DM-multipath

В статье про настройку iSCSI LUN на NetApp была затронута тема многоканальности (multipathing). Напомню, что это побочное явления использования нескольких физических каналов между целевым сетевым хранилищем данных (СХД) и сервером-инициатором, свойственное всем блочным протоколам. При наличии нескольких путей до инициатора, презентованный ему LUN (Logical Unit Number) будет виден столько раз, сколько существует путей. Поэтому прибегают к помощи вспомогательных средств для группирования всех этих «фантомных» LUN в единственный. В Windows это делается средствами MPIO, в Linux – демоном multipathd, который является компонентом device-mapper, именно о последних двух и пойдет речь в данной статье.

Device-Mapper

Device-mapper является частью ядра Linux, и основным его назначением является трансляция (mapping) одного блочного устройства в другое. На основе device-mapper строятся такие системы как LVM2, софтовый RAID и др. Device-mapper представляет некое "виртуальное" блочное устройство, и все данные, которые проходят через него, он посылает на другое, уже "реальное" блочное устройство.

Это виртуальное блочное устройство представляет собой таблицу, в которой описывается проброс каждого логического блока этого устройства на реальные физические блочные устройства.

При ссылке на «реальное» блочное устройство DM может использовать как его имя, отображаемое в файловой системе (/dev/sda), так и старший (major) и младший (minor) номера устройства в формате major:minor.

Общий вид строки в таблице преобразования:

start length type device offset

где:

  • start – начальный блок виртуального устройства
  • length – длина сегмента
  • type – тип преобразования. Бывают: linear, striped (позволяет пробрасывать виртуальное устройство на несколько физических), mirror, snapshot (используется для создания снимка тома диска), error, zero, multipath, crypt
  • device – название физического устройства
  • offset – отступ в физическом устройстве

Пример строки линейного преобразования с 0-го блока виртуального устройства, сегмента длиною 1638400 в физическое устройство со старшим номером 8, младшим номером 2 и отступом на нем в 41146992.

0 16384000 linear 8:2 41156992

В зависимости от типа преобразования в строке могут появляться дополнительные параметры.

При создании снимка тома диска средствами LVM используются четыре устройства Device Mapper:

  1. Устройство с linear-типом, хранящее первоначальную таблицу преобразования тома.
  2. Устройство с linear-типом для использования в качестве Copy-on-Write устройства – перед каждой записью на том, первоначальные данные будут сохраняться на CoW устройстве.
  3. Устройство со snapshot-типом хранящую таблицу преобразования из комбинаций первого и второго устройств и видного, как снимок, тома.
  4. "Первоначальный" том (использующий номер устройства первоначального тома источника) чья таблица преобразования заменяется на snapshot-mapping из первого устройства.

Пример создания LVM тома BASE и snapshot-подтома SNAP на этом томе

lvcreate -L 1G -n base volumeGroup
lvcreate -L 100M --snapshot -n snap volumeGroup/base

Что в свою очередь создает четыре устройства, которые можно посмотреть

dmsetup table|grep volumeGroup

volumeGroup-base-real: 0 2097152 linear 8:19 384
volumeGroup-snap-cow: 0 204800 linear 8:19 2097536
volumeGroup-snap: 0 2097152 snapshot 254:11 254:12 P 16
volumeGroup-base: 0 2097152 snapshot-origin 254:11

ls -lL /dev/mapper/volumeGroup-\*

brw------- 1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real
brw------- 1 root root 254, 12 29 ago 18:15 /dev/mapper/volumeGroup-snap-cow
brw------- 1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap
brw------- 1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base

Device-Mapper Multipath

Device mapper multipath (DM-Multipath) позволяет сгруппировать несколько путей между сервером и хранилищем (multipathing — многоканальность) в одно устройство.

При настройке активный/пассивный многоканальность позволяет избежать прерывания в работе при выходе из строя одного из путей (кабеля, свитча, контроллера). В этом режиме используется только половина путей.

При настройке активный/активный задействуются все доступные пути по карусельному алгоритму

active-passive

active-active

Идентификаторы многоканальных устройств

Каждой многоканальное устройство (СХД) имеет т.н. World Wide Identifier (WWID), уникальный глобальный идентификатор. На его основании и делается предположение, о единстве LUN, доступного по множеству путей.

Например, сервер с двумя HBA (адаптер для подключения к FC сети) подключенный через FC свитч к СХД с двумя портами, при презентации ему одного LUN на этой СХД увидит четыре устройства: /dev/sda, /dev/sdb, dev/sdc, и /dev/sdd. DM-Multipath создаст одно "виртуальное" устройство с уникальным WWID.

Создаваемые DM-Multipath «виртуальные» устройства находятся в двух местах:

  • /dev/mapper – каталог, используемый непосредственно для создания логических томов;
  • /dev/dm-n устройства, используемые системой для внутренних нужд.

После создания виртуальных устройств средствами DM-Multipath можно приступить к созданию физических томов LVM (Physical volume LVM). Стоить отметить, что использование LVM необязательно и можно форматировать виртуальные устройства fdiskом, но это крайне не рекомендуется, т.к. внесет еще большую сумятицу.

RedHat отмечает, что для создания физических томов LVM на диске не должно быть разделов. При создании логических томов LVM (Logical volume LVM) на СХД, подключенных несколькими путями по схеме активный/пассивный необходимо отредактировать файл настроек LVM (/etc/lvm.conf) для исключения дисков на которые ссылаются "виртуальные" устройства, созданные DM-Pathing. Чтобы это сделать, достаточно внести фильтр все SCSI устройств в файл lvm.conf:

filter = [ "r/block/", "r/disk/", "r/sd.*/", "a/.*/" ]

Компоненты DM-Multipath

  • dm_multipath – модуль ядра
  • mpathconf – утилита для настройки многоканальности
  • multipath – утилита для отображения и настройки многоканальных устройств
  • multipathd – демон, следящий за доступностью путей
  • kpartx – утилита создает «виртуальные» устройства для DOS-разделов

Процесс подготовки DM-Multipath на RedHat/CentOS

  1. Установка device-mapper-multipath пакета.
  2. Изменение настроек по умолчанию в файле /etc/multipath.conf на необходимые. По умолчанию DM-Multipath включает в себя настройки для большинства СХД таким образом, что при его работе виртуальные устройства будут называться опознаваемо.
  3. Запуск демона multipathd

Установка и настройка Device Mapper Multipath для NetApp

  1. Проверяем наличие установленных пакетов DM и DM-Multipath

    rpm -q device-mapper
    rpm -q device-mapper-multipath
    

    И устанавливаем device-mapper-multipath из репозитория вашей ОС, если его нет. 2. Редактируем /etc/multipath.conf и приводим его к желаемому виду

    Конфигурационный файл DM-Multipath состоит из сл. секций:

    • blacklist – список игнорируемых устройств (по wwid и/или по имени устройства (devnode))
    • blacklist_exceptions – список исключений из списка игнора
    • defaults – общие настройки
    • multipaths – список устройств с особыми настройками (имеет приоритет над defaults и devices)
    • devices – настройки отдельных СХД с подсекциями для каждой из них (имеет приоритет над defaults)

    Примеры multipath.conf для NetApp и RedHat различных версий

    • RedHat 6 with ALUA defaults { user_friendly_names no max_fds max flush_on_last_del yes queue_without_daemon no } blacklist { devnode "^hd[a-z]" devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*" devnode "^cciss.*" } devices { device { vendor "NETAPP" product "LUN" path_grouping_policy group_by_prio features "1 queue_if_no_path" prio "alua" path_checker directio failback immediate path_selector "round-robin 0" hardware_handler "1 alua" rr_weight uniform rr_min_io 128 getuid_callout "/lib/udev/scsi_id -g -u -d /dev/%n" } }
    • RedHat 5 Update 7 with ALUA defaults { user_friendly_names no queue_without_daemon no flush_on_last_del yes max_fds max pg_prio_calc avg } blacklist { devnode "^hd[a-z]" devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*" devnode "^cciss.*" } devices { device { vendor "NETAPP" product "LUN" path_grouping_policy group_by_prio features "1 queue_if_no_path" prio_callout "/sbin/mpath_prio_alua /dev/%n" path_checker directio path_selector "round-robin 0" failback immediate hardware_handler "1 alua" rr_weight uniform rr_min_io 128 getuid_callout "/sbin/scsi_id -g -u -s /block/%n" } }
    • RedHat 5 Update 7 without ALUA defaults { user_friendly_names no queue_without_daemon no flush_on_last_del yes max_fds max pg_prio_calc avg } blacklist { devnode "^hd[a-z]" devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*" devnode "^cciss.*" } devices { device { vendor "NETAPP" product "LUN" path_grouping_policy group_by_prio features "1 queue_if_no_path" prio_callout "/sbin/mpath_prio_ontap /dev/%n" path_checker directio path_selector "round-robin 0" failback immediate hardware_handler "0" rr_weight uniform rr_min_io 128 getuid_callout "/sbin/scsi_id -g -u -s /block/%n" } }

    Примечания к файлу multipath.conf: В NetApp ALUA используется: для Cluster-Mode на протоколах FC, FCoE и iSCSI, для 7-Mode на протоколах FC и FCoE. Соответственно, в зависимости от того, поддерживается ли ALUA, устанавливаем (на RedHat 6)

    Параметр Значение
    prio "alua" если поддерживается
    prio "ontap" если не поддерживается
  2. Загружаем модуль ядра

    modprobe dm-multipath
    
  3. Запускаем демон multipathd

    /etc/init.d/multipathd start
    
  4. Просматриваем список многоканальных устройств

    multipath -v2
    

    Параметры для утилиты multipath

    Параметр Значение
    -v2 уровень многословности равный двум
    -ll отобразить параметры multipath собранные со всех уголков системы
    -f <device> удалить указанное многоканальное устройство
    -F удалить все неиспользуемые многоканальные устройства
  5. Можно просмотреть вендора и модель СХД

    cat /sys/block/sdX/device/vendor
    cat /sys/block/sdX/device/model
    
  6. Просматриваем состояние:

    dmsetup ls --target=multipath
    multipath -ll
    
  7. Создаем физический том LVM (Physical volume LVM)

    pvcreate /dev/mapper/<WWID>
    
  8. Создаем группу томов LVM

    vgcreate VG01 /dev/mapper/<WWID>
    
  9. Создаем логический том LVM (Logical volume LVM)

    lvcreate -L 25G -n LV01 VG01
    
  10. Создаем файловую систему

    mkfs.ext3 /dev/VG01/LV01
    

Источник 1

Источник 2

Источник 3

Источник 4

Источник 5

Источник 6

Источник 7