Настраиваем Device Mapper Multipathing в CentOS Linux 7.2 для FC HBA при подключении к СХД HP 3PAR 7200 (3PAR OS v. 3.2.2)

imageВ этой заметке будет рассмотрен пример того, как настроить многоканальное (Multipath) подключение оптических хост-контроллеров (FC HBA) Emulex/QLogic, установленных в сервере на базе ОС CentOS Linux 7.2, к системе хранения данных (СХД) HP 3PAR 7200 (версия firmware 3PAR OS - 3.2.2). Для настройки multipath в CentOS мы будем использовать возможности модуля ядра Linux - dm-multipath (Device Mapper Multipath, DM Multipath).

Онлайн документация по DM Multipath, доступная на сайте CentOS.org по сути дублирует документацию с сайта RedHat и является уже устаревшей. Более актуальную версию (для 7 ветки RHEL) можно найти на сайте RedHat. Если с английским языком есть сложности, то для общего понимания первично можно заглянуть в переведённое на русский язык руководство для RHEL 6.

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

Процитирую документацию для того, чтобы отразить основные компоненты DM Multipath:

  • dm-multipath (модуль ядра) - Перенаправляет ввод-вывод и обеспечивает
    отказоустойчивость маршрутов и их групп.
  • multipathd (служба) - Следит за маршрутами, инициализирует переключение групп маршрутов и позволяет изменять устройства интерактивно. Чтобы изменения в /etc/multipath.conf вступили в силу, необходим перезапуск этой службы.
  • mpathconf (утилита) - Используется для настройки и активации многоканальных
    возможностей.
  • multipath (утилита) - Возвращает список многоканальных устройств и позволяет их
    настроить. Запускается с помощью /etc/rc.sysinit или во время добавления блочного устройства при помощи udev.
  • kpartx (утилита) - Создает многоканальные устройства для разделов DOS с DM Multipath. kpartx предоставляется в виде отдельного пакета и требуется для установки device-mapper-multipath.

Модуль ядра dm-multipath поставляется вместе с системой CentOS

image

Утилита multipath и служба multipathd входят в состав пакета device-mapper-multipath, который мы установим позже.

image

Порядок настройки

Базовый сценарий настройки DM Multipath подразумевает следующие шаги:

  1. Установка пакета device-mapper-multipath.
  2. Создание конфигурационного файла multipath.conf с помощью утилиты mpathconf и его редактирование (при необходимости).
  3. Запуск службы multipathd.

Помимо этих действий мы выполним рекомендации данные производителем СХД. В нашем случае придётся взять на вооружение документ HPE 3PAR Red Hat Enterprise Linux and Oracle Linux Implementation Guide (emr_na-c04448818-9.pdf), с учётом которого последовательность наших действий будет выглядеть следующим образом:

  1. Тюнинг драйверов FC HBA
  2. Зонирование фабрик SAN и СХД
  3. Установка и настройка DM Multipath (3 шага базового сценария)
  4. Разметка диска (опционально)
Тюнинг драйверов FC HBA

Документация рекомендует нам выполнить тюнинг драйверов хост-контроллеров с указанием конкретных предложенных параметров в файле /etc/modprobe.d/modprobe.conf с последующей пересборкой образа initramfs

Для контроллеров QLogic строка параметров тюнинга выглядит так:

options qla2xxx ql2xmaxqdepth=16 qlport_down_retry=14

Для контроллеров Emulex строка параметров тюнинга выглядит так:

options lpfc lpfc_devloss_tmo=14 lpfc_lun_queue_depth=16 lpfc_discovery_threads=32

Для контроллеров Brocade тюнинг выполняется отдельной командой:

# bcu fcpim --pathtov 1/0 14

Обратите внимание на то, что указанные опции драйвера справедливы только для прошивки 3PAR OS версии 3.1.1 и новее. Для старых версий 3PAR OS параметры будут несколько иные и их можно найти в ранее упомянутом документе.

В нашем случае используются только контроллеры QLogic и Emulex, поэтому сразу добавим параметры для обоих этих драйверов в файл /etc/modprobe.d/modprobe.conf (если файл в системе отсутствует, то его нужно создать):

# QLogic HBA driver tuning for HP 3PAR Storage
options qla2xxx ql2xmaxqdepth=16 qlport_down_retry=14
# Emulex HBA driver tuning for HP 3PAR Storage
options lpfc lpfc_devloss_tmo=14 lpfc_lun_queue_depth=16 lpfc_discovery_threads=32

image

Кстати, с помощью утилиты modinfo мы можем посмотреть краткое описание изменяемых параметров:

image

Теперь нужно пересобрать образ initramfs. Для этого сначала сделаем резервную копию текущего используемого образа для текущей версии ядра, затем вызовем команду пересборки нового образа, в процессе чего будет учтён добавленный нами файл modprobe.conf:

# cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
# /sbin/dracut -v --force

После того, как последняя команда отработает, перезагружаем сервер и убеждаемся в том, что система успешно загружается с новыми тюнингованными параметрами драйверов HBA. Для того, чтобы проверить то, что модуль с драйвером загружен именно с заданными нами параметрами можно использовать проверку файлов /sys/module/<module>/parameters/*

image

или же можно воспользоваться утилитой systool из пакета sysfsutils:

# systool -m {имя модуля} -A {имя атрибута}

image

Зонирование фабрик SAN и СХД

В данный момент наш сервер ничего не видит через свой контроллер FC HBA, так как нам ещё нужно настроить зонирование на оптических коммутаторах (фабриках) SAN и СХД:

# cat /proc/scsi/scsi

Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: HL-DT-ST Model: RW/DVD GCC-C10N  Rev: 2.00
  Type:   CD-ROM                           ANSI  SCSI revision: 05

Для настройки зонирования нам потребуется информация о идентификаторах WWN. Идентифицировать контроллеры HBA в Linux можно разными способами. В частности, чтобы быстро узнать Node WWN, выполним:

# cat /sys/class/fc_host/host*/node_name

0x500143800200c205
0x500143800200c205

Чтобы узнать Port WWN, выполним:

# cat /sys/class/fc_host/host*/port_name

0x500143800200c204
0x500143800200c206

Дополнительные примеры идентификации FC HBA можно посмотреть в Вики-статье Как идентифицировать контроллеры FC HBA в CentOS Linux.

Настройку зонирования на оптических коммутаторах и СХД в данной заметке мы рассматривать не будем. Сделаю только одно важное замечание по настройке зонирования в СХД HP 3PAR 7200. При создании записи о хосте на СХД в поле Host OS выбираем наиболее близкую к нам ОС, таким образом, чтобы атрибут Persona был определён как  2-Generic-ALUA (согласно стр.12 используемого нами руководства это рекомендуемый вид для RHEL7).

image

Итак, предполагается, что зонирование сделано, и теперь наш сервере с CentOS 7.2 уже имеет доступ к дискам через HBA. Заставим систему обновить информацию о подключенных дисках методом описанным здесь:

# ls -la /sys/class/scsi_host/
# echo "- - -" > /sys/class/scsi_host/host[0-9]/scan

image

После этого посмотрим, какие устройства видит наш сервер:

# cat /proc/scsi/scsi

image

В нашем случае после зонирования SAN сервер увидел презентованный с 3PAR дисковый том (3PARdata Model: VV) доступный по 4 путям.

Установка и настройка DM Multipath

Устанавливаем пакет device-mapper-multipath

# yum install device-mapper-multipath

После установки нужно настроить основной конфигурационный файл /etc/multipath.conf, которого по умолчанию не существует. Чтобы создать этот файл в конфигурации "по умолчанию" можно воспользоваться утилитой mpathconf:

# mpathconf --enable

Без учёта комментариев, создаваемый файл multipath.conf по умолчанию будет иметь следующее содержимое:

defaults {
        user_friendly_names yes
        find_multipaths yes
}
blacklist {
}

Как я понял, до версии RHEL/CentOS 6 не существовало параметра автоматической настройки find_multipaths и поэтому устройства, подлежащие включению/исключению из механизма multipath,  приходилось всегда прописывать в файле multipath.conf в ручную. В современной версии RHEL/CentOS всё несколько упрощено. Цитата по этому поводу из документации:

В Red Hat Enterprise Linux 6 появился новый способ настройки многоканальных устройств с
помощью параметра find_multipaths. Раньше устройства создавались для всех путей, не
внесенных в черный список. Теперь, если параметр find_multipaths имеет значение yes,
метаустройство будет создано только в одном из следующих случаев:
* Существует по крайней мере два пути с одним и тем же WWID, не указанных в списке
исключений.
* Пользователь создает устройство вручную с помощью multipath.
* Путь имеет тот же WWID что и созданное ранее метаустройство (даже если это
устройство в настоящий момент уже не существует). Раздел 4.2, «Секция blacklist»
объясняет, что делать, если многоканальные устройства были созданы, в то время как
параметр find_multipaths не был определен.

Поэтому, наверняка, в большинстве случаев можно оставить предложенный по умолчанию файл multipath.conf. Что ж, попробуем…

Выполняем запуск службы multipathd и после этого выполняем команду вывода информации о топологи multipath:

# service multipathd start 
# multipath -ll

В нашем случае из вывода последней команды стало понятно, что, во-первых, не смотря на параметр find_multipaths yes, DM Multipath пытается обработать multipath для локального логического диска cciss/c0d0 с контроллера HP Smart Array P400i, на котором установлена сама CentOS 7.2 (это также хорошо видно в выводе команды multipath -v3), а во-вторых multipath с настройками по умолчанию таки смог собрать мультиканальное устройство используя все 4 пути до СХД:image

Добавим регулярное выражение определяющее любые диски с контроллера Smart Array в секцию blacklist в конфигурационном файле multipath.conf.

...
blacklist {
       devnode "^cciss\/c[0-9]d[0-9]*" 
}
...

Кстати довольно странно, что в уважаемых источниках, например здесь или здесь можно встретить пример неработающего регулярного выражения для определения дисков с контроллера Smart Array. Но наш вариант рабочий:

image

А чтобы более правильно настроить DM Multipath на работу СХД 3PAR, всё таки нам придётся воспользоваться точной настройкой файла multipath.conf в соответствии с рекомендацией из руководства HP, согласно которой, настройки конфигурации под хост ALUA Persona 2 (а мы помним, что именно этот тип выбран при создании записи о нашем сервере на СХД 3PAR) имеют свои особенности. В итоге результирующий файл в нашем случае примет следующий вид:

defaults {
    polling_interval 10
    user_friendly_names no
    find_multipaths yes
}
blacklist {
    devnode "^cciss\/c[0-9]d[0-9]*" 
} 
devices {
    device {
        vendor "3PARdata"
        product "VV"
        path_grouping_policy group_by_prio
        path_selector "round-robin 0"
        path_checker tur
        features "0"
        hardware_handler "1 alua"
        prio alua
        failback immediate
        rr_weight uniform
        no_path_retry 18
        rr_min_io_rq 1
        detect_prio yes
    }
}

Для вступления в силу изменений конфигурационного файла выполним перезапуск службы multipathd:

# service multipathd restart

Теперь снова проверим состояние multipath:

# multipath -ll

image

Теперь видно, что наше multipath-устройство работает с другими настройками, а предупреждений по поводу локального контроллера Smart Array нет.

Разметка диска (опционально)

Описанные в данном разделе действия по разметке multipath-диска являются опциональными, и приведены исключительно для примера. Предположим, что нам нужно создать раздел диска с файловой системой ext4 размером всего multipath-диска.

Как видно на предыдущем скриншоте, наш multipath-диск в системе доступен по 4 путям в виде равнозначных устройств /dev/sda, /dev/sdb, /dev/sdc, /dev/sdd. Выполнить разметку можно на любом из этих устройств, но нельзя выполнять эту операцию обращаясь к устройству как к multipath-диску через /dev/mapper/* (об этом в руководстве сделано отдельное замечание). Для разметки воспользуемся утилитой parted, все действия будем выполнять на любом из дисков, например /dev/sdd. Пошагово процедуру разметки диска с помощью parted я рассматривал в статье Вики, поэтом здесь приведу лишь последовательный набор команд:

# parted /dev/sdd 

(parted) mklabel gpt
(parted) mkpart primary 0% 100%
(parted) quit

image

В документации отдельное внимание обращается на то, что при создании раздела диска нужно выбрать оптимальную конфигурацию для 3PAR, а именно учесть то, что раздел должен начинаться с сектора 32768. Это нужно учесть, если для разметки диска вы используете утилиту fdisk, которая по умолчанию начальным сектором устанавливает 30876, что в последствии, как я понял, может отрицательно сказаться на производительности будущего дискового раздела в Linux. Поэтому я и использую утилиту parted, которая по умолчанию при создании раздела использует правильный, с точки зрения 3PAR, начальный сектор.

image

В случае, если вы всё же для создания раздела будете использовать утилиту fdisk, то вызывать её нужно с соответствующими ключами (пример взят из документации и мной не проверялся):

# fdisk -c -u /dev/sdd

Command (m for help): p
Partition number (1-4): 1
First sector (32768-10485759, default 32768):
Using default value 32768
...

Далее созданный раздел диска нам нужно добавить к мультиканальным устройствам в /dev/mapper/. Для этого используем утилиту kpartx и ID корневого multipath-диска. ID видно как в выводе утилиты multipath, так и собственно в каталоге /dev/mapper/

image

Выполним команду добавления раздела в /dev/mapper/:

# kpartx -a -p p /dev/mapper/360002ac000000000000000160000cec9

После этого появится новое multipath-устройство (360002ac000000000000000160000cec9p1), олицетворяющее собой ранее созданный нами раздел на корневом multipath-диске (360002ac000000000000000160000cec9).

image

Форматируем multipath-раздел в нужную нам файловую систему, например ext4:

# mkfs.ext4 -E nodiscard /dev/mapper/360002ac000000000000000160000cec9p1

Монтируем раздел:

# mkdir /mnt/3par-vv1
# mount -t ext4 -o discard /dev/mapper/360002ac000000000000000160000cec9p1 /mnt/3par-vv1

Теперь пропишем в файл /etc/fstab информацию для автоматического монтирования multipath-раздела в точку монтирования /mnt/3par-vv1. Для этого сначала узнаем UUID раздела:

# blkid /dev/mapper/360002ac000000000000000160000cec9p1

image

Потом добавим информацию о монтировании в конец файла /etc/fstab

...
# mount backup disk /dev/mapper/360002ac000000000000000160000cec9p1 on /mnt/3par-vv1
UUID=2697868a-88fd-4867-879d-629830186637 /mnt/3par-vv1 ext4 discard,defaults 0 2

После этого перезагружаем сервер и убеждаемся в том, что конечный результата достигнут и multipath-раздел автоматически монтируется в точку монтирования /mnt/3par-vv1

image

image

Пробуем создать новый пустой файл в смонтированном в каталог разделе, проверяя тем самым возможность записи в этот каталог. Затем пробуем удалить созданный файл:

# touch /mnt/3par-vv1/write-test.txt
# rm /mnt/3par-vv1/write-test.txt
Замечание. Multipath в кластерных конфигурациях

Если сервер, на котором мы настраиваем multipath, в дальнейшем будет использоваться в качестве узла кластера с общим дисковым хранилищем, то для возможно потребуется обеспечить то, чтобы все узлы кластера имели одинаковые настройки multipath. Для этого можно использовать механизм алиасов. В таком случае для каждого multipath-устройства можно задать опцию alias в секции multipaths конфигурационного файла multipath.conf, например:

multipaths {
       multipath {
               wwid    3600508b4000156d700012000000b0000
               alias   yellow
       }
       multipath {
               wwid    1DEC_____321816758474
               alias   red
       }
}

Настройку алиасов имеет смысл делать лишь в том случае, если в секции defaults значение параметра user_friendly_names равно yes. Дополнительную информацию об этом можно найти здесь: Consistent Multipath Device Names in a Cluster.


Дополнительные источники информации:

Всего комментариев: 8 Комментировать

  1. andrei /

    Можно еще гайдик ))) по настройке сетевых интерфейсов - network teaming + создания сетевых интрефейсов c vlan при условии серверу выделен trunk?
    Кстати при сборке network teaming, yасколько понял в rhe 7 появился новый модуль team введен для полной поддержки протокола LACP, теперь работает в режиме active-active, в отличие от bond
    https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec-Comparison_of_Network_Teaming_to_Bonding.html

    1. Алексей Максимов / Автор записи

      Да Team выглядит интересно. Не уверен, что в ближайшее время получится с этим поиграться, но вопрос, безусловно, заслуживает внимания. Спасибо за наводку.

  2. Иван /

    как сделать так чтоб fdisk -l показывал правильную картину.. сейчас вываливает все диски какие есть и не раз

  3. Обратная ссылка: Развёртывание и настройка oVirt 4.0. Часть 1. Создание кластера виртуализации в конфигурации Hosted Engine | Блог IT-KB /

  4. Лаврентий /

    Спасибо! Получилось. Но почему-то в я теперь вижу мой формаченый готовый диск. Но я также вижу диска по 4 путям мультипаса. Разве они должны отображаться?

    1. Алексей Максимов / Автор записи

      А что Вас смущает? Почему диски не должны отображаться? Разве от того, что Вы собрали из них Multipath-устройства они перестали быть дисками? Или Вы ждали эффекта, как в диспетчере устройств Windows ? :)

  5. Александр /

    Спасибо огромное за статью

  6. Антон /

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

Добавить комментарий